From 55031e72e6c02b4ae63e9052bad1a4b40002ac18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Mon, 1 Dec 2014 12:15:48 +0100 Subject: Imported Upstream version 1.8.15 --- lib/Makefile.in | 252 +++-- lib/dimm_spd.c | 171 ++- lib/helper.c | 1 + lib/hpm2.c | 4 +- lib/ipmi_delloem.c | 99 +- lib/ipmi_ekanalyzer.c | 2900 ++++++++++++++++++++++++------------------------- lib/ipmi_fru.c | 3 +- lib/ipmi_fwum.c | 4 +- lib/ipmi_hpmfwupg.c | 29 +- lib/ipmi_kontronoem.c | 1257 ++++++++++----------- lib/ipmi_main.c | 4 +- lib/ipmi_picmg.c | 12 +- lib/ipmi_sel.c | 4 +- lib/ipmi_sensor.c | 84 +- lib/ipmi_sol.c | 44 +- lib/ipmi_tsol.c | 330 +++--- 16 files changed, 2668 insertions(+), 2530 deletions(-) (limited to 'lib') diff --git a/lib/Makefile.in b/lib/Makefile.in index 0925a1f..96e8ae8 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -46,6 +45,51 @@ # EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -66,9 +110,10 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = lib -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -87,29 +132,78 @@ am_libipmitool_la_OBJECTS = helper.lo ipmi_sdr.lo ipmi_sel.lo \ ipmi_gendev.lo ipmi_ime.lo ipmi_delloem.lo ipmi_dcmi.lo \ hpm2.lo md5.lo libipmitool_la_OBJECTS = $(am_libipmitool_la_OBJECTS) -libipmitool_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libipmitool_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libipmitool_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libipmitool_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(libipmitool_la_SOURCES) DIST_SOURCES = $(libipmitool_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARCH = @ARCH@ AUTOCONF = @AUTOCONF@ @@ -306,14 +400,17 @@ $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + libipmitool.la: $(libipmitool_la_OBJECTS) $(libipmitool_la_DEPENDENCIES) $(EXTRA_libipmitool_la_DEPENDENCIES) - $(libipmitool_la_LINK) $(libipmitool_la_OBJECTS) $(libipmitool_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(libipmitool_la_LINK) $(libipmitool_la_OBJECTS) $(libipmitool_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -359,32 +456,32 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< md5.lo: ../src/plugins/lan/md5.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT md5.lo -MD -MP -MF $(DEPDIR)/md5.Tpo -c -o md5.lo `test -f '../src/plugins/lan/md5.c' || echo '$(srcdir)/'`../src/plugins/lan/md5.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/md5.Tpo $(DEPDIR)/md5.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../src/plugins/lan/md5.c' object='md5.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT md5.lo -MD -MP -MF $(DEPDIR)/md5.Tpo -c -o md5.lo `test -f '../src/plugins/lan/md5.c' || echo '$(srcdir)/'`../src/plugins/lan/md5.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/md5.Tpo $(DEPDIR)/md5.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../src/plugins/lan/md5.c' object='md5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o md5.lo `test -f '../src/plugins/lan/md5.c' || echo '$(srcdir)/'`../src/plugins/lan/md5.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o md5.lo `test -f '../src/plugins/lan/md5.c' || echo '$(srcdir)/'`../src/plugins/lan/md5.c mostlyclean-libtool: -rm -f *.lo @@ -392,26 +489,15 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -423,15 +509,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -440,6 +522,21 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags @@ -582,18 +679,19 @@ uninstall-am: .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/lib/dimm_spd.c b/lib/dimm_spd.c index 1f27de2..91ae117 100644 --- a/lib/dimm_spd.c +++ b/lib/dimm_spd.c @@ -63,10 +63,11 @@ const struct valstr spd_memtype_vals[] = { { 0x09, "DDR2 SDRAM FB-DIMM" }, { 0x0A, "DDR2 SDRAM FB-DIMM Probe" }, { 0x0B, "DDR3 SDRAM" }, + { 0x0C, "DDR4 SDRAM" }, { 0x00, NULL }, }; -const struct valstr ddr3_density_vals[] = +const struct valstr ddr3_density_vals[] = { { 0, "256 Mb" }, { 1, "512 Mb" }, @@ -87,6 +88,8 @@ const struct valstr ddr3_banks_vals[] = { 0x00, NULL }, }; + +#define ddr4_ecc_vals ddr3_ecc_vals const struct valstr ddr3_ecc_vals[] = { { 0, "0 bits" }, @@ -94,6 +97,62 @@ const struct valstr ddr3_ecc_vals[] = { 0x00, NULL }, }; +const struct valstr ddr4_density_vals[] = +{ + { 0, "256 Mb" }, + { 1, "512 Mb" }, + { 2, "1 Gb" }, + { 3, "2 Gb" }, + { 4, "4 Gb" }, + { 5, "8 Gb" }, + { 6, "16 Gb" }, + { 7, "32 Gb" }, + { 0x00, NULL }, +}; + +const struct valstr ddr4_banks_vals[] = +{ + { 0, "2 (4 Banks)" }, + { 1, "3 (8 Banks)" }, + { 0x00, NULL }, +}; + +const struct valstr ddr4_bank_groups[] = +{ + { 0, "0 (no Bank Groups)" }, + { 1, "1 (2 Bank Groups)" }, + { 2, "2 (4 Bank Groups)" }, + { 0x00, NULL }, +}; + +const struct valstr ddr4_package_type[] = +{ + { 0, "Monolithic DRAM Device" }, + { 1, "Non-Monolithic Device" }, + { 0x00, NULL }, +}; + +const struct valstr ddr4_technology_type[] = +{ + { 0, "Extended module type, see byte 15" }, + { 1, "RDIMM" }, + { 2, "UDIMM" }, + { 3, "SO-DIMM" }, + { 4, "LRDIMM" }, + { 5, "Mini-RDIMM" }, + { 6, "Mini-UDIMM" }, + { 7, "7 - Reserved" }, + { 8, "72b-SO-RDIMM" }, + { 9, "72b-SO-UDIMM" }, + { 10, "10 - Reserved" }, + { 11, "11 - Reserved" }, + { 12, "16b-SO-DIMM" }, + { 13, "32b-SO-DIMM" }, + { 14, "14 - Reserved" }, + { 15, "No base memory present" }, + { 0x00, NULL }, +}; + const struct valstr spd_config_vals[] = { { 0x00, "None" }, { 0x01, "Parity" }, @@ -800,6 +859,92 @@ ipmi_spd_print(uint8_t *spd_data, int len) printf( "%c", *pchPN++ ); } printf("\n"); + } else if (spd_data[2] == 0x0C) /* DDR4 SDRAM */ + { + int i; + int sdram_cap = 0; + int pri_bus_width = 0; + int sdram_width = 0; + int mem_size = 0; + int lrank_dimm; + + if (len < 148) + return -1; /* we need first 91 bytes to do our thing */ + + /* "Logical rank" referes to the individually addressable die + * in a 3DS stack and has no meaning for monolithic or + * multi-load stacked SDRAMs; however, for the purposes of + * calculating the capacity of the module, one should treat + * monolithic and multi-load stack SDRAMs as having one logical + * rank per package rank. + */ + lrank_dimm = (spd_data[12]>>3&0x3) + 1; /* Number of Package Ranks per DIMM */ + if ((spd_data[6] & 0x3) == 0x10) { /* 3DS package Type */ + lrank_dimm *= ((spd_data[6]>>4)&0x3) + 1; /* Die Count */ + } + sdram_cap = ldexp(256,(spd_data[4]&15)); + pri_bus_width = ldexp(8,(spd_data[13]&7)); + sdram_width = ldexp(4,(spd_data[12]&7)); + mem_size = (sdram_cap/8) * (pri_bus_width/sdram_width) * lrank_dimm; + printf(" SDRAM Package Type : %s\n", val2str((spd_data[6]>>7), ddr4_package_type)); + printf(" Technology : %s\n", val2str((spd_data[3]&15), ddr4_technology_type)); + printf(" SDRAM Die Count : %d\n", ((spd_data[6]>>4) & 3)+1); + printf(" SDRAM Capacity : %d Mb\n", sdram_cap ); + printf(" Memory Bank Group : %s\n", val2str((spd_data[4]>>6 & 0x3), ddr4_bank_groups)); + printf(" Memory Banks : %s\n", val2str((spd_data[4]>>4 & 0x3), ddr4_banks_vals)); + printf(" Primary Bus Width : %d bits\n", pri_bus_width ); + printf(" SDRAM Device Width : %d bits\n", sdram_width ); + printf(" Logical Rank per DIMM : %d\n", lrank_dimm ); + printf(" Memory size : %d MB\n", mem_size ); + + printf(" Memory Density : %s\n", val2str(spd_data[4]&15, ddr4_density_vals)); + printf(" 1.2 V Nominal Op : %s\n", (((spd_data[11]&3) != 3) ? "No":"Yes" ) ); + printf(" TBD1 V Nominal Op : %s\n", (((spd_data[11]>>2&3) != 3) ? "No":"Yes" ) ); + printf(" TBD2 V Nominal Op : %s\n", (((spd_data[11]>>4&3) != 3) ? "No":"Yes" ) ); + printf(" Error Detect/Cor : %s\n", val2str(spd_data[13]>>3, ddr4_ecc_vals)); + + printf(" Manufacturer : "); + switch (spd_data[320]&127) + { + case 0: + printf("%s\n", val2str(spd_data[321], jedec_id1_vals)); + break; + + case 1: + printf("%s\n", val2str(spd_data[321], jedec_id2_vals)); + break; + + case 2: + printf("%s\n", val2str(spd_data[321], jedec_id3_vals)); + break; + + case 3: + printf("%s\n", val2str(spd_data[321], jedec_id4_vals)); + break; + + case 4: + printf("%s\n", val2str(spd_data[321], jedec_id5_vals)); + break; + + default: + printf("%s\n", "JEDEC JEP106 update required"); + + } + + u_int year = (spd_data[323]>>4)*10 + spd_data[323]&15; + u_int week = (spd_data[324]>>4)*10 + spd_data[324]&15; + printf(" Manufacture Date : year %4d week %2d\n", + 2000 + year, week); + + printf(" Serial Number : %02x%02x%02x%02x\n", + spd_data[325], spd_data[326], spd_data[327], spd_data[328]); + + printf(" Part Number : "); + for (i=329; i <= 348; i++) + { + printf( "%c", spd_data[i]); + } + printf("\n"); } else { @@ -868,7 +1013,7 @@ ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id) struct ipmi_rs * rsp; struct ipmi_rq req; struct fru_info fru; - uint8_t spd_data[256], msg_data[4]; + uint8_t *spd_data, msg_data[4]; int len, offset; msg_data[0] = id; @@ -896,11 +1041,20 @@ ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id) lprintf(LOG_DEBUG, "fru.size = %d bytes (accessed by %s)", fru.size, fru.access ? "words" : "bytes"); + if (fru.size < 1) { lprintf(LOG_ERR, " Invalid FRU size %d", fru.size); return -1; } + spd_data = malloc(fru.size); + + if (spd_data == NULL) { + printf(" Unable to malloc memory for spd array of size=%d\n", + fru.size); + return -1; + } + memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_STORAGE; req.msg.cmd = GET_FRU_DATA; @@ -908,22 +1062,27 @@ ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id) req.msg.data_len = 4; offset = 0; - memset(spd_data, 0, 256); + memset(spd_data, 0, fru.size); do { + int i; msg_data[0] = id; - msg_data[1] = offset; - msg_data[2] = 0; + msg_data[1] = offset & 0xFF; + msg_data[2] = offset >> 8; msg_data[3] = FRU_DATA_RQST_SIZE; rsp = intf->sendrecv(intf, &req); if (rsp == NULL) { printf(" Device not present (No Response)\n"); + free(spd_data); + spd_data = NULL; return -1; } if (rsp->ccode > 0) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); + free(spd_data); + spd_data = NULL; /* Timeouts are acceptable. No DIMM in the socket */ if (rsp->ccode == 0xc3) return 1; @@ -938,6 +1097,8 @@ ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id) /* now print spd info */ ipmi_spd_print(spd_data, offset); + free(spd_data); + spd_data = NULL; return 0; } diff --git a/lib/helper.c b/lib/helper.c index 4b903b0..95d641e 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -357,6 +357,7 @@ int str2char(const char *str, int8_t * chr_ptr) if (arg_long < INT8_MIN || arg_long > INT8_MAX) { return (-3); } + *chr_ptr = (uint8_t)arg_long; return 0; } /* str2char(...) */ diff --git a/lib/hpm2.c b/lib/hpm2.c index e7d6c03..6cb2f80 100644 --- a/lib/hpm2.c +++ b/lib/hpm2.c @@ -30,6 +30,7 @@ * EVEN IF PPS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ +#include #include #include #include @@ -233,7 +234,8 @@ int hpm2_get_lan_channel_capabilities(struct ipmi_intf * intf, } /* check parameter revision */ - if (rsp->data[0] != HPM2_LAN_PARAMS_REV) { + if (rsp->data[0] != + LAN_PARAM_REV(HPM2_LAN_PARAMS_REV, HPM2_LAN_PARAMS_REV)) { lprintf(LOG_NOTICE, "Bad HPM.2 LAN parameter revision, rev=%d", rsp->data[0]); return -1; diff --git a/lib/ipmi_delloem.c b/lib/ipmi_delloem.c index e190cd4..308c513 100644 --- a/lib/ipmi_delloem.c +++ b/lib/ipmi_delloem.c @@ -123,6 +123,16 @@ const struct vFlashstr vFlash_completion_code_vals[] = { static int current_arg =0; uint8_t iDRAC_FLAG=0; + +/* + * new flags for + * 11G || 12G || 13G -> _ALL + * 12G || 13G -> _12_13 + * + */ +uint8_t iDRAC_FLAG_ALL=0; +uint8_t iDRAC_FLAG_12_13=0; + LCD_MODE lcd_mode; static uint8_t LcdSupported=0; static uint8_t SetLEDSupported=0; @@ -358,7 +368,7 @@ ipmi_delloem_lcd_main(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_ERR, "lcd is not supported on this system."); return -1; } else if (strncmp(argv[current_arg], "info\0", 5) == 0) { - if ((iDRAC_FLAG==IDRAC_11G) || (iDRAC_FLAG==IDRAC_12G)) { + if (iDRAC_FLAG_ALL) { rc = ipmi_lcd_get_info_wh(intf); } else { rc = ipmi_lcd_get_info(intf); @@ -392,7 +402,7 @@ ipmi_delloem_lcd_main(struct ipmi_intf * intf, int argc, char ** argv) } } if ((strncmp(argv[current_arg], "mode\0", 5) == 0) - && ((iDRAC_FLAG==IDRAC_11G) || (iDRAC_FLAG==IDRAC_12G))) { + && (iDRAC_FLAG_ALL)) { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); @@ -446,7 +456,7 @@ ipmi_delloem_lcd_main(struct ipmi_intf * intf, int argc, char ** argv) ipmi_lcd_usage(); } } else if ((strncmp(argv[current_arg], "lcdqualifier\0", 13) == 0) - && ((iDRAC_FLAG==IDRAC_11G) || (iDRAC_FLAG==IDRAC_12G))) { + && (iDRAC_FLAG_ALL)) { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); @@ -470,7 +480,7 @@ ipmi_delloem_lcd_main(struct ipmi_intf * intf, int argc, char ** argv) ipmi_lcd_usage(); } } else if ((strncmp(argv[current_arg], "errordisplay\0", 13) == 0) - && ((iDRAC_FLAG==IDRAC_11G) || (iDRAC_FLAG==IDRAC_12G))) { + && (iDRAC_FLAG_ALL)) { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); @@ -635,17 +645,33 @@ ipmi_idracvalidator_command(struct ipmi_intf * intf) val2str(rsp->ccode, completion_code_vals)); */ return -1; } + /* + * Set the new flags to 0 + */ + iDRAC_FLAG_ALL = 0; + iDRAC_FLAG_12_13 = 0; /* Support the 11G Monolithic, modular, Maisy and Coaster */ if ((IMC_IDRAC_11G_MONOLITHIC == data[10]) || (IMC_IDRAC_11G_MODULAR == data[10]) || (IMC_MASER_LITE_BMC == data[10]) || (IMC_MASER_LITE_NU == data[10])) { iDRAC_FLAG=IDRAC_11G; + iDRAC_FLAG_ALL = 1; } else if((IMC_IDRAC_12G_MONOLITHIC == data[10]) || (IMC_IDRAC_12G_MODULAR == data[10])) { iDRAC_FLAG = IDRAC_12G; + iDRAC_FLAG_ALL = 1; + iDRAC_FLAG_12_13 = 1; + } else if ((IMC_IDRAC_13G_MONOLITHIC == data[10]) + || (IMC_IDRAC_13G_MODULAR == data[10]) + || (IMC_IDRAC_13G_DCS == data[10])) { + iDRAC_FLAG=IDRAC_13G; + iDRAC_FLAG_ALL = 1; + iDRAC_FLAG_12_13 = 1; } else { iDRAC_FLAG = 0; + iDRAC_FLAG_ALL = 0; + iDRAC_FLAG_12_13 = 0; } IMC_Type = data[10]; return 0; @@ -1394,7 +1420,7 @@ ipmi_lcd_usage(void) lprintf(LOG_NOTICE, ""); lprintf(LOG_NOTICE, -"iDRAC 11g or iDRAC 12g:"); +"iDRAC 11g or iDRAC 12g or iDRAC 13g :"); lprintf(LOG_NOTICE, " lcd set {mode}|{lcdqualifier}|{errordisplay}"); lprintf(LOG_NOTICE, @@ -1561,7 +1587,9 @@ ipmi_macinfo_drac_idrac_virtual_mac(struct ipmi_intf* intf,uint8_t NicNum) return -1; } if ((IMC_IDRAC_12G_MODULAR == IMC_Type) - || (IMC_IDRAC_12G_MONOLITHIC== IMC_Type)) { + || (IMC_IDRAC_12G_MONOLITHIC== IMC_Type) + || (IMC_IDRAC_13G_MODULAR == IMC_Type) + || (IMC_IDRAC_13G_MONOLITHIC== IMC_Type)) { /* Get the Chasiss Assigned MAC Addresss for 12g Only */ memcpy(VirtualMacAddress, ((rsp->data) + 1), MACADDRESSLENGH); for (i = 0; i < MACADDRESSLENGH; i++) { @@ -1599,6 +1627,9 @@ ipmi_macinfo_drac_idrac_virtual_mac(struct ipmi_intf* intf,uint8_t NicNum) } else if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_12G_MONOLITHIC== IMC_Type)) { printf("\niDRAC7 MAC Address "); + } else if ((IMC_IDRAC_13G_MODULAR == IMC_Type) + || (IMC_IDRAC_13G_MONOLITHIC== IMC_Type)) { + printf ("\niDRAC8 MAC Address "); } else if ((IMC_MASER_LITE_BMC== IMC_Type) || (IMC_MASER_LITE_NU== IMC_Type)) { printf("\nBMC MAC Address "); @@ -1668,6 +1699,9 @@ ipmi_macinfo_drac_idrac_mac(struct ipmi_intf* intf,uint8_t NicNum) } else if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_12G_MONOLITHIC== IMC_Type)) { printf("\niDRAC7 MAC Address "); + } else if ((IMC_IDRAC_13G_MODULAR == IMC_Type) + || (IMC_IDRAC_13G_MONOLITHIC== IMC_Type)) { + printf ("\niDRAC8 MAC Address "); } else if ((IMC_MASER_LITE_BMC== IMC_Type) || (IMC_MASER_LITE_NU== IMC_Type)) { printf("\n\rBMC MAC Address "); @@ -1879,6 +1913,8 @@ ipmi_macinfo(struct ipmi_intf* intf, uint8_t NicNum) || IMC_IDRAC_11G_MONOLITHIC == IMC_Type) || (IMC_IDRAC_12G_MODULAR == IMC_Type || IMC_IDRAC_12G_MONOLITHIC == IMC_Type) + || (IMC_IDRAC_13G_MODULAR == IMC_Type + || IMC_IDRAC_13G_MONOLITHIC == IMC_Type) || (IMC_MASER_LITE_NU == IMC_Type || IMC_MASER_LITE_BMC== IMC_Type)) { return ipmi_macinfo_11g(intf,NicNum); } else { @@ -1946,7 +1982,7 @@ ipmi_delloem_lan_main(struct ipmi_intf * intf, int argc, char ** argv) ipmi_lan_usage(); return -1; } - if (iDRAC_FLAG == IDRAC_12G) { + if (iDRAC_FLAG_12_13) { nic_selection = get_nic_selection_mode_12g(intf, current_arg, argv, nic_set); if (INVALID == nic_selection) { @@ -2063,7 +2099,7 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, } if (argv[current_arg] != NULL && strncmp(argv[current_arg], "lom1\0", 5) == 0) { - if (IMC_IDRAC_12G_MODULAR == IMC_Type) { + if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } if (failover) { @@ -2082,7 +2118,7 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, return 0; } else if (argv[current_arg] != NULL && strncmp(argv[current_arg], "lom2\0", 5) == 0) { - if (IMC_IDRAC_12G_MODULAR == IMC_Type) { + if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } if (failover) { @@ -2101,7 +2137,7 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, return 0; } else if (argv[current_arg] != NULL && strncmp(argv[current_arg], "lom3\0", 5) == 0) { - if (IMC_IDRAC_12G_MODULAR == IMC_Type) { + if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } if (failover) { @@ -2120,7 +2156,7 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, return 0; } else if (argv[current_arg] != NULL && strncmp(argv[current_arg], "lom4\0", 5) == 0) { - if (IMC_IDRAC_12G_MODULAR == IMC_Type) { + if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } if (failover) { @@ -2139,7 +2175,7 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, return 0; } else if (failover && argv[current_arg] != NULL && strncmp(argv[current_arg], "none\0", 5) == 0) { - if (IMC_IDRAC_12G_MODULAR == IMC_Type) { + if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type) ) { return INVAILD_SHARED_MODE; } if (failover) { @@ -2159,7 +2195,7 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, current_arg++; if (failover && argv[current_arg] != NULL && strncmp(argv[current_arg], "loms\0", 5) == 0) { - if (IMC_IDRAC_12G_MODULAR == IMC_Type) { + if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } if (nic_set[0] == 1) { @@ -2242,7 +2278,8 @@ ipmi_lan_set_nic_selection_12g(struct ipmi_intf * intf, uint8_t * nic_selection) lprintf(LOG_ERR, "Error in setting nic selection"); return -1; } else if( (nic_selection[0] == 1) - && ((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED))) { + && (( iDRAC_FLAG_12_13 ) + && (rsp->ccode == LICENSE_NOT_SUPPORTED))) { /* Check license only for setting the dedicated nic. */ lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); @@ -2297,7 +2334,7 @@ ipmi_lan_get_nic_selection(struct ipmi_intf * intf) input_length = 0; req.msg.netfn = DELL_OEM_NETFN; req.msg.lun = 0; - if (iDRAC_FLAG == IDRAC_12G) { + if( iDRAC_FLAG_12_13 ) { req.msg.cmd = GET_NIC_SELECTION_12G_CMD; } else { req.msg.cmd = GET_NIC_SELECTION_CMD; @@ -2314,7 +2351,7 @@ ipmi_lan_get_nic_selection(struct ipmi_intf * intf) return -1; } nic_selection = rsp->data[0]; - if (iDRAC_FLAG == IDRAC_12G) { + if( iDRAC_FLAG_12_13 ) { nic_selection_failover = rsp->data[1]; if ((nic_selection < 6) && (nic_selection > 0) && (nic_selection_failover < 7)) { @@ -2413,7 +2450,7 @@ ipmi_lan_usage(void) lprintf(LOG_NOTICE, " sets the NIC Selection Mode :"); lprintf(LOG_NOTICE, -" on iDRAC12g :"); +" on iDRAC12g OR iDRAC13g :"); lprintf(LOG_NOTICE, " dedicated, shared with lom1, shared with lom2,shared with lom3,shared"); lprintf(LOG_NOTICE, @@ -2433,7 +2470,7 @@ ipmi_lan_usage(void) lprintf(LOG_NOTICE, " lan get "); lprintf(LOG_NOTICE, -" on iDRAC12g :"); +" on iDRAC12g or iDRAC13g :"); lprintf(LOG_NOTICE, " returns the current NIC Selection Mode (dedicated, shared with lom1, shared"); lprintf(LOG_NOTICE, @@ -2662,7 +2699,7 @@ ipmi_get_power_capstatus_command(struct ipmi_intf * intf) if (rsp == NULL) { lprintf(LOG_ERR, "Error getting powercap status"); return -1; - } else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { + } else if (( iDRAC_FLAG_12_13 ) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; /* Return Error as unlicensed */ @@ -2713,7 +2750,7 @@ ipmi_set_power_capstatus_command(struct ipmi_intf * intf, uint8_t val) if (rsp == NULL) { lprintf(LOG_ERR, "Error setting powercap status"); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { + } else if ((iDRAC_FLAG_12_13) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; /* return unlicensed Error code */ @@ -2807,7 +2844,7 @@ ipmi_powermgmt(struct ipmi_intf * intf) return -1; } - if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { + if ((iDRAC_FLAG_12_13) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; @@ -2910,7 +2947,7 @@ ipmi_powermgmt_clear(struct ipmi_intf * intf, uint8_t clearValue) if (rsp == NULL) { lprintf(LOG_ERR, "Error clearing power values."); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) + } else if ((iDRAC_FLAG_12_13) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); @@ -2988,7 +3025,7 @@ ipmi_get_power_headroom_command(struct ipmi_intf * intf,uint8_t unit) if (rsp == NULL) { lprintf(LOG_ERR, "Error getting power headroom status"); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) + } else if ((iDRAC_FLAG_12_13) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); @@ -3122,7 +3159,7 @@ ipmi_get_instan_power_consmpt_data(struct ipmi_intf * intf, if (rsp == NULL) { lprintf(LOG_ERR, "Error getting instantaneous power consumption data ."); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) + } else if ((iDRAC_FLAG_12_13) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); @@ -3215,7 +3252,7 @@ ipmi_get_avgpower_consmpt_history(struct ipmi_intf * intf, lprintf(LOG_ERR, "Error getting average power consumption history data."); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + } else if ((iDRAC_FLAG_12_13) && (rc == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; @@ -3264,7 +3301,7 @@ ipmi_get_peakpower_consmpt_history(struct ipmi_intf * intf, if (rc < 0) { lprintf(LOG_ERR, "Error getting peak power consumption history data."); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + } else if ((iDRAC_FLAG_12_13) && (rc == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; @@ -3321,7 +3358,7 @@ ipmi_get_minpower_consmpt_history(struct ipmi_intf * intf, if (rc < 0) { lprintf(LOG_ERR, "Error getting peak power consumption history data ."); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + } else if ((iDRAC_FLAG_12_13) && (rc == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; @@ -3518,7 +3555,7 @@ ipmi_get_power_cap(struct ipmi_intf * intf, IPMI_POWER_CAP * ipmipowercap) if (rc < 0) { lprintf(LOG_ERR, "Error getting power cap."); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + } else if ((iDRAC_FLAG_12_13) && (rc == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; @@ -3618,7 +3655,7 @@ ipmi_set_power_cap(struct ipmi_intf * intf, int unit, int val) if (rc < 0) { lprintf(LOG_ERR, "Error getting power cap."); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + } else if ((iDRAC_FLAG_12_13) && (rc == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; @@ -3698,7 +3735,7 @@ ipmi_set_power_cap(struct ipmi_intf * intf, int unit, int val) if (rc < 0) { lprintf(LOG_ERR, "Error setting power cap"); return -1; - } else if ((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + } else if ((iDRAC_FLAG_12_13) && (rc == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; @@ -3860,7 +3897,7 @@ ipmi_get_sd_card_info(struct ipmi_intf * intf) { sdcardinfoblock = (IPMI_DELL_SDCARD_INFO *) (void *) rsp->data; - if ((iDRAC_FLAG == IDRAC_12G) + if ((iDRAC_FLAG_12_13) && (sdcardinfoblock->vflashcompcode == VFL_NOT_LICENSED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); diff --git a/lib/ipmi_ekanalyzer.c b/lib/ipmi_ekanalyzer.c index 2ac1012..96d3b44 100644 --- a/lib/ipmi_ekanalyzer.c +++ b/lib/ipmi_ekanalyzer.c @@ -45,9 +45,9 @@ #define NO_MORE_INFO_FIELD 0xc1 #define TYPE_CODE 0xc0 /*Language code*/ -/***************************************************************** -* CONSTANT -*****************************************************************/ +/* + * CONSTANT + */ const int ERROR_STATUS = -1; const int OK_STATUS = 0; @@ -59,10 +59,10 @@ const int SIZE_OF_FILE_TYPE = 3; const unsigned char AMC_MODULE = 0x80; const int PICMG_ID_OFFSET = 3; const unsigned int COMPARE_CANDIDATE = 2; -/*In AMC.0 or PICMG 3.0 specification offset start from 0 with 3 bytes of -* Mfg.ID, 1 byte of Picmg record Id, and -* 1 byte of format version, so the data offset start from 5 -*/ +/* In AMC.0 or PICMG 3.0 specification offset start from 0 with 3 bytes of + * Mfg.ID, 1 byte of Picmg record Id, and + * 1 byte of format version, so the data offset start from 5 + */ const int START_DATA_OFFSET = 5; const int LOWER_OEM_TYPE = 0xf0; const int UPPER_OEM_TYPE = 0xfe; @@ -361,16 +361,18 @@ static void ipmi_ek_display_clock_config_record( * ***************************************************************************/ static void -ipmi_ekanalyzer_usage( void ) +ipmi_ekanalyzer_usage(void) { - lprintf(LOG_NOTICE, "Ekeying analyzer tool version 1.00"); - lprintf(LOG_NOTICE, "ekanalyzer Commands:"); lprintf(LOG_NOTICE, - " print [carrier | power | all] ..."); +"Ekeying analyzer tool version 1.00"); + lprintf(LOG_NOTICE, +"ekanalyzer Commands:"); lprintf(LOG_NOTICE, - " frushow "); +" print [carrier | power | all] ..."); lprintf(LOG_NOTICE, - " summary [match | unmatch | all] ..."); +" frushow "); + lprintf(LOG_NOTICE, +" summary [match | unmatch | all] ..."); } /************************************************************************** @@ -395,53 +397,41 @@ ipmi_ekanalyzer_usage( void ) * ipmi_ekanalyzer_module_type for a list of valid type. ***************************************************************************/ static int -ipmi_ek_get_file_type( char * argument ) +ipmi_ek_get_file_type(char *argument) { - int index_name=0; - int filetype = ERROR_STATUS; - - if( strlen (argument) > MIN_ARGUMENT ){ - if( strncmp( argument, "oc=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = ON_CARRIER_FRU_FILE; - } - else if( strncmp( argument, "a1=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = A1_AMC_FRU_FILE; - } - else if( strncmp( argument, "a2=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = A2_AMC_FRU_FILE; - } - else if( strncmp( argument, "a3=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = A3_AMC_FRU_FILE; - } - else if( strncmp( argument, "a4=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = A4_AMC_FRU_FILE; - } - else if( strncmp( argument, "b1=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = B1_AMC_FRU_FILE; - } - else if( strncmp( argument, "b2=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = B2_AMC_FRU_FILE; - } - else if( strncmp( argument, "b3=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = B3_AMC_FRU_FILE; - } - else if( strncmp( argument, "b4=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = B4_AMC_FRU_FILE; - } - else if( strncmp( argument, "rt=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = RTM_FRU_FILE; - } - else if( strncmp( argument, "rc=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = CONFIG_FILE; - } - else if( strncmp( argument, "sm=", SIZE_OF_FILE_TYPE ) == 0 ) { - filetype = SHELF_MANAGER_FRU_FILE; - } - else{ - filetype = ERROR_STATUS; - } - } - return filetype; + int index_name=0; + int filetype = ERROR_STATUS; + if (strlen(argument) <= MIN_ARGUMENT) { + return filetype; + } + if (strncmp(argument, "oc=", SIZE_OF_FILE_TYPE) == 0) { + filetype = ON_CARRIER_FRU_FILE; + } else if (strncmp(argument, "a1=", SIZE_OF_FILE_TYPE) == 0) { + filetype = A1_AMC_FRU_FILE; + } else if (strncmp(argument, "a2=", SIZE_OF_FILE_TYPE) == 0) { + filetype = A2_AMC_FRU_FILE; + } else if (strncmp(argument, "a3=", SIZE_OF_FILE_TYPE) == 0) { + filetype = A3_AMC_FRU_FILE; + } else if (strncmp(argument, "a4=", SIZE_OF_FILE_TYPE) == 0) { + filetype = A4_AMC_FRU_FILE; + } else if (strncmp(argument, "b1=", SIZE_OF_FILE_TYPE) == 0) { + filetype = B1_AMC_FRU_FILE; + } else if (strncmp(argument, "b2=", SIZE_OF_FILE_TYPE) == 0) { + filetype = B2_AMC_FRU_FILE; + } else if (strncmp(argument, "b3=", SIZE_OF_FILE_TYPE) == 0) { + filetype = B3_AMC_FRU_FILE; + } else if (strncmp(argument, "b4=", SIZE_OF_FILE_TYPE) == 0) { + filetype = B4_AMC_FRU_FILE; + } else if (strncmp(argument, "rt=", SIZE_OF_FILE_TYPE) == 0) { + filetype = RTM_FRU_FILE; + } else if (strncmp(argument, "rc=", SIZE_OF_FILE_TYPE) == 0) { + filetype = CONFIG_FILE; + } else if (strncmp(argument, "sm=", SIZE_OF_FILE_TYPE) == 0) { + filetype = SHELF_MANAGER_FRU_FILE; + } else { + filetype = ERROR_STATUS; + } + return filetype; } /************************************************************************** @@ -465,200 +455,194 @@ ipmi_ek_get_file_type( char * argument ) * ***************************************************************************/ int -ipmi_ekanalyzer_main( struct ipmi_intf * intf, int argc, char ** argv ) +ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) { - int rc = ERROR_STATUS; - int file_type[MAX_FILE_NUMBER]; - int tmp_ret = 0; - char * filename[MAX_FILE_NUMBER]; - unsigned int argument_offset = 0; - unsigned int type_offset = 0; - /*list des multi record*/ - struct ipmi_ek_multi_header * list_head = NULL; - struct ipmi_ek_multi_header * list_record = NULL; - struct ipmi_ek_multi_header * list_last = NULL; - - if ( (argc == 0) || ( (argc - 1) > MAX_FILE_NUMBER ) ){ - lprintf(LOG_ERR, "Too few or too many arguments!"); - ipmi_ekanalyzer_usage(); - rc = ERROR_STATUS; - } - else if ( strcmp(argv[argument_offset], "help") == 0) { - ipmi_ekanalyzer_usage(); - rc = 0; - } - else if ( (strcmp(argv[argument_offset], "frushow") == 0) - && (argc > (MIN_ARGUMENT-1) ) - ){ - for ( type_offset = 0; type_offset < (argc-1); type_offset++ ){ - argument_offset++; - file_type[type_offset] = ipmi_ek_get_file_type (argv[argument_offset]); - if ( file_type[type_offset] != ERROR_STATUS ){ - if ( file_type[type_offset] != CONFIG_FILE ){ - /* because of strlen doesn't count '\0', we need to add 1 byte for - * this character to filename size - */ - filename[type_offset] = malloc( strlen(argv[argument_offset]) + 1 - - SIZE_OF_FILE_TYPE - ); - if( filename[type_offset] != NULL ){ - strcpy(filename[type_offset], - &argv[argument_offset][SIZE_OF_FILE_TYPE]); - printf("Start converting file '%s'...\n", filename[type_offset]); - /* Display FRU header offset */ - rc = ipmi_ek_display_fru_header (filename[type_offset]); - - if ( rc != ERROR_STATUS ){ - /* Display FRU header info in detail record */ - tmp_ret = ipmi_ek_display_fru_header_detail(filename[type_offset]); - /* Convert from binary data into multi record structure */ - rc = ipmi_ekanalyzer_fru_file2structure ( filename[type_offset], - &list_head, &list_record, &list_last ); - - ipmi_ek_display_record ( list_record, list_head, list_last ); - /* Remove record of list */ - while ( list_head != NULL ){ - ipmi_ek_remove_record_from_list( list_head, - &list_head,&list_last ); - if (verbose > 1) - printf("record has been removed!\n"); - } - } - free(filename[type_offset]); - filename[type_offset] = NULL; - } - } - } - else{ - lprintf(LOG_ERR, "Invalid file type!"); - lprintf(LOG_ERR, " ekanalyzer frushow ..."); - } - } - } - else if ( (strcmp(argv[argument_offset], "print") == 0) - || (strcmp(argv[argument_offset], "summary") == 0) - ){ - /*Display help of the correspond command if there is not enought argument - * passing in command line - */ - if ( argc < MIN_ARGUMENT ){ - lprintf(LOG_ERR, "Not enough parameters given."); - if ( strcmp(argv[argument_offset], "print") == 0 ){ - lprintf(LOG_ERR, " ekanalyzer print [carrier/power/all]" - " [xx=frufile]" - ); - } - else{ - lprintf(LOG_ERR, " ekanalyzer summary [match/ unmatch/ all]" - " [xx=frufile]" - ); - } - } - else{ - char * option; - /*index=1 indicates start position of first file name in command line*/ - int index = 1; - int filename_size=0; - - argument_offset++; - if ( (strcmp(argv[argument_offset], "carrier") == 0) - || (strcmp(argv[argument_offset], "power") == 0) - || (strcmp(argv[argument_offset], "all") == 0) - ){ - option = argv[argument_offset]; - index ++; - argc--; - } - else if ( ( strcmp(argv[argument_offset], "match") == 0 ) - || ( strcmp(argv[argument_offset], "unmatch") == 0 ) - ){ - option = argv[argument_offset]; - index ++; - argc--; - } - /*since the command line must receive xx=filename, so the position of - * "=" sign is 2 - */ - else if ( strncmp(&argv[argument_offset][2], "=", 1) == 0 ){ - option = "default"; - /* Since there is no option from user, the first argument - * becomes first file type */ - index = 1; /* index of argument */ - } - else{ - option = "invalid"; - printf("Invalid option '%s'\n", argv[argument_offset]); - argument_offset--; - if (strcmp(argv[0], "print") == 0){ - lprintf (LOG_ERR, " ekanalyzer print [carrier/power/all]" - " [xx=frufile]" - ); - } - else{ - lprintf (LOG_ERR, " ekanalyzer summary [match/ unmatch/ all]" - " [xx=frufile]" - ); - } - rc = ERROR_STATUS; - } - if ( strcmp(option, "invalid") != 0 ){ - int i=0; - - for ( i = 0; i < (argc-1); i++){ - file_type[i] = ipmi_ek_get_file_type (argv[index]); - if ( file_type[i] == ERROR_STATUS ){ - /* display the first 2 charactors (file type) of argument */ - lprintf(LOG_ERR, "Invalid file type: %c%c\n", argv[index][0], - argv[index][1]); - ipmi_ekanalyzer_usage(); - rc = ERROR_STATUS; - break; - } - /*size is equal to string size minus 3 bytes of file type plus - * 1 byte of '\0' since the strlen doesn't count the '\0' - */ - filename_size = strlen( argv[index] ) - SIZE_OF_FILE_TYPE + 1; - if ( filename_size > 0 ){ - filename[i] = malloc( filename_size ); - if (filename[i] != NULL) - strcpy( filename[i], &argv[index][SIZE_OF_FILE_TYPE] ); - } - rc = OK_STATUS; - index++; - } - if ( rc != ERROR_STATUS ){ - if (verbose > 0){ - for (i = 0; i < (argc-1); i++){ - printf ("Type: %s, ", - val2str(file_type[i], ipmi_ekanalyzer_module_type)); - printf("file name: %s\n", filename[i]); - } - } - if (strcmp(argv[0], "print") == 0){ - rc = ipmi_ekanalyzer_print( - (argc-1), option, filename, file_type); - } - else{ - rc = ipmi_ekanalyzer_ekeying_match( - (argc-1), option, filename, file_type); - } - for (i = 0; i < (argc-1); i++){ - if (filename[i] != NULL){ - free(filename[i]); - filename[i] = NULL; - } - } - } /* End of ERROR_STATUS */ - } /* End of comparison of invalid option */ - } /* End of else MIN_ARGUMENT */ - } /* End of print or summary option */ - else{ - lprintf(LOG_ERR, "Invalid ekanalyzer command: %s", argv[0]); - ipmi_ekanalyzer_usage(); - rc = ERROR_STATUS; - } + int rc = ERROR_STATUS; + int file_type[MAX_FILE_NUMBER]; + int tmp_ret = 0; + char *filename[MAX_FILE_NUMBER]; + unsigned int argument_offset = 0; + unsigned int type_offset = 0; + /* list des multi record */ + struct ipmi_ek_multi_header *list_head = NULL; + struct ipmi_ek_multi_header *list_record = NULL; + struct ipmi_ek_multi_header *list_last = NULL; + + if (argc == 0) { + lprintf(LOG_ERR, "Not enough parameters given."); + ipmi_ekanalyzer_usage(); + return (-1); + } else if ((argc - 1) > MAX_FILE_NUMBER) { + lprintf(LOG_ERR, "Too too many parameters given."); + return (-1); + } - return rc; + if (strcmp(argv[argument_offset], "help") == 0) { + ipmi_ekanalyzer_usage(); + return 0; + } else if ((strcmp(argv[argument_offset], "frushow") == 0) + && (argc > (MIN_ARGUMENT-1))) { + for (type_offset = 0; type_offset < (argc-1); type_offset++ ) { + argument_offset++; + file_type[type_offset] = ipmi_ek_get_file_type(argv[argument_offset]); + if (file_type[type_offset] == ERROR_STATUS + || file_type[type_offset] == CONFIG_FILE) { + lprintf(LOG_ERR, "Invalid file type!"); + lprintf(LOG_ERR, " ekanalyzer frushow ..."); + return (-1); + } + /* because of strlen doesn't count '\0', + * we need to add 1 byte for this character + * to filename size + */ + filename[type_offset] = malloc(strlen(argv[argument_offset]) + + 1 - SIZE_OF_FILE_TYPE); + if (filename[type_offset] == NULL) { + lprintf(LOG_ERR, "malloc failure"); + return (-1); + } + strcpy(filename[type_offset], + &argv[argument_offset][SIZE_OF_FILE_TYPE]); + printf("Start converting file '%s'...\n", + filename[type_offset]); + /* Display FRU header offset */ + rc = ipmi_ek_display_fru_header (filename[type_offset]); + if (rc != ERROR_STATUS) { + /* Display FRU header info in detail record */ + tmp_ret = ipmi_ek_display_fru_header_detail(filename[type_offset]); + /* Convert from binary data into multi record structure */ + rc = ipmi_ekanalyzer_fru_file2structure (filename[type_offset], + &list_head, &list_record, &list_last ); + ipmi_ek_display_record(list_record, list_head, list_last); + /* Remove record of list */ + while (list_head != NULL) { + ipmi_ek_remove_record_from_list(list_head, + &list_head,&list_last ); + if (verbose > 1) { + printf("record has been removed!\n"); + } + } + } + free(filename[type_offset]); + filename[type_offset] = NULL; + } + } else if ((strcmp(argv[argument_offset], "print") == 0) + || (strcmp(argv[argument_offset], "summary") == 0)) { + /* Display help text for corresponding command + * if not enough parameters were given. + */ + char * option; + /* index=1 indicates start position of first file + * name in command line + */ + int index = 1; + int filename_size=0; + if (argc < MIN_ARGUMENT) { + lprintf(LOG_ERR, "Not enough parameters given."); + if (strcmp(argv[argument_offset], "print") == 0) { + lprintf(LOG_ERR, + " ekanalyzer print [carrier/power/all]" + " [xx=frufile]"); + } else { + lprintf(LOG_ERR, + " ekanalyzer summary [match/ unmatch/ all]" + " [xx=frufile]"); + } + return ERROR_STATUS; + } + argument_offset++; + if ((strcmp(argv[argument_offset], "carrier") == 0) + || (strcmp(argv[argument_offset], "power") == 0) + || (strcmp(argv[argument_offset], "all") == 0)) { + option = argv[argument_offset]; + index ++; + argc--; + } else if ((strcmp(argv[argument_offset], "match") == 0) + || ( strcmp(argv[argument_offset], "unmatch") == 0)) { + option = argv[argument_offset]; + index ++; + argc--; + } else if ( strncmp(&argv[argument_offset][2], "=", 1) == 0) { + /* since the command line must receive xx=filename, + * so the position of "=" sign is 2 + */ + option = "default"; + /* Since there is no option from user, the first argument + * becomes first file type + */ + index = 1; /* index of argument */ + } else { + option = "invalid"; + printf("Invalid option '%s'\n", argv[argument_offset]); + argument_offset--; + if (strcmp(argv[0], "print") == 0) { + lprintf (LOG_ERR, + " ekanalyzer print [carrier/power/all]" + " [xx=frufile]"); + } else { + lprintf (LOG_ERR, + " ekanalyzer summary [match/ unmatch/ all]" + " [xx=frufile]"); + } + rc = ERROR_STATUS; + } + if (strcmp(option, "invalid") != 0) { + int i=0; + for (i = 0; i < (argc-1); i++) { + file_type[i] = ipmi_ek_get_file_type (argv[index]); + if (file_type[i] == ERROR_STATUS) { + /* display the first 2 charactors (file type) of argument */ + lprintf(LOG_ERR, "Invalid file type: %c%c\n", + argv[index][0], + argv[index][1]); + ipmi_ekanalyzer_usage(); + rc = ERROR_STATUS; + break; + } + /* size is equal to string size minus 3 bytes of file type plus + * 1 byte of '\0' since the strlen doesn't count the '\0' + */ + filename_size = strlen(argv[index]) - SIZE_OF_FILE_TYPE + 1; + if (filename_size > 0) { + /* TODO - check malloc() retval */ + filename[i] = malloc( filename_size ); + if (filename[i] != NULL) { + strcpy(filename[i], &argv[index][SIZE_OF_FILE_TYPE]); + } + } + rc = OK_STATUS; + index++; + } + if (rc != ERROR_STATUS) { + if (verbose > 0) { + for (i = 0; i < (argc-1); i++) { + printf ("Type: %s, ", + val2str(file_type[i], + ipmi_ekanalyzer_module_type)); + printf("file name: %s\n", filename[i]); + } + } + if (strcmp(argv[0], "print") == 0) { + rc = ipmi_ekanalyzer_print((argc-1), + option, filename, file_type); + } else { + rc = ipmi_ekanalyzer_ekeying_match((argc-1), + option, filename, file_type); + } + for (i = 0; i < (argc-1); i++) { + if (filename[i] != NULL) { + free(filename[i]); + filename[i] = NULL; + } + } + } /* End of ERROR_STATUS */ + } /* End of comparison of invalid option */ + } else { + lprintf(LOG_ERR, "Invalid ekanalyzer command: %s", argv[0]); + ipmi_ekanalyzer_usage(); + rc = ERROR_STATUS; + } + return rc; } /************************************************************************** @@ -685,99 +669,96 @@ ipmi_ekanalyzer_main( struct ipmi_intf * intf, int argc, char ** argv ) * ***************************************************************************/ static int -ipmi_ekanalyzer_print( int argc, char * opt, char ** filename, int * file_type ) +ipmi_ekanalyzer_print(int argc, char *opt, char **filename, int *file_type) { - int return_value = OK_STATUS; - - /*Display carrier topology*/ - if ( (strcmp(opt, "carrier") == 0) || (strcmp(opt, "default") == 0) ){ - tboolean found_flag = FALSE; - int index = 0; - int index_name[argc]; - int list = 0; - /*list of multi record*/ - struct ipmi_ek_multi_header * list_head[argc]; - struct ipmi_ek_multi_header * list_record[argc]; - struct ipmi_ek_multi_header * list_last[argc]; - - for ( list=0; list < argc; list++ ){ - list_head[list] = NULL; - list_record[list] = NULL; - list_last[list] = NULL; - } - - list=0; /* reset list count */ - for ( index = 0; index < argc; index++ ){ - if ( file_type[index] == ON_CARRIER_FRU_FILE ){ - index_name[list] = index; - return_value = ipmi_ekanalyzer_fru_file2structure( filename[index], - &list_head[list], &list_record[list], &list_last[list] ); - list++; - found_flag = TRUE; - } - } - if ( !found_flag ){ - printf("No carrier file has been found\n"); - return_value = ERROR_STATUS; - } - else{ - int i = 0; - for ( i = 0; i < argc; i++ ){ - /*this is a flag to advoid displaying the same data multiple time*/ - tboolean first_data = TRUE; - for ( list_record[i] = list_head[i]; - list_record[i] != NULL; - list_record[i] = list_record[i]->next ){ - if ( list_record[i]->data[PICMG_ID_OFFSET] - == - FRU_AMC_CARRIER_P2P ){ - if ( first_data ){ - printf("%s\n", STAR_LINE_LIMITER); - printf("From Carrier file: %s\n", filename[index_name[i]]); - first_data = FALSE; - } - return_value = ipmi_ek_display_carrier_connectivity( - list_record[i] ); - } - else if ( list_record[i]->data[PICMG_ID_OFFSET] - == - FRU_AMC_CARRIER_INFO ){ - /*See AMC.0 specification Table3-3 for mor detail*/ - #define COUNT_OFFSET 6 - if ( first_data ){ - printf("From Carrier file: %s\n", filename[index_name[i]]); - first_data = FALSE; - } - printf(" Number of AMC bays supported by Carrier: %d\n", - list_record[i]->data[COUNT_OFFSET] ); - } - } - } - /*Destroy the list of record*/ - for ( i = 0; i < argc; i++ ){ - while ( list_head[i] != NULL ){ - ipmi_ek_remove_record_from_list( list_head[i], - &list_head[i], &list_last[i] ); - } - /* display deleted result when we reach the last record */ - if ( ( i == (list-1) ) && verbose ) - printf("Record list has been removed successfully\n"); - } - } - } - else if ( (strcmp(opt, "power") == 0) ){ - printf("Print power information\n"); - return_value = ipmi_ek_display_power(argc, opt, filename, file_type); - } - else if ( strcmp(opt, "all") == 0 ){ - printf("Print all information\n"); - return_value = ipmi_ek_display_power(argc, opt, filename, file_type); - } - else{ - lprintf(LOG_ERR, "Invalid option %s", opt); - return_value = ERROR_STATUS; - } - return return_value; + int return_value = OK_STATUS; + /* Display carrier topology */ + if ((strcmp(opt, "carrier") == 0) || (strcmp(opt, "default") == 0)) { + tboolean found_flag = FALSE; + int index = 0; + int index_name[argc]; + int list = 0; + /* list of multi record */ + struct ipmi_ek_multi_header *list_head[argc]; + struct ipmi_ek_multi_header *list_record[argc]; + struct ipmi_ek_multi_header *list_last[argc]; + + for (list=0; list < argc; list++) { + list_head[list] = NULL; + list_record[list] = NULL; + list_last[list] = NULL; + } + /* reset list count */ + list = 0; + for (index = 0; index < argc; index++) { + if (file_type[index] != ON_CARRIER_FRU_FILE) { + continue; + } + index_name[list] = index; + return_value = ipmi_ekanalyzer_fru_file2structure(filename[index], + &list_head[list], + &list_record[list], + &list_last[list]); + list++; + found_flag = TRUE; + } + if (!found_flag) { + printf("No carrier file has been found\n"); + return_value = ERROR_STATUS; + } else { + int i = 0; + for (i = 0; i < argc; i++) { + /* this is a flag to advoid displaying + * the same data multiple time + */ + tboolean first_data = TRUE; + for (list_record[i] = list_head[i]; + list_record[i] != NULL; + list_record[i] = list_record[i]->next) { + if (list_record[i]->data[PICMG_ID_OFFSET] == FRU_AMC_CARRIER_P2P) { + if (first_data) { + printf("%s\n", STAR_LINE_LIMITER); + printf("From Carrier file: %s\n", filename[index_name[i]]); + first_data = FALSE; + } + return_value = ipmi_ek_display_carrier_connectivity(list_record[i]); + } else if (list_record[i]->data[PICMG_ID_OFFSET] == FRU_AMC_CARRIER_INFO) { + /*See AMC.0 specification Table3-3 for mor detail*/ + #define COUNT_OFFSET 6 + if (first_data) { + printf("From Carrier file: %s\n", filename[index_name[i]]); + first_data = FALSE; + } + printf(" Number of AMC bays supported by Carrier: %d\n", + list_record[i]->data[COUNT_OFFSET]); + } + } + } + /*Destroy the list of record*/ + for (i = 0; i < argc; i++) { + while (list_head[i] != NULL) { + ipmi_ek_remove_record_from_list(list_head[i], + &list_head[i], &list_last[i]); + } + /* display deleted result when we + * reach the last record + */ + if ((i == (list-1)) && verbose) { + printf("Record list has been removed successfully\n"); + } + } + } + } else if (strcmp(opt, "power") == 0) { + printf("Print power information\n"); + return_value = ipmi_ek_display_power(argc, opt, filename, file_type); + } else if (strcmp(opt, "all") == 0) { + printf("Print all information\n"); + return_value = ipmi_ek_display_power(argc, opt, filename, file_type); + } else { + lprintf(LOG_ERR, "Invalid option %s", opt); + return_value = ERROR_STATUS; + } + return return_value; } /************************************************************************** @@ -800,86 +781,79 @@ ipmi_ekanalyzer_print( int argc, char * opt, char ** filename, int * file_type ) * ***************************************************************************/ static int -ipmi_ek_display_carrier_connectivity( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_carrier_connectivity(struct ipmi_ek_multi_header *record) { - int return_value = ERROR_STATUS; - struct fru_picmgext_carrier_p2p_record rsc_desc; - struct fru_picmgext_carrier_p2p_descriptor *port_desc; - - if ( record == NULL ){ - lprintf(LOG_ERR, "P2P connectivity record is invalid\n"); - return_value = ERROR_STATUS; - } - else{ - int offset = START_DATA_OFFSET; - if ( verbose > 1 ){ - int k = 0; - printf("Binary data of Carrier p2p connectivity"\ - " record starting from mfg id\n"); - for ( k = 0; k < ( record->header.len ); k++ ){ - printf("%02x ", record->data[k]); - } - printf("\n"); - } - while ( offset <= (record->header.len - START_DATA_OFFSET) ){ - rsc_desc.resource_id = record->data[offset++]; - rsc_desc.p2p_count = record->data[offset++]; - if ( verbose > 0 ){ - printf("resource id= %02x port count= %d\n", - rsc_desc.resource_id,rsc_desc.p2p_count); - } - /*check if it is an AMC Module*/ - if ( ( (rsc_desc.resource_id & AMC_MODULE) ) == AMC_MODULE ) { - /*check if it is an RTM module*/ - if ((rsc_desc.resource_id == AMC_MODULE)){ - printf(" %s topology:\n", val2str( RTM_IPMB_L, - ipmi_ekanalyzer_IPMBL_addr)); - } - else{ - /*The last four bits of resource ID represent site number - * (mask = 0x0f) - */ - printf(" %s topology:\n", - val2str( (rsc_desc.resource_id & 0x0f), - ipmi_ekanalyzer_module_type)); - } - } - else{ - printf(" On Carrier Device ID %d topology: \n", - (rsc_desc.resource_id & 0x0f)); - } - while ( rsc_desc.p2p_count > 0 ){ - unsigned char data[3]; -#ifndef WORDS_BIGENDIAN - data[0] = record->data[offset+0]; - data[1] = record->data[offset+1]; - data[2] = record->data[offset+2]; -#else - data[0] = record->data[offset+2]; - data[1] = record->data[offset+1]; - data[2] = record->data[offset+0]; -#endif - port_desc = (struct fru_picmgext_carrier_p2p_descriptor*)data; - offset += sizeof (struct fru_picmgext_carrier_p2p_descriptor); - if ((port_desc->remote_resource_id & AMC_MODULE) == AMC_MODULE) { - printf("\tPort %d =====> %s, Port %d\n", - port_desc->local_port, - val2str( (port_desc->remote_resource_id & 0x0f), - ipmi_ekanalyzer_module_type), - port_desc->remote_port); + int offset = START_DATA_OFFSET; + struct fru_picmgext_carrier_p2p_record rsc_desc; + struct fru_picmgext_carrier_p2p_descriptor *port_desc; + if (record == NULL) { + lprintf(LOG_ERR, "P2P connectivity record is invalid\n"); + return ERROR_STATUS; + } + if (verbose > 1) { + int k = 0; + printf("Binary data of Carrier p2p connectivity"\ + " record starting from mfg id\n"); + for (k = 0; k < (record->header.len); k++) { + printf("%02x ", record->data[k]); } - else { - printf("\tPort %d =====> On Carrier Device ID %d, Port %d\n", - port_desc->local_port, - (port_desc->remote_resource_id & 0x0f), - port_desc->remote_port); + printf("\n"); + } + while (offset <= (record->header.len - START_DATA_OFFSET)) { + rsc_desc.resource_id = record->data[offset++]; + rsc_desc.p2p_count = record->data[offset++]; + if (verbose > 0) { + printf("resource id= %02x port count= %d\n", + rsc_desc.resource_id, rsc_desc.p2p_count); } - rsc_desc.p2p_count--; - } - } - return_value = OK_STATUS; - } - return return_value; + /* check if it is an AMC Module */ + if ((rsc_desc.resource_id & AMC_MODULE) == AMC_MODULE) { + /* check if it is an RTM module */ + if (rsc_desc.resource_id == AMC_MODULE) { + printf(" %s topology:\n", + val2str(RTM_IPMB_L, + ipmi_ekanalyzer_IPMBL_addr)); + } else { + /* The last four bits of resource ID + * represent site number (mask = 0x0f) + */ + printf(" %s topology:\n", + val2str((rsc_desc.resource_id & 0x0f), + ipmi_ekanalyzer_module_type)); + } + } else { + printf(" On Carrier Device ID %d topology: \n", + (rsc_desc.resource_id & 0x0f)); + } + while (rsc_desc.p2p_count > 0) { + unsigned char data[3]; +# ifndef WORDS_BIGENDIAN + data[0] = record->data[offset + 0]; + data[1] = record->data[offset + 1]; + data[2] = record->data[offset + 2]; +# else + data[0] = record->data[offset + 2]; + data[1] = record->data[offset + 1]; + data[2] = record->data[offset + 0]; +# endif + port_desc = (struct fru_picmgext_carrier_p2p_descriptor*)data; + offset += sizeof(struct fru_picmgext_carrier_p2p_descriptor); + if ((port_desc->remote_resource_id & AMC_MODULE) == AMC_MODULE) { + printf("\tPort %d =====> %s, Port %d\n", + port_desc->local_port, + val2str((port_desc->remote_resource_id & 0x0f), + ipmi_ekanalyzer_module_type), + port_desc->remote_port); + } else { + printf("\tPort %d =====> On Carrier Device ID %d, Port %d\n", + port_desc->local_port, + (port_desc->remote_resource_id & 0x0f), + port_desc->remote_port); + } + rsc_desc.p2p_count--; + } + } + return OK_STATUS; } /************************************************************************** @@ -1050,30 +1024,33 @@ ipmi_ek_display_power( int argc, char * opt, char ** filename, int * file_type ) ***************************************************************************/ static void ipmi_ek_display_current_descriptor( - struct fru_picmgext_carrier_activation_record car, - struct fru_picmgext_activation_record * cur_desc, char * filename ) + struct fru_picmgext_carrier_activation_record car, + struct fru_picmgext_activation_record *cur_desc, + char *filename) { - int index = 0; - float power_in_watt = 0.0; - float current_in_amp = 0.0; - - for ( index = 0; index < car.module_activation_record_count; index++ ){ - /*See AMC.0 specification, Table 3-12 for detail about calculation*/ - current_in_amp = (float) cur_desc[index].max_module_curr * 0.1; - power_in_watt = (float) current_in_amp * AMC_VOLTAGE; - - printf(" Carrier AMC power available on %s:\n", - val2str( cur_desc[index].ibmb_addr, ipmi_ekanalyzer_IPMBL_addr ) ); - printf("\t- Local IPMB Address \t: %02x\n", cur_desc[index].ibmb_addr); - printf("\t- Maximum module Current\t: %.2f Watts (%.2f Amps)\n", - power_in_watt, current_in_amp ); - } - /*Display total power on Carrier*/ - current_in_amp = (float) car.max_internal_curr * 0.1; - power_in_watt = (float) current_in_amp * AMC_VOLTAGE; - printf(" Carrier AMC total power available for all bays from file '%s':", - filename); - printf(" %.2f Watts (%.2f Amps)\n", power_in_watt, current_in_amp ); + int index = 0; + float power_in_watt = 0.0; + float current_in_amp = 0.0; + for (index = 0; index < car.module_activation_record_count; index++) { + /* See AMC.0 specification, Table 3-12 for + * detail about calculation + */ + current_in_amp = (float)cur_desc[index].max_module_curr * 0.1; + power_in_watt = (float)current_in_amp * AMC_VOLTAGE; + printf(" Carrier AMC power available on %s:\n", + val2str( cur_desc[index].ibmb_addr, + ipmi_ekanalyzer_IPMBL_addr)); + printf("\t- Local IPMB Address \t: %02x\n", + cur_desc[index].ibmb_addr); + printf("\t- Maximum module Current\t: %.2f Watts (%.2f Amps)\n", + power_in_watt, current_in_amp); + } + /* Display total power on Carrier */ + current_in_amp = (float)car.max_internal_curr * 0.1; + power_in_watt = (float)current_in_amp * AMC_VOLTAGE; + printf(" Carrier AMC total power available for all bays from file '%s':", + filename); + printf(" %.2f Watts (%.2f Amps)\n", power_in_watt, current_in_amp); } /************************************************************************** @@ -1901,72 +1878,60 @@ ipmi_ek_compare_channel_descriptor( ***************************************************************************/ static int ipmi_ek_compare_link_descriptor( - struct ipmi_ek_amc_p2p_connectivity_record record1, int index1, - struct ipmi_ek_amc_p2p_connectivity_record record2, int index2 ) + struct ipmi_ek_amc_p2p_connectivity_record record1, + int index1, + struct ipmi_ek_amc_p2p_connectivity_record record2, + int index2) { - int result = ERROR_STATUS; - - if (record1.link_desc[index1].type == record2.link_desc[index2].type){ - /*if it is an OEM type, we compare the OEM GUID*/ - if ( (record1.link_desc[index1].type >= LOWER_OEM_TYPE) - && (record1.link_desc[index1].type <= UPPER_OEM_TYPE) - ){ - if ( (record1.guid_count == 0) && (record2.guid_count == 0) ){ - /*there is no GUID for comparison, so the result is always OK*/ - result = OK_STATUS; - } - else{ - int i=0; - int j=0; - - for( i=0; i= LOWER_OEM_TYPE) + && (record1.link_desc[index1].type <= UPPER_OEM_TYPE)) { + if ((record1.guid_count == 0) && (record2.guid_count == 0)) { + /*there is no GUID for comparison, so the result is always OK*/ + result = OK_STATUS; + } else { + int i = 0; + int j = 0; + for (i = 0; i < record1.guid_count; i++) { + for (j = 0; j < record2.guid_count; j++) { + if (memcmp(&record1.oem_guid[i], + &record2.oem_guid[j], + SIZE_OF_GUID) == 0) { + result = OK_STATUS; + break; + } + } + } + } + } else { + result = OK_STATUS; + } + if (result != OK_STATUS) { + return result; + } + if (record1.link_desc[index1].type_ext == record2.link_desc[index2].type_ext) { + unsigned char asym[COMPARE_CANDIDATE]; + int offset = 0; + asym[offset++] = record1.link_desc[index1].asym_match; + asym[offset] = record2.link_desc[index2].asym_match; + result = ipmi_ek_compare_asym (asym); + if (result == OK_STATUS){ + struct fru_picmgext_amc_link_desc_record link[COMPARE_CANDIDATE]; + int index = 0; + link[index++] = record1.link_desc[index1]; + link[index] = record2.link_desc[index2]; + result = ipmi_ek_compare_number_of_enable_port(link); + } else { + result = ERROR_STATUS; + } + } else { + result = ERROR_STATUS; + } + return result; } /************************************************************************** @@ -1989,22 +1954,20 @@ ipmi_ek_compare_link_descriptor( ***************************************************************************/ static int -ipmi_ek_compare_asym( unsigned char asym[COMPARE_CANDIDATE] ) +ipmi_ek_compare_asym(unsigned char asym[COMPARE_CANDIDATE]) { - int return_value = ERROR_STATUS; - int first_index = 0; - int second_index = 1; - - if ( (asym[first_index] == 0) && (asym[second_index] == 0) ){ - return_value = OK_STATUS; - } - else if ( (asym[first_index] & asym[second_index]) == 0 ){ - return_value = OK_STATUS; - } - else{ - return_value = ERROR_STATUS; - } - return return_value; + int return_value = ERROR_STATUS; + int first_index = 0; + int second_index = 1; + + if ((asym[first_index] == 0) && (asym[second_index] == 0)) { + return_value = OK_STATUS; + } else if ((asym[first_index] & asym[second_index]) == 0) { + return_value = OK_STATUS; + } else { + return_value = ERROR_STATUS; + } + return return_value; } /************************************************************************** @@ -2027,50 +1990,55 @@ ipmi_ek_compare_asym( unsigned char asym[COMPARE_CANDIDATE] ) ***************************************************************************/ static int ipmi_ek_compare_number_of_enable_port( - struct fru_picmgext_amc_link_desc_record link_desc[COMPARE_CANDIDATE] ) + struct fru_picmgext_amc_link_desc_record link_desc[COMPARE_CANDIDATE]) { - int amc_port_count = 0; - int carrier_port_count = 0; - int return_value = ERROR_STATUS; - int index = 0; - - if (link_desc[index].port_flag_0){ /*bit 0 indicates port 0*/ - amc_port_count++; - } - if (link_desc[index].port_flag_1){ /*bit 1 indicates port 1*/ - amc_port_count++; - } - if (link_desc[index].port_flag_2){ /*bit 2 indicates port 2*/ - amc_port_count++; - } - if (link_desc[index++].port_flag_3){ /*bit 3 indicates port 3*/ - amc_port_count++; - } - - /*2nd link designator*/ - if (link_desc[index].port_flag_0){ /*bit 0 indicates port 0*/ - carrier_port_count++; - } - if (link_desc[index].port_flag_1){ /*bit 1 indicates port 1*/ - carrier_port_count++; - } - if (link_desc[index].port_flag_2){ /*bit 2 indicates port 2*/ - carrier_port_count++; - } - if (link_desc[index].port_flag_3){ /*bit 3 indicates port 3*/ - carrier_port_count++; - } + int amc_port_count = 0; + int carrier_port_count = 0; + int return_value = ERROR_STATUS; + int index = 0; + + if (link_desc[index].port_flag_0) { + /*bit 0 indicates port 0*/ + amc_port_count++; + } + if (link_desc[index].port_flag_1) { + /*bit 1 indicates port 1*/ + amc_port_count++; + } + if (link_desc[index].port_flag_2) { + /*bit 2 indicates port 2*/ + amc_port_count++; + } + if (link_desc[index++].port_flag_3) { + /*bit 3 indicates port 3*/ + amc_port_count++; + } - if(carrier_port_count == amc_port_count){ + /* 2nd link designator */ + if (link_desc[index].port_flag_0) { + /*bit 0 indicates port 0*/ + carrier_port_count++; + } + if (link_desc[index].port_flag_1) { + /*bit 1 indicates port 1*/ + carrier_port_count++; + } + if (link_desc[index].port_flag_2) { + /*bit 2 indicates port 2*/ + carrier_port_count++; + } + if (link_desc[index].port_flag_3) { + /*bit 3 indicates port 3*/ + carrier_port_count++; + } - return_value = OK_STATUS; - } - else{ - return_value = ERROR_STATUS; - } - - return return_value; -} + if (carrier_port_count == amc_port_count) { + return_value = OK_STATUS; + } else { + return_value = ERROR_STATUS; + } + return return_value; +} /************************************************************************** * @@ -2096,70 +2064,75 @@ ipmi_ek_compare_number_of_enable_port( * ***************************************************************************/ static tboolean -ipmi_ek_display_link_descriptor( int file_type, unsigned char rsc_id, - char * str, struct fru_picmgext_amc_link_desc_record link_desc ) +ipmi_ek_display_link_descriptor(int file_type, unsigned char rsc_id, + char *str, + struct fru_picmgext_amc_link_desc_record link_desc) { - tboolean isOEMtype = FALSE; - - if (file_type == ON_CARRIER_FRU_FILE){ - printf(" - %s On-Carrier Device ID %d\n", str, (rsc_id & 0x0f) ); - } - else{ - printf(" - %s %s\n", str, - val2str(file_type,ipmi_ekanalyzer_module_type)); - } - - printf(" - Channel ID %d || ", link_desc.channel_id ); - printf("%s", link_desc.port_flag_0 ? "Lane 0: enable" : ""); - printf("%s", link_desc.port_flag_1 ? ", Lane 1: enable" : ""); - printf("%s", link_desc.port_flag_2 ? ", Lane 2: enable" : ""); - printf("%s", link_desc.port_flag_3 ? ", Lane 3: enable" : ""); - - printf("\n"); - printf(" - Link Type: %s \n", - val2str (link_desc.type, ipmi_ekanalyzer_link_type) ); - switch ( link_desc.type ){ - case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE: - case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS1: - case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS2: - printf(" - Link Type extension: %s\n", - val2str (link_desc.type_ext, ipmi_ekanalyzer_extension_PCIE) ); - printf(" - Link Group ID: %d || ", link_desc.group_id ); - printf("Link Asym. Match: %d - %s\n", - link_desc.asym_match, - val2str (link_desc.asym_match, ipmi_ekanalyzer_asym_PCIE) ); - break; - case FRU_PICMGEXT_AMC_LINK_TYPE_ETHERNET: - printf(" - Link Type extension: %s\n", - val2str (link_desc.type_ext, ipmi_ekanalyzer_extension_ETHERNET) ); - printf(" - Link Group ID: %d || ", link_desc.group_id ); - printf("Link Asym. Match: %d - %s\n", - link_desc.asym_match, - val2str (link_desc.asym_match, ipmi_ekanalyzer_asym_PCIE) ); - break; - case FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE: - printf(" - Link Type extension: %s\n", - val2str (link_desc.type_ext, ipmi_ekanalyzer_extension_STORAGE) ); - printf(" - Link Group ID: %d || ", link_desc.group_id ); - printf("Link Asym. Match: %d - %s\n", - link_desc.asym_match, - val2str (link_desc.asym_match, ipmi_ekanalyzer_asym_STORAGE) ); - break; - default: - printf(" - Link Type extension: %i\n", link_desc.type_ext ); - printf(" - Link Group ID: %d || ", link_desc.group_id ); - printf("Link Asym. Match: %i\n", link_desc.asym_match); - break; - } - /*return as OEM type if link type indicates OEM*/ - if ( (link_desc.type >= LOWER_OEM_TYPE) - && - (link_desc.type <= UPPER_OEM_TYPE) - ){ - isOEMtype = TRUE; - } - - return isOEMtype; + tboolean isOEMtype = FALSE; + if (file_type == ON_CARRIER_FRU_FILE) { + printf(" - %s On-Carrier Device ID %d\n", str, + (rsc_id & 0x0f)); + } else { + printf(" - %s %s\n", str, val2str(file_type, + ipmi_ekanalyzer_module_type)); + } + printf(" - Channel ID %d || ", link_desc.channel_id); + printf("%s", link_desc.port_flag_0 ? "Lane 0: enable" : ""); + printf("%s", link_desc.port_flag_1 ? ", Lane 1: enable" : ""); + printf("%s", link_desc.port_flag_2 ? ", Lane 2: enable" : ""); + printf("%s", link_desc.port_flag_3 ? ", Lane 3: enable" : ""); + printf("\n"); + printf(" - Link Type: %s \n", val2str(link_desc.type, + ipmi_ekanalyzer_link_type)); + switch (link_desc.type) { + case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE: + case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS1: + case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS2: + printf(" - Link Type extension: %s\n", + val2str(link_desc.type_ext, + ipmi_ekanalyzer_extension_PCIE)); + printf(" - Link Group ID: %d || ", link_desc.group_id); + printf("Link Asym. Match: %d - %s\n", + link_desc.asym_match, + val2str(link_desc.asym_match, + ipmi_ekanalyzer_asym_PCIE)); + break; + case FRU_PICMGEXT_AMC_LINK_TYPE_ETHERNET: + printf(" - Link Type extension: %s\n", + val2str(link_desc.type_ext, + ipmi_ekanalyzer_extension_ETHERNET)); + printf(" - Link Group ID: %d || ", link_desc.group_id); + printf("Link Asym. Match: %d - %s\n", + link_desc.asym_match, + val2str(link_desc.asym_match, + ipmi_ekanalyzer_asym_PCIE)); + break; + case FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE: + printf(" - Link Type extension: %s\n", + val2str(link_desc.type_ext, + ipmi_ekanalyzer_extension_STORAGE)); + printf(" - Link Group ID: %d || ", + link_desc.group_id); + printf("Link Asym. Match: %d - %s\n", + link_desc.asym_match, + val2str(link_desc.asym_match, + ipmi_ekanalyzer_asym_STORAGE)); + break; + default: + printf(" - Link Type extension: %i\n", + link_desc.type_ext); + printf(" - Link Group ID: %d || ", + link_desc.group_id); + printf("Link Asym. Match: %i\n", + link_desc.asym_match); + break; + } + /* return as OEM type if link type indicates OEM */ + if ((link_desc.type >= LOWER_OEM_TYPE) + && (link_desc.type <= UPPER_OEM_TYPE)) { + isOEMtype = TRUE; + } + return isOEMtype; } /************************************************************************** @@ -2180,26 +2153,27 @@ ipmi_ek_display_link_descriptor( int file_type, unsigned char rsc_id, * ***************************************************************************/ static void -ipmi_ek_display_oem_guid( - struct ipmi_ek_amc_p2p_connectivity_record amc_record ) +ipmi_ek_display_oem_guid(struct ipmi_ek_amc_p2p_connectivity_record amc_record) { - int index_oem = 0; - int index = 0; - - if ( amc_record.guid_count == 0 ){ - printf("\tThere is no OEM GUID for this module\n"); - } - for (index_oem = 0; index_oem < amc_record.guid_count; index_oem++){ - printf(" - GUID: "); - for(index = 0; index < SIZE_OF_GUID; index++){ - printf("%02x", amc_record.oem_guid[index_oem].guid[index]); - /*For a better look: putting a "-" after displaying four bytes of GUID*/ - if (!(index % 4)){ - printf("-"); - } - } - printf("\n"); - } + int index_oem = 0; + int index = 0; + if (amc_record.guid_count == 0) { + printf("\tThere is no OEM GUID for this module\n"); + } + for (index_oem = 0; index_oem < amc_record.guid_count; index_oem++) { + printf(" - GUID: "); + for (index = 0; index < SIZE_OF_GUID; index++) { + printf("%02x", + amc_record.oem_guid[index_oem].guid[index]); + /* For a better look: putting a "-" after displaying + * four bytes of GUID + */ + if (!(index % 4)){ + printf("-"); + } + } + printf("\n"); + } } /************************************************************************** @@ -2222,8 +2196,8 @@ ipmi_ek_display_oem_guid( * ***************************************************************************/ static int -ipmi_ek_create_amc_p2p_record(struct ipmi_ek_multi_header * record, - struct ipmi_ek_amc_p2p_connectivity_record * amc_record) +ipmi_ek_create_amc_p2p_record(struct ipmi_ek_multi_header *record, + struct ipmi_ek_amc_p2p_connectivity_record *amc_record) { int index_data = START_DATA_OFFSET; int return_status = OK_STATUS; @@ -2334,20 +2308,18 @@ ipmi_ek_create_amc_p2p_record(struct ipmi_ek_multi_header * record, * ***************************************************************************/ static int -ipmi_ek_get_resource_descriptor( int port_count, int index, - struct fru_picmgext_carrier_p2p_descriptor * port_desc, - struct ipmi_ek_multi_header * record ) +ipmi_ek_get_resource_descriptor(int port_count, int index, + struct fru_picmgext_carrier_p2p_descriptor *port_desc, + struct ipmi_ek_multi_header *record) { - int num_port = 0; - - while ( num_port < port_count ){ - memcpy ( &port_desc[num_port], &record->data[index], - sizeof (struct fru_picmgext_carrier_p2p_descriptor) ); - index += sizeof (struct fru_picmgext_carrier_p2p_descriptor); - num_port++; - } - - return index; + int num_port = 0; + while (num_port < port_count) { + memcpy(&port_desc[num_port], &record->data[index], + sizeof (struct fru_picmgext_carrier_p2p_descriptor)); + index += sizeof (struct fru_picmgext_carrier_p2p_descriptor); + num_port++; + } + return index; } /************************************************************************** @@ -2369,9 +2341,9 @@ ipmi_ek_get_resource_descriptor( int port_count, int index, * ***************************************************************************/ static int -ipmi_ek_display_fru_header(char * filename) +ipmi_ek_display_fru_header(char *filename) { - FILE * input_file; + FILE *input_file; struct fru_header header; int ret = 0; @@ -2424,11 +2396,11 @@ ipmi_ek_display_fru_header(char * filename) * ***************************************************************************/ static int -ipmi_ek_display_fru_header_detail(char * filename) +ipmi_ek_display_fru_header_detail(char *filename) { # define FACTOR_OFFSET 8 # define SIZE_MFG_DATE 3 - FILE * input_file; + FILE *input_file; size_t file_offset = 0; struct fru_header header; time_t tval; @@ -2623,7 +2595,7 @@ ipmi_ek_display_fru_header_detail(char * filename) * ***************************************************************************/ static int -ipmi_ek_display_chassis_info_area(FILE * input_file, long offset) +ipmi_ek_display_chassis_info_area(FILE *input_file, long offset) { size_t file_offset; int ret = 0; @@ -2707,8 +2679,8 @@ ipmi_ek_display_chassis_info_area(FILE * input_file, long offset) * ***************************************************************************/ static size_t -ipmi_ek_display_board_info_area(FILE * input_file, char * board_type, - unsigned int * board_length) +ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, + unsigned int *board_length) { size_t file_offset; int ret = 0; @@ -2845,7 +2817,7 @@ out: * ***************************************************************************/ static int -ipmi_ek_display_product_info_area(FILE * input_file, long offset) +ipmi_ek_display_product_info_area(FILE *input_file, long offset) { size_t file_offset; int ret = 0; @@ -2950,102 +2922,105 @@ ipmi_ek_display_product_info_area(FILE * input_file, long offset) * ***************************************************************************/ static void -ipmi_ek_display_record( struct ipmi_ek_multi_header * record, - struct ipmi_ek_multi_header * list_head, - struct ipmi_ek_multi_header * list_last ) +ipmi_ek_display_record(struct ipmi_ek_multi_header *record, + struct ipmi_ek_multi_header *list_head, + struct ipmi_ek_multi_header *list_last) { - if ( list_head == NULL ){ - printf("***empty list***\n"); - } - else{ - printf("%s\n", EQUAL_LINE_LIMITER); - printf("FRU Multi Info area\n"); - printf("%s\n", EQUAL_LINE_LIMITER); - for ( record = list_head; record != NULL; record = record->next ){ - printf("Record Type ID: 0x%02x\n", record->header.type); - printf("Record Format version: 0x%02x\n", record->header.format); - if (record->header.len > PICMG_ID_OFFSET){ - /* In picmg3.0 specification, picmg record id lower than 4 or - * greater than 0x2d is not supported - */ - #define PICMG_ID_LOWER_LIMIT 0x04 - #define PICMG_ID_UPPER_LIMIT 0x2d - unsigned char picmg_id; - - picmg_id = record->data[PICMG_ID_OFFSET]; - printf("Manufacturer ID: %02x%02x%02x h\n", record->data[2], - record->data[1], record->data[0] ); - if( ( picmg_id < PICMG_ID_LOWER_LIMIT ) - || - ( picmg_id > PICMG_ID_UPPER_LIMIT ) ){ - printf("Picmg record ID: Unsupported {0x%02x}\n", picmg_id ); - } - else{ - printf("Picmg record ID: %s {0x%02x}\n", - val2str(picmg_id, ipmi_ekanalyzer_picmg_record_id), - picmg_id ); - } - switch (picmg_id){ - case FRU_PICMG_BACKPLANE_P2P: /*0x04*/ - ipmi_ek_display_backplane_p2p_record (record); - break; - case FRU_PICMG_ADDRESS_TABLE: /*0x10*/ - ipmi_ek_display_address_table_record (record); - break; - case FRU_PICMG_SHELF_POWER_DIST: /*0x11*/ - ipmi_ek_display_shelf_power_distribution_record (record); - break; - case FRU_PICMG_SHELF_ACTIVATION: /*/0x12*/ - ipmi_ek_display_shelf_activation_record (record); - break; - case FRU_PICMG_SHMC_IP_CONN: /*0x13*/ - ipmi_ek_display_shelf_ip_connection_record (record); - break; - case FRU_PICMG_BOARD_P2P: /*0x14*/ - ipmi_ek_display_board_p2p_record (record); - break; - case FRU_RADIAL_IPMB0_LINK_MAPPING: /*0x15*/ - ipmi_ek_display_radial_ipmb0_record (record); - break; - case FRU_AMC_CURRENT: /*0x16*/ - ipmi_ek_display_amc_current_record (record); - break; - case FRU_AMC_ACTIVATION: /*0x17*/ - ipmi_ek_display_amc_activation_record (record); - break; - case FRU_AMC_CARRIER_P2P: /*0x18*/ - ipmi_ek_display_carrier_connectivity (record); - break; - case FRU_AMC_P2P: /*0x19*/ - ipmi_ek_display_amc_p2p_record (record); - break; - case FRU_AMC_CARRIER_INFO: /*0x1a*/ - ipmi_ek_display_amc_carrier_info_record (record); - break; - case FRU_PICMG_CLK_CARRIER_P2P: /*0x2c*/ - ipmi_ek_display_clock_carrier_p2p_record (record); - break; - case FRU_PICMG_CLK_CONFIG: /*0x2d*/ - ipmi_ek_display_clock_config_record (record); - break; - default: - if (verbose > 0){ - int i; - printf("%02x %02x %02x %02x %02x ", record->header.type, - record->header.format, record->header.len, - record->header.record_checksum, - record->header.header_checksum ); - for ( i = 0; i < record->header.len; i++ ){ - printf("%02x ", record->data[i]); - } - printf("\n"); - } - break; - } - printf("%s\n", STAR_LINE_LIMITER); - } - } - } + if (list_head == NULL) { + printf("***empty list***\n"); + return; + } + printf("%s\n", EQUAL_LINE_LIMITER); + printf("FRU Multi Info area\n"); + printf("%s\n", EQUAL_LINE_LIMITER); + for (record = list_head; record != NULL; record = record->next) { + printf("Record Type ID: 0x%02x\n", record->header.type); + printf("Record Format version: 0x%02x\n", + record->header.format); + if (record->header.len <= PICMG_ID_OFFSET) { + continue; + } + /* In picmg3.0 specification, picmg record + * id lower than 4 or greater than 0x2d + * isn't supported + */ + #define PICMG_ID_LOWER_LIMIT 0x04 + #define PICMG_ID_UPPER_LIMIT 0x2d + unsigned char picmg_id; + + picmg_id = record->data[PICMG_ID_OFFSET]; + printf("Manufacturer ID: %02x%02x%02x h\n", + record->data[2], record->data[1], + record->data[0]); + if ((picmg_id < PICMG_ID_LOWER_LIMIT) + || (picmg_id > PICMG_ID_UPPER_LIMIT)) { + printf("Picmg record ID: Unsupported {0x%02x}\n", picmg_id); + } else { + printf("Picmg record ID: %s {0x%02x}\n", + val2str(picmg_id, ipmi_ekanalyzer_picmg_record_id), + picmg_id); + } + switch (picmg_id) { + case FRU_PICMG_BACKPLANE_P2P: /*0x04*/ + ipmi_ek_display_backplane_p2p_record (record); + break; + case FRU_PICMG_ADDRESS_TABLE: /*0x10*/ + ipmi_ek_display_address_table_record (record); + break; + case FRU_PICMG_SHELF_POWER_DIST: /*0x11*/ + ipmi_ek_display_shelf_power_distribution_record (record); + break; + case FRU_PICMG_SHELF_ACTIVATION: /*/0x12*/ + ipmi_ek_display_shelf_activation_record (record); + break; + case FRU_PICMG_SHMC_IP_CONN: /*0x13*/ + ipmi_ek_display_shelf_ip_connection_record (record); + break; + case FRU_PICMG_BOARD_P2P: /*0x14*/ + ipmi_ek_display_board_p2p_record (record); + break; + case FRU_RADIAL_IPMB0_LINK_MAPPING: /*0x15*/ + ipmi_ek_display_radial_ipmb0_record (record); + break; + case FRU_AMC_CURRENT: /*0x16*/ + ipmi_ek_display_amc_current_record (record); + break; + case FRU_AMC_ACTIVATION: /*0x17*/ + ipmi_ek_display_amc_activation_record (record); + break; + case FRU_AMC_CARRIER_P2P: /*0x18*/ + ipmi_ek_display_carrier_connectivity (record); + break; + case FRU_AMC_P2P: /*0x19*/ + ipmi_ek_display_amc_p2p_record (record); + break; + case FRU_AMC_CARRIER_INFO: /*0x1a*/ + ipmi_ek_display_amc_carrier_info_record (record); + break; + case FRU_PICMG_CLK_CARRIER_P2P: /*0x2c*/ + ipmi_ek_display_clock_carrier_p2p_record (record); + break; + case FRU_PICMG_CLK_CONFIG: /*0x2d*/ + ipmi_ek_display_clock_config_record (record); + break; + default: + if (verbose > 0) { + int i; + printf("%02x %02x %02x %02x %02x ", + record->header.type, + record->header.format, + record->header.len, + record->header.record_checksum, + record->header.header_checksum); + for (i = 0; i < record->header.len; i++) { + printf("%02x ", record->data[i]); + } + printf("\n"); + } + break; + } + printf("%s\n", STAR_LINE_LIMITER); + } } /************************************************************************** @@ -3066,62 +3041,59 @@ ipmi_ek_display_record( struct ipmi_ek_multi_header * record, * ***************************************************************************/ static void -ipmi_ek_display_backplane_p2p_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_backplane_p2p_record(struct ipmi_ek_multi_header *record) { - uint8_t index; - int offset = START_DATA_OFFSET; - struct fru_picmgext_slot_desc * slot_d - = (struct fru_picmgext_slot_desc*) &record->data[offset]; - - offset += sizeof(struct fru_picmgext_slot_desc); - - while ( offset <= record->header.len ) { - printf(" Channel Type: "); - switch ( slot_d -> chan_type ) - { - case 0x00: - case 0x07: - printf("PICMG 2.9\n"); - break; - case 0x08: - printf("Single Port Fabric IF\n"); - break; - case 0x09: - printf("Double Port Fabric IF\n"); - break; - case 0x0a: - printf("Full Channel Fabric IF\n"); - break; - case 0x0b: - printf("Base IF\n"); - break; - case 0x0c: - printf("Update Channel IF\n"); - break; - default: - printf("Unknown IF\n"); - break; - } - printf(" Slot Address: %02x\n", slot_d -> slot_addr); - printf(" Channel Count: %i\n", slot_d -> chn_count); - - for ( index = 0; index < (slot_d -> chn_count); index++ ) { - struct fru_picmgext_chn_desc * d - = (struct fru_picmgext_chn_desc *) &record->data[offset]; - - if ( verbose ){ - printf( "\t" - "Chn: %02x --> " - "Chn: %02x in " - "Slot: %02x\n", - d->local_chn, d->remote_chn, d->remote_slot - ); - } - offset += sizeof(struct fru_picmgext_chn_desc); - } - slot_d = (struct fru_picmgext_slot_desc*) &record->data[offset]; - offset += sizeof(struct fru_picmgext_slot_desc); - } + uint8_t index; + int offset = START_DATA_OFFSET; + struct fru_picmgext_slot_desc *slot_d = + (struct fru_picmgext_slot_desc*)&record->data[offset]; + + offset += sizeof(struct fru_picmgext_slot_desc); + while (offset <= record->header.len) { + printf(" Channel Type: "); + switch (slot_d->chan_type) { + case 0x00: + case 0x07: + printf("PICMG 2.9\n"); + break; + case 0x08: + printf("Single Port Fabric IF\n"); + break; + case 0x09: + printf("Double Port Fabric IF\n"); + break; + case 0x0a: + printf("Full Channel Fabric IF\n"); + break; + case 0x0b: + printf("Base IF\n"); + break; + case 0x0c: + printf("Update Channel IF\n"); + break; + default: + printf("Unknown IF\n"); + break; + } + printf(" Slot Address: %02x\n", slot_d->slot_addr); + printf(" Channel Count: %i\n", slot_d->chn_count); + for (index = 0; index < (slot_d->chn_count); index++) { + struct fru_picmgext_chn_desc *d = + (struct fru_picmgext_chn_desc *)&record->data[offset]; + if (verbose) { + printf("\t" + "Chn: %02x --> " + "Chn: %02x in " + "Slot: %02x\n", + d->local_chn, + d->remote_chn, + d->remote_slot); + } + offset += sizeof(struct fru_picmgext_chn_desc); + } + slot_d = (struct fru_picmgext_slot_desc*)&record->data[offset]; + offset += sizeof(struct fru_picmgext_slot_desc); + } } /************************************************************************** @@ -3142,30 +3114,28 @@ ipmi_ek_display_backplane_p2p_record( struct ipmi_ek_multi_header * record ) * ***************************************************************************/ static void -ipmi_ek_display_address_table_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_address_table_record(struct ipmi_ek_multi_header *record) { - unsigned char entries = 0; - unsigned char i; - int offset = START_DATA_OFFSET; - #define SIZE_SHELF_ADDRESS_BYTE 20 - - printf(" Type/Len: 0x%02x\n", record->data[offset++]); - printf(" Shelf Addr: "); - for ( i = 0; i < SIZE_SHELF_ADDRESS_BYTE; i++ ){ - printf("0x%02x ", record->data[offset++]); - } - printf("\n"); - - entries = record->data[offset++]; - printf(" Addr Table Entries count: 0x%02x\n", entries); - - for ( i = 0; i < entries; i++ ){ - printf("\tHWAddr: 0x%02x - SiteNum: 0x%02x - SiteType: 0x%02x \n", - record->data[offset+0], - record->data[offset+1], - record->data[offset+2]); - offset += 3; - } +#define SIZE_SHELF_ADDRESS_BYTE 20 + unsigned char entries = 0; + unsigned char i; + int offset = START_DATA_OFFSET; + + printf(" Type/Len: 0x%02x\n", record->data[offset++]); + printf(" Shelf Addr: "); + for (i = 0; i < SIZE_SHELF_ADDRESS_BYTE; i++) { + printf("0x%02x ", record->data[offset++]); + } + printf("\n"); + entries = record->data[offset++]; + printf(" Addr Table Entries count: 0x%02x\n", entries); + for (i = 0; i < entries; i++) { + printf("\tHWAddr: 0x%02x - SiteNum: 0x%02x - SiteType: 0x%02x \n", + record->data[offset+0], + record->data[offset+1], + record->data[offset+2]); + offset += 3; + } } /************************************************************************** @@ -3187,36 +3157,38 @@ ipmi_ek_display_address_table_record( struct ipmi_ek_multi_header * record ) ***************************************************************************/ static void ipmi_ek_display_shelf_power_distribution_record( - struct ipmi_ek_multi_header * record ) + struct ipmi_ek_multi_header *record) { - int offset = START_DATA_OFFSET; - unsigned char i,j; - unsigned char feeds = 0; - - feeds = record->data[offset++]; - printf(" Number of Power Feeds: 0x%02x\n", feeds); - - for (i=0; idata[offset+0] | (record->data[offset+1]<<8); - printf(" Max External Available Current: %ld Amps\n", (max_ext*10) ); - - offset += 2; - - max_int = record->data[offset+0] | (record->data[offset+1]<<8); - printf(" Max Internal Current:\t %ld Amps\n", (max_int*10)); - offset += 2; - printf(" Min Expected Operating Voltage: %d Volts\n", - (record->data[offset++]/2)); - entries = record->data[offset++]; - printf(" Feed to FRU count: 0x%02x\n", entries); - for (j=0; jdata[offset++]); - printf("\tFRU ID: 0x%02x\n", record->data[offset++]); - } - } + int offset = START_DATA_OFFSET; + unsigned char i; + unsigned char j; + unsigned char feeds = 0; + + feeds = record->data[offset++]; + printf(" Number of Power Feeds: 0x%02x\n", feeds); + for (i = 0; i < feeds; i++) { + unsigned char entries; + unsigned long max_ext = 0; + unsigned long max_int = 0; + max_ext = record->data[offset+0] + | (record->data[offset+1] << 8); + printf(" Max External Available Current: %ld Amps\n", + (max_ext * 10)); + offset += 2; + max_int = record->data[offset+0] + | (record->data[offset+1] << 8); + printf(" Max Internal Current:\t %ld Amps\n", + (max_int * 10)); + offset += 2; + printf(" Min Expected Operating Voltage: %d Volts\n", + (record->data[offset++] / 2)); + entries = record->data[offset++]; + printf(" Feed to FRU count: 0x%02x\n", entries); + for (j = 0; j < entries; j++) { + printf("\tHW: 0x%02x", record->data[offset++]); + printf("\tFRU ID: 0x%02x\n", record->data[offset++]); + } + } } /************************************************************************** @@ -3237,27 +3209,29 @@ ipmi_ek_display_shelf_power_distribution_record( * ***************************************************************************/ static void -ipmi_ek_display_shelf_activation_record( - struct ipmi_ek_multi_header * record ) +ipmi_ek_display_shelf_activation_record(struct ipmi_ek_multi_header *record) { - unsigned char count = 0; - int offset = START_DATA_OFFSET; - - printf(" Allowance for FRU Act Readiness: 0x%02x\n", - record->data[offset++]); - count = record->data[offset++]; - printf(" FRU activation and Power Desc Cnt: 0x%02x\n", count); - - while ( count > 0 ) { - printf(" FRU activation and Power descriptor:\n"); - printf("\tHardware Address:\t\t0x%02x\n", record->data[offset++]); - printf("\tFRU Device ID:\t\t\t0x%02x\n", record->data[offset++]); - printf("\tMax FRU Power Capability:\t0x%04x Watts\n", - ( record->data[offset+0] | (record->data[offset+1]<<8) )); - offset += 2; - printf("\tConfiguration parameter:\t0x%02x\n", record->data[offset++]); - count --; - } + unsigned char count = 0; + int offset = START_DATA_OFFSET; + + printf(" Allowance for FRU Act Readiness: 0x%02x\n", + record->data[offset++]); + count = record->data[offset++]; + printf(" FRU activation and Power Desc Cnt: 0x%02x\n", count); + while (count > 0) { + printf(" FRU activation and Power descriptor:\n"); + printf("\tHardware Address:\t\t0x%02x\n", + record->data[offset++]); + printf("\tFRU Device ID:\t\t\t0x%02x\n", + record->data[offset++]); + printf("\tMax FRU Power Capability:\t0x%04x Watts\n", + (record->data[offset+0] + | (record->data[offset+1]<<8))); + offset += 2; + printf("\tConfiguration parameter:\t0x%02x\n", + record->data[offset++]); + count --; + } } /************************************************************************** @@ -3279,28 +3253,33 @@ ipmi_ek_display_shelf_activation_record( * ***************************************************************************/ static void -ipmi_ek_display_shelf_ip_connection_record( - struct ipmi_ek_multi_header * record ) +ipmi_ek_display_shelf_ip_connection_record(struct ipmi_ek_multi_header *record) { - int ioffset = START_DATA_OFFSET; - if (ioffset > record->header.len) { - printf(" Shelf Manager IP Address: %d.%d.%d.%d\n", - record->data[ioffset+0], record->data[ioffset+1], - record->data[ioffset+2], record->data[ioffset+3]); - ioffset += 4; - } - if (ioffset > record->header.len) { - printf(" Default Gateway Address: %d.%d.%d.%d\n", - record->data[ioffset+0], record->data[ioffset+1], - record->data[ioffset+2], record->data[ioffset+3]); - ioffset += 4; - } - if (ioffset > record->header.len) { - printf(" Subnet Mask: %d.%d.%d.%d\n", - record->data[ioffset+0], record->data[ioffset+1], - record->data[ioffset+2], record->data[ioffset+3]); - ioffset += 4; - } + int ioffset = START_DATA_OFFSET; + if (ioffset > record->header.len) { + printf(" Shelf Manager IP Address: %d.%d.%d.%d\n", + record->data[ioffset+0], + record->data[ioffset+1], + record->data[ioffset+2], + record->data[ioffset+3]); + ioffset += 4; + } + if (ioffset > record->header.len) { + printf(" Default Gateway Address: %d.%d.%d.%d\n", + record->data[ioffset+0], + record->data[ioffset+1], + record->data[ioffset+2], + record->data[ioffset+3]); + ioffset += 4; + } + if (ioffset > record->header.len) { + printf(" Subnet Mask: %d.%d.%d.%d\n", + record->data[ioffset+0], + record->data[ioffset+1], + record->data[ioffset+2], + record->data[ioffset+3]); + ioffset += 4; + } } /************************************************************************** @@ -3322,28 +3301,30 @@ ipmi_ek_display_shelf_ip_connection_record( * ***************************************************************************/ static void -ipmi_ek_display_shelf_fan_geography_record( - struct ipmi_ek_multi_header * record ) +ipmi_ek_display_shelf_fan_geography_record(struct ipmi_ek_multi_header *record) { - int ioffset = START_DATA_OFFSET; - unsigned char fan_count = 0; - - fan_count = record->data[ioffset]; - ioffset++; - printf(" Fan-to-FRU Entry Count: 0x%02x\n", fan_count); - - while ( (fan_count > 0) && (ioffset <= record->header.len) ) { - printf(" Fan-to-FRU Mapping Entry: {%2x%2x%2x%2x}\n", - record->data[ioffset], record->data[ioffset+1], - record->data[ioffset+2], record->data[ioffset+3] - ); - printf(" Hardware Address: 0x%02x\n", record->data[ioffset++]); - printf(" FRU device ID: 0x%02x\n", record->data[ioffset++]); - printf(" Site Number: 0x%02x\n", record->data[ioffset++]); - printf(" Site Type: 0x%02x\n", record->data[ioffset++]); - fan_count --; - } - + int ioffset = START_DATA_OFFSET; + unsigned char fan_count = 0; + + fan_count = record->data[ioffset]; + ioffset++; + printf(" Fan-to-FRU Entry Count: 0x%02x\n", fan_count); + while ((fan_count > 0) && (ioffset <= record->header.len)) { + printf(" Fan-to-FRU Mapping Entry: {%2x%2x%2x%2x}\n", + record->data[ioffset], + record->data[ioffset+1], + record->data[ioffset+2], + record->data[ioffset+3]); + printf(" Hardware Address: 0x%02x\n", + record->data[ioffset++]); + printf(" FRU device ID: 0x%02x\n", + record->data[ioffset++]); + printf(" Site Number: 0x%02x\n", + record->data[ioffset++]); + printf(" Site Type: 0x%02x\n", + record->data[ioffset++]); + fan_count --; + } } /************************************************************************** @@ -3364,147 +3345,133 @@ ipmi_ek_display_shelf_fan_geography_record( * ***************************************************************************/ static void -ipmi_ek_display_board_p2p_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_board_p2p_record(struct ipmi_ek_multi_header *record) { - unsigned char guid_count; - int offset = START_DATA_OFFSET; - int i = 0; - - guid_count = record->data[offset++]; - printf(" GUID count: %2d\n", guid_count); - - for (i = 0 ; i < guid_count; i++ ) { - int j; - printf("\tGUID: "); - for (j=0; j < sizeof(struct fru_picmgext_guid); j++) { - printf("%02x", record->data[offset+j]); - } - printf("\n"); - offset += sizeof(struct fru_picmgext_guid); - } - - for ( offset; - offset < record->header.len; - offset += sizeof(struct fru_picmgext_link_desc) - ) { - /* to solve little endian /big endian problem */ - unsigned long data; - struct fru_picmgext_link_desc * d; - - data = (record->data[offset+0]) | (record->data[offset+1] << 8)\ - | (record->data[offset+2] << 16)\ - | (record->data[offset+3] << 24); - - d = (struct fru_picmgext_link_desc *) &data; - - printf(" Link Descriptor\n"); - printf("\tLink Grouping ID:\t0x%02x\n", d->grouping); - printf("\tLink Type Extension:\t0x%02x - ", d->ext); - - if (d->type == FRU_PICMGEXT_LINK_TYPE_BASE){ - switch (d->ext){ - case 0: - printf("10/100/1000BASE-T Link (four-pair)\n"); - break; - case 1: - printf("ShMC Cross-connect (two-pair)\n"); - break; - default: - printf("Unknwon\n"); - break; - } - } - else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET){ - switch (d->ext){ - case 0: - printf("Fixed 1000Base-BX\n"); - break; - case 1: - printf("Fixed 10GBASE-BX4 [XAUI]\n"); - break; - case 2: - printf("FC-PI\n"); - break; - default: - printf("Unknwon\n"); - break; - } - } - else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND){ - printf("Unknwon\n"); - } - else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR){ - printf("Unknwon\n"); - } - else if (d->type == FRU_PICMGEXT_LINK_TYPE_PCIE){ - printf("Unknwon\n"); - } - else{ - printf("Unknwon\n"); - } - - printf("\tLink Type:\t\t0x%02x - ",d->type); - if (d->type == 0 || d->type == 0xff){ - printf("Reserved\n"); - } - else if (d->type >= 0x06 && d->type <= 0xef) { - printf("Reserved\n"); - } - else if (d->type >= LOWER_OEM_TYPE && d->type <= UPPER_OEM_TYPE) { - printf("OEM GUID Definition\n"); - } - else { - switch (d->type){ - case FRU_PICMGEXT_LINK_TYPE_BASE: - printf("PICMG 3.0 Base Interface 10/100/1000\n"); - break; - case FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET: - printf("PICMG 3.1 Ethernet Fabric Interface\n"); - break; - case FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND: - printf("PICMG 3.2 Infiniband Fabric Interface\n"); - break; - case FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR: - printf("PICMG 3.3 Star Fabric Interface\n"); - break; - case FRU_PICMGEXT_LINK_TYPE_PCIE: - printf("PICMG 3.4 PCI Express Fabric Interface\n"); - break; - default: - printf("Invalid\n"); - break; - } - } - printf("\tLink Designator: \n"); - printf("\t Port 0 Flag: %s\n", - (d->desig_port & 0x01) ? "enable" : "disable"); - printf("\t Port 1 Flag: %s\n", - (d->desig_port & 0x02) ? "enable" : "disable"); - printf("\t Port 2 Flag: %s\n", - (d->desig_port & 0x04) ? "enable" : "disable"); - printf("\t Port 3 Flag: %s\n", - (d->desig_port & 0x08) ? "enable" : "disable"); - - printf("\t Interface: 0x%02x - ", d->desig_if); - switch (d->desig_if){ - case FRU_PICMGEXT_DESIGN_IF_BASE: - printf("Base Interface\n"); - break; - case FRU_PICMGEXT_DESIGN_IF_FABRIC: - printf("Fabric Interface\n"); - break; - case FRU_PICMGEXT_DESIGN_IF_UPDATE_CHANNEL: - printf("Update Channel\n"); - break; - case FRU_PICMGEXT_DESIGN_IF_RESERVED: - printf("Reserved\n"); - break; - default: - printf("Invalid"); - break; - } - printf("\t Channel Number: 0x%02x\n", d->desig_channel); - } + unsigned char guid_count; + int offset = START_DATA_OFFSET; + int i = 0; + + guid_count = record->data[offset++]; + printf(" GUID count: %2d\n", guid_count); + for (i = 0 ; i < guid_count; i++) { + int j; + printf("\tGUID: "); + for (j = 0; j < sizeof(struct fru_picmgext_guid); j++) { + printf("%02x", record->data[offset+j]); + } + printf("\n"); + offset += sizeof(struct fru_picmgext_guid); + } + for (offset; + offset < record->header.len; + offset += sizeof(struct fru_picmgext_link_desc)) { + /* to solve little endian/big endian problem */ + unsigned long data; + struct fru_picmgext_link_desc * d; + data = (record->data[offset+0]) + | (record->data[offset+1] << 8)\ + | (record->data[offset+2] << 16)\ + | (record->data[offset+3] << 24); + d = (struct fru_picmgext_link_desc *)&data; + + printf(" Link Descriptor\n"); + printf("\tLink Grouping ID:\t0x%02x\n", d->grouping); + printf("\tLink Type Extension:\t0x%02x - ", d->ext); + if (d->type == FRU_PICMGEXT_LINK_TYPE_BASE) { + switch (d->ext) { + case 0: + printf("10/100/1000BASE-T Link (four-pair)\n"); + break; + case 1: + printf("ShMC Cross-connect (two-pair)\n"); + break; + default: + printf("Unknwon\n"); + break; + } + } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET) { + switch (d->ext) { + case 0: + printf("Fixed 1000Base-BX\n"); + break; + case 1: + printf("Fixed 10GBASE-BX4 [XAUI]\n"); + break; + case 2: + printf("FC-PI\n"); + break; + default: + printf("Unknwon\n"); + break; + } + } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND) { + printf("Unknwon\n"); + } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR) { + printf("Unknwon\n"); + } else if (d->type == FRU_PICMGEXT_LINK_TYPE_PCIE) { + printf("Unknwon\n"); + } else { + printf("Unknwon\n"); + } + printf("\tLink Type:\t\t0x%02x - ", d->type); + if (d->type == 0 || d->type == 0xff) { + printf("Reserved\n"); + } else if (d->type >= 0x06 && d->type <= 0xef) { + printf("Reserved\n"); + } else if (d->type >= LOWER_OEM_TYPE && d->type <= UPPER_OEM_TYPE) { + printf("OEM GUID Definition\n"); + } else { + switch (d->type){ + case FRU_PICMGEXT_LINK_TYPE_BASE: + printf("PICMG 3.0 Base Interface 10/100/1000\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET: + printf("PICMG 3.1 Ethernet Fabric Interface\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND: + printf("PICMG 3.2 Infiniband Fabric Interface\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR: + printf("PICMG 3.3 Star Fabric Interface\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_PCIE: + printf("PICMG 3.4 PCI Express Fabric Interface\n"); + break; + default: + printf("Invalid\n"); + break; + } + } + printf("\tLink Designator: \n"); + printf("\t Port 0 Flag: %s\n", + (d->desig_port & 0x01) ? "enable" : "disable"); + printf("\t Port 1 Flag: %s\n", + (d->desig_port & 0x02) ? "enable" : "disable"); + printf("\t Port 2 Flag: %s\n", + (d->desig_port & 0x04) ? "enable" : "disable"); + printf("\t Port 3 Flag: %s\n", + (d->desig_port & 0x08) ? "enable" : "disable"); + printf("\t Interface: 0x%02x - ", d->desig_if); + switch (d->desig_if) { + case FRU_PICMGEXT_DESIGN_IF_BASE: + printf("Base Interface\n"); + break; + case FRU_PICMGEXT_DESIGN_IF_FABRIC: + printf("Fabric Interface\n"); + break; + case FRU_PICMGEXT_DESIGN_IF_UPDATE_CHANNEL: + printf("Update Channel\n"); + break; + case FRU_PICMGEXT_DESIGN_IF_RESERVED: + printf("Reserved\n"); + break; + default: + printf("Invalid"); + break; + } + printf("\t Channel Number: 0x%02x\n", + d->desig_channel); + } } /************************************************************************** @@ -3525,63 +3492,64 @@ ipmi_ek_display_board_p2p_record( struct ipmi_ek_multi_header * record ) * ***************************************************************************/ static void -ipmi_ek_display_radial_ipmb0_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_radial_ipmb0_record(struct ipmi_ek_multi_header *record) { - int offset = START_DATA_OFFSET; - #define SIZE_OF_CONNECTOR_DEFINER 3; /*bytes*/ - - /*Ref: PICMG 3.0 Specification Revision 2.0, Table 3-59*/ - printf(" IPMB-0 Connector Definer: "); - #ifndef WORDS_BIGENDIAN - printf("%02x %02x %02x h\n", record->data[offset], - record->data[offset+1], record->data[offset+2]); - #else - printf("%02x %02x %02x h\n", record->data[offset+2], - record->data[offset+1], record->data[offset]); - #endif - /*3 bytes of connector definer was used*/ - offset += SIZE_OF_CONNECTOR_DEFINER; - - printf (" IPMB-0 Connector version ID: "); - #ifndef WORDS_BIGENDIAN - printf("%02x %02x h\n", record->data[offset], record->data[offset+1]); - #else - printf("%02x %02x h\n", record->data[offset+1], record->data[offset]); - #endif - offset += 2; - - printf(" IPMB-0 Hub Descriptor Count: 0x%02x", record->data[offset++]); - if (record->data[offset] > 0){ - for (offset; offset < record->header.len;){ - unsigned char entry_count = 0; - printf(" IPMB-0 Hub Descriptor\n"); - printf("\tHardware Address: 0x%02x\n", record->data[offset++]); - printf("\tHub Info {0x%02x}: ", record->data[offset]); - /* Bit mask specified in Table 3-59 of PICMG 3.0 Specification */ - if ( (record->data[offset] & 0x01) == 0x01 ){ - printf("IPMB-A only\n"); - } - else if ( (record->data[offset] & 0x02) == 0x02 ){ - printf("IPMB-B only\n"); - } - else if ( (record->data[offset] & 0x03) == 0x03 ){ - printf("IPMB-A and IPMB-B\n"); - } - else{ - printf("Reserved.\n"); - } - offset ++; - - entry_count = record->data[offset++]; - printf("\tAddress Entry count: 0x%02x", entry_count); - while (entry_count > 0){ - printf("\t Hardware Address: 0x%02x\n", record->data[offset++]); - printf("\t IPMB-0 Link Entry: 0x%02x\n",record->data[offset++]); - entry_count --; - } - } - } - +#define SIZE_OF_CONNECTOR_DEFINER 3; /*bytes*/ + int offset = START_DATA_OFFSET; + /* Ref: PICMG 3.0 Specification Revision 2.0, Table 3-59 */ + printf(" IPMB-0 Connector Definer: "); +#ifndef WORDS_BIGENDIAN + printf("%02x %02x %02x h\n", record->data[offset], + record->data[offset+1], record->data[offset+2]); +#else + printf("%02x %02x %02x h\n", record->data[offset+2], + record->data[offset+1], record->data[offset]); +#endif + /* 3 bytes of connector definer was used */ + offset += SIZE_OF_CONNECTOR_DEFINER; + printf(" IPMB-0 Connector version ID: "); +#ifndef WORDS_BIGENDIAN + printf("%02x %02x h\n", record->data[offset], + record->data[offset+1]); +#else + printf("%02x %02x h\n", record->data[offset+1], + record->data[offset]); +#endif + offset += 2; + printf(" IPMB-0 Hub Descriptor Count: 0x%02x", + record->data[offset++]); + if (record->data[offset] < 1) { + return; + } + for (offset; offset < record->header.len;) { + unsigned char entry_count = 0; + printf(" IPMB-0 Hub Descriptor\n"); + printf("\tHardware Address: 0x%02x\n", + record->data[offset++]); + printf("\tHub Info {0x%02x}: ", record->data[offset]); + /* Bit mask specified in Table 3-59 + * of PICMG 3.0 Specification + */ + if ((record->data[offset] & 0x01) == 0x01) { + printf("IPMB-A only\n"); + } else if ((record->data[offset] & 0x02) == 0x02) { + printf("IPMB-B only\n"); + } else if ((record->data[offset] & 0x03) == 0x03) { + printf("IPMB-A and IPMB-B\n"); + } else { + printf("Reserved.\n"); + } + offset ++; + entry_count = record->data[offset++]; + printf("\tAddress Entry count: 0x%02x", entry_count); + while (entry_count > 0) { + printf("\t Hardware Address: 0x%02x\n", + record->data[offset++]); + printf("\t IPMB-0 Link Entry: 0x%02x\n", + record->data[offset++]); + entry_count --; + } + } } /************************************************************************** @@ -3602,13 +3570,14 @@ ipmi_ek_display_radial_ipmb0_record( struct ipmi_ek_multi_header * record ) * ***************************************************************************/ static void -ipmi_ek_display_amc_current_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_amc_current_record(struct ipmi_ek_multi_header *record) { - unsigned char current; - current = record->data[START_DATA_OFFSET]; - printf(" Current draw: %.1f A @ 12V => %.2f Watt\n", - (float) current/10.0, ((float)current/10.0)*12.0 ); - printf("\n"); + unsigned char current; + current = record->data[START_DATA_OFFSET]; + printf(" Current draw: %.1f A @ 12V => %.2f Watt\n", + (float)current / 10.0, + ((float)current / 10.0) * 12.0); + printf("\n"); } /************************************************************************** @@ -3630,29 +3599,27 @@ ipmi_ek_display_amc_current_record( struct ipmi_ek_multi_header * record ) * ***************************************************************************/ static void -ipmi_ek_display_amc_activation_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_amc_activation_record(struct ipmi_ek_multi_header *record) { - uint16_t max_current; - int offset = START_DATA_OFFSET; - - max_current = record->data[offset]; - max_current |= record->data[++offset] << 8; - printf(" Maximum Internal Current(@12V): %.2f A [ %.2f Watt ]\n", - (float) max_current / 10, - (float) max_current / 10 * 12); - printf(" Module Activation Readiness: %i sec.\n", - record->data[++offset]); - - printf(" Descriptor Count: %i\n", record->data[++offset]); - for(++offset; (offset < record->header.len); offset += 3 ) - { - struct fru_picmgext_activation_record * a = - (struct fru_picmgext_activation_record *) &record->data[offset]; - - printf("\tIPMB-Address:\t\t0x%x\n", a->ibmb_addr); - printf("\tMax. Module Current:\t%.2f A\n", (float)a->max_module_curr/10); - printf("\n"); - } + uint16_t max_current; + int offset = START_DATA_OFFSET; + + max_current = record->data[offset]; + max_current |= record->data[++offset] << 8; + printf(" Maximum Internal Current(@12V): %.2f A [ %.2f Watt ]\n", + (float) max_current / 10, + (float) max_current / 10 * 12); + printf(" Module Activation Readiness: %i sec.\n", + record->data[++offset]); + printf(" Descriptor Count: %i\n", record->data[++offset]); + for (++offset; (offset < record->header.len); offset += 3) { + struct fru_picmgext_activation_record *a = + (struct fru_picmgext_activation_record *)&record->data[offset]; + printf("\tIPMB-Address:\t\t0x%x\n", a->ibmb_addr); + printf("\tMax. Module Current:\t%.2f A\n", + (float)a->max_module_curr / 10); + printf("\n"); + } } /************************************************************************** @@ -3674,119 +3641,133 @@ ipmi_ek_display_amc_activation_record( struct ipmi_ek_multi_header * record ) * ***************************************************************************/ static void -ipmi_ek_display_amc_p2p_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_amc_p2p_record(struct ipmi_ek_multi_header *record) { - int index_data = START_DATA_OFFSET; - int oem_count = 0; - int ch_count = 0; - int index=0; - - oem_count = record->data[index_data++]; - printf("OEM GUID count: %02x\n", oem_count); - - if ( oem_count > 0 ){ - while ( oem_count > 0 ){ - printf("OEM GUID: "); - for ( index = 1; index <= SIZE_OF_GUID; index++ ){ - printf("%02x", record->data[index_data++]); - /* For a better look, display a "-" character after each 5 bytes - * of OEM GUID */ - if ( !(index % 5) ){ - printf("-"); - } - } - printf("\n"); - oem_count--; - } - } - if ( ( record->data[index_data] & AMC_MODULE ) == AMC_MODULE ){ - printf("AMC module connection\n"); - } - else{ - printf("On-Carrier Device %02x h\n", ( record->data[index_data] & 0x0f )); - } - index_data ++; - ch_count = record->data[index_data++]; - printf("AMC Channel Descriptor count: %02x h\n", ch_count); - - if ( ch_count > 0 ){ - for ( index = 0; index < ch_count; index++ ){ - unsigned int data; - struct fru_picmgext_amc_channel_desc_record * ch_desc; - printf(" AMC Channel Descriptor {%02x%02x%02x}\n", - record->data[index_data+2], record->data[index_data+1], - record->data[index_data] - ); - data = record->data[index_data] | - (record->data[index_data + 1] << 8) | - (record->data[index_data + 2] << 16); - ch_desc = ( struct fru_picmgext_amc_channel_desc_record * ) &data; - printf(" Lane 0 Port: %d\n", ch_desc->lane0port); - printf(" Lane 1 Port: %d\n", ch_desc->lane1port); - printf(" Lane 2 Port: %d\n", ch_desc->lane2port); - printf(" Lane 3 Port: %d\n\n", ch_desc->lane3port); - index_data += FRU_PICMGEXT_AMC_CHANNEL_DESC_RECORD_SIZE; - } - } - while ( index_data < record->header.len ){ - /*Warning: For gcc version between 4.0 and 4.3 this code doesnt work*/ - unsigned int data[2]; - struct fru_picmgext_amc_link_desc_record *link_desc; - data[0] = record->data[index_data] | - (record->data[index_data + 1] << 8) | - (record->data[index_data + 2] << 16) | - (record->data[index_data + 3] << 24); - data[1] = record->data[index_data + 4]; - - link_desc = (struct fru_picmgext_amc_link_desc_record *) &data[0]; - - printf(" AMC Link Descriptor:\n" ); - - printf("\t- Link Type: %s \n", - val2str (link_desc->type, ipmi_ekanalyzer_link_type)); - switch ( link_desc->type ) { - case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE: - case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS1: - case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS2: - printf("\t- Link Type extension: %s\n", - val2str (link_desc->type_ext, ipmi_ekanalyzer_extension_PCIE)); - printf("\t- Link Group ID: %d\n ", link_desc->group_id ); - printf("\t- Link Asym. Match: %d - %s\n", - link_desc->asym_match, - val2str (link_desc->asym_match, ipmi_ekanalyzer_asym_PCIE)); - break; - case FRU_PICMGEXT_AMC_LINK_TYPE_ETHERNET: - printf("\t- Link Type extension: %s\n", - val2str (link_desc->type_ext, - ipmi_ekanalyzer_extension_ETHERNET)); - printf("\t- Link Group ID: %d \n", link_desc->group_id ); - printf("\t- Link Asym. Match: %d - %s\n", - link_desc->asym_match, - val2str (link_desc->asym_match, ipmi_ekanalyzer_asym_PCIE)); - break; - case FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE: - printf("\t- Link Type extension: %s\n", - val2str (link_desc->type_ext, - ipmi_ekanalyzer_extension_STORAGE)); - printf("\t- Link Group ID: %d \n", link_desc->group_id ); - printf("\t- Link Asym. Match: %d - %s\n", - link_desc->asym_match, - val2str (link_desc->asym_match, ipmi_ekanalyzer_asym_STORAGE)); - break; - default: - printf("\t- Link Type extension: %i (Unknown)\n", link_desc->type_ext ); - printf("\t- Link Group ID: %d \n", link_desc->group_id ); - printf("\t- Link Asym. Match: %i\n", link_desc->asym_match); - break; - } - printf("\t- AMC Link Designator:\n"); - printf("\t Channel ID: %i\n", link_desc->channel_id); - printf("\t\t Lane 0: %s\n", (link_desc->port_flag_0)?"enable":"disable"); - printf("\t\t Lane 1: %s\n", (link_desc->port_flag_1)?"enable":"disable"); - printf("\t\t Lane 2: %s\n", (link_desc->port_flag_2)?"enable":"disable"); - printf("\t\t Lane 3: %s\n", (link_desc->port_flag_3)?"enable":"disable"); - index_data += FRU_PICMGEXT_AMC_LINK_DESC_RECORD_SIZE; - } + int index_data = START_DATA_OFFSET; + int oem_count = 0; + int ch_count = 0; + int index=0; + + oem_count = record->data[index_data++]; + printf("OEM GUID count: %02x\n", oem_count); + if (oem_count > 0) { + while (oem_count > 0) { + printf("OEM GUID: "); + for (index = 1; index <= SIZE_OF_GUID; index++) { + printf("%02x", record->data[index_data++]); + /* For a better look, display a "-" character + * after each 5 bytes of OEM GUID + */ + if (!(index % 5)) { + printf("-"); + } + } + printf("\n"); + oem_count--; + } + } + if ((record->data[index_data] & AMC_MODULE) == AMC_MODULE) { + printf("AMC module connection\n"); + } else { + printf("On-Carrier Device %02x h\n", + (record->data[index_data] & 0x0f)); + } + index_data ++; + ch_count = record->data[index_data++]; + printf("AMC Channel Descriptor count: %02x h\n", ch_count); + + if (ch_count > 0) { + for (index = 0; index < ch_count; index++) { + unsigned int data; + struct fru_picmgext_amc_channel_desc_record *ch_desc; + printf(" AMC Channel Descriptor {%02x%02x%02x}\n", + record->data[index_data+2], + record->data[index_data+1], + record->data[index_data]); + data = record->data[index_data] + | (record->data[index_data + 1] << 8) + | (record->data[index_data + 2] << 16); + ch_desc = (struct fru_picmgext_amc_channel_desc_record *)&data; + printf(" Lane 0 Port: %d\n", ch_desc->lane0port); + printf(" Lane 1 Port: %d\n", ch_desc->lane1port); + printf(" Lane 2 Port: %d\n", ch_desc->lane2port); + printf(" Lane 3 Port: %d\n\n", ch_desc->lane3port); + index_data += FRU_PICMGEXT_AMC_CHANNEL_DESC_RECORD_SIZE; + } + } + while (index_data < record->header.len) { + /* Warning: This code doesn't work with gcc version + * between 4.0 and 4.3 + */ + unsigned int data[2]; + struct fru_picmgext_amc_link_desc_record *link_desc; + data[0] = record->data[index_data] + | (record->data[index_data + 1] << 8) + | (record->data[index_data + 2] << 16) + | (record->data[index_data + 3] << 24); + data[1] = record->data[index_data + 4]; + + link_desc = (struct fru_picmgext_amc_link_desc_record *)&data[0]; + printf(" AMC Link Descriptor:\n"); + printf("\t- Link Type: %s \n", + val2str(link_desc->type, ipmi_ekanalyzer_link_type)); + switch (link_desc->type) { + case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE: + case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS1: + case FRU_PICMGEXT_AMC_LINK_TYPE_PCIE_AS2: + printf("\t- Link Type extension: %s\n", + val2str(link_desc->type_ext, + ipmi_ekanalyzer_extension_PCIE)); + printf("\t- Link Group ID: %d\n ", + link_desc->group_id); + printf("\t- Link Asym. Match: %d - %s\n", + link_desc->asym_match, + val2str(link_desc->asym_match, + ipmi_ekanalyzer_asym_PCIE)); + break; + case FRU_PICMGEXT_AMC_LINK_TYPE_ETHERNET: + printf("\t- Link Type extension: %s\n", + val2str (link_desc->type_ext, + ipmi_ekanalyzer_extension_ETHERNET)); + printf("\t- Link Group ID: %d \n", + link_desc->group_id); + printf("\t- Link Asym. Match: %d - %s\n", + link_desc->asym_match, + val2str(link_desc->asym_match, + ipmi_ekanalyzer_asym_PCIE)); + break; + case FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE: + printf("\t- Link Type extension: %s\n", + val2str (link_desc->type_ext, + ipmi_ekanalyzer_extension_STORAGE)); + printf("\t- Link Group ID: %d \n", + link_desc->group_id); + printf("\t- Link Asym. Match: %d - %s\n", + link_desc->asym_match, + val2str(link_desc->asym_match, + ipmi_ekanalyzer_asym_STORAGE)); + break; + default: + printf("\t- Link Type extension: %i (Unknown)\n", + link_desc->type_ext); + printf("\t- Link Group ID: %d \n", + link_desc->group_id); + printf("\t- Link Asym. Match: %i\n", + link_desc->asym_match); + break; + } + printf("\t- AMC Link Designator:\n"); + printf("\t Channel ID: %i\n", link_desc->channel_id); + printf("\t\t Lane 0: %s\n", + (link_desc->port_flag_0) ? "enable" : "disable"); + printf("\t\t Lane 1: %s\n", + (link_desc->port_flag_1) ? "enable" : "disable"); + printf("\t\t Lane 2: %s\n", + (link_desc->port_flag_2) ? "enable" : "disable"); + printf("\t\t Lane 3: %s\n", + (link_desc->port_flag_3) ? "enable" : "disable"); + index_data += FRU_PICMGEXT_AMC_LINK_DESC_RECORD_SIZE; + } } /************************************************************************** @@ -3807,26 +3788,25 @@ ipmi_ek_display_amc_p2p_record( struct ipmi_ek_multi_header * record ) * ***************************************************************************/ static void -ipmi_ek_display_amc_carrier_info_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_amc_carrier_info_record(struct ipmi_ek_multi_header *record) { - unsigned char extVersion; - unsigned char siteCount; - int offset = START_DATA_OFFSET; - - extVersion = record->data[offset++]; - siteCount = record->data[offset++]; - - printf(" AMC.0 extension version: R%d.%d\n", (extVersion >> 0)& 0x0F, - (extVersion >> 4)& 0x0F ); - printf(" Carrier Sie Number Count: %d\n", siteCount); - - while (siteCount > 0){ - printf("\tSite ID (%d): %s \n", record->data[offset], - val2str(record->data[offset], ipmi_ekanalyzer_module_type) ); - offset++; - siteCount--; - } - printf("\n"); + unsigned char extVersion; + unsigned char siteCount; + int offset = START_DATA_OFFSET; + + extVersion = record->data[offset++]; + siteCount = record->data[offset++]; + printf(" AMC.0 extension version: R%d.%d\n", + (extVersion >> 0) & 0x0F, + (extVersion >> 4) & 0x0F); + printf(" Carrier Sie Number Count: %d\n", siteCount); + while (siteCount > 0) { + printf("\tSite ID (%d): %s \n", record->data[offset], + val2str(record->data[offset], ipmi_ekanalyzer_module_type)); + offset++; + siteCount--; + } + printf("\n"); } /************************************************************************** @@ -3849,63 +3829,58 @@ ipmi_ek_display_amc_carrier_info_record( struct ipmi_ek_multi_header * record ) * ***************************************************************************/ static void -ipmi_ek_display_clock_carrier_p2p_record( - struct ipmi_ek_multi_header * record ) +ipmi_ek_display_clock_carrier_p2p_record(struct ipmi_ek_multi_header *record) { - unsigned char desc_count; - int i,j; - int offset = START_DATA_OFFSET; - - desc_count = record->data[offset++]; - - for(i=0; idata[offset++]; - channel_count = record->data[offset++]; - - printf(" Clock Resource ID: 0x%02x\n", resource_id); - printf(" Type: "); - if((resource_id & 0xC0)>>6 == 0) { - printf("On-Carrier-Device\n"); - } - else if((resource_id & 0xC0)>>6 == 1) { - printf("AMC slot\n"); - } - else if((resource_id & 0xC0)>>6 == 2) { - printf("Backplane\n"); - } - else{ - printf("reserved\n"); - } - printf(" Channel Count: 0x%02x\n", channel_count); - - for(j=0; jdata[offset++]; - rem_channel = record->data[offset++]; - rem_resource = record->data[offset++]; - - printf("\tCLK-ID: 0x%02x ---> ", loc_channel); - printf(" remote CLKID: 0x%02x ", rem_channel); - if((rem_resource & 0xC0)>>6 == 0) { - printf("[ Carrier-Dev"); - } - else if((rem_resource & 0xC0)>>6 == 1) { - printf("[ AMC slot "); - } - else if((rem_resource & 0xC0)>>6 == 2) { - printf("[ Backplane "); - } - else{ - printf("reserved "); - } - printf(" 0x%02x ]\n", rem_resource&0xF); - } - } - printf("\n"); + unsigned char desc_count; + int i; + int j; + int offset = START_DATA_OFFSET; + + desc_count = record->data[offset++]; + for(i = 0; i < desc_count; i++) { + unsigned char resource_id; + unsigned char channel_count; + + resource_id = record->data[offset++]; + channel_count = record->data[offset++]; + + printf(" Clock Resource ID: 0x%02x\n", resource_id); + printf(" Type: "); + if ((resource_id & 0xC0) >> 6 == 0) { + printf("On-Carrier-Device\n"); + } else if ((resource_id & 0xC0) >> 6 == 1) { + printf("AMC slot\n"); + } else if ((resource_id & 0xC0) >> 6 == 2) { + printf("Backplane\n"); + } else{ + printf("reserved\n"); + } + printf(" Channel Count: 0x%02x\n", channel_count); + + for (j = 0; j < channel_count; j++) { + unsigned char loc_channel; + unsigned char rem_channel; + unsigned char rem_resource; + + loc_channel = record->data[offset++]; + rem_channel = record->data[offset++]; + rem_resource = record->data[offset++]; + + printf("\tCLK-ID: 0x%02x ---> ", loc_channel); + printf(" remote CLKID: 0x%02x ", rem_channel); + if ((rem_resource & 0xC0) >> 6 == 0) { + printf("[ Carrier-Dev"); + } else if ((rem_resource & 0xC0) >> 6 == 1) { + printf("[ AMC slot "); + } else if ((rem_resource & 0xC0) >> 6 == 2) { + printf("[ Backplane "); + } else { + printf("reserved "); + } + printf(" 0x%02x ]\n", rem_resource & 0xF); + } + } + printf("\n"); } /************************************************************************** @@ -3927,79 +3902,88 @@ ipmi_ek_display_clock_carrier_p2p_record( * ***************************************************************************/ void -ipmi_ek_display_clock_config_record( struct ipmi_ek_multi_header * record ) +ipmi_ek_display_clock_config_record(struct ipmi_ek_multi_header *record) { - unsigned char resource_id, descr_count; - int i; - int offset = START_DATA_OFFSET; - - resource_id = record->data[offset++]; - descr_count = record->data[offset++]; - printf(" Clock Resource ID: 0x%02x\n", resource_id); - printf(" Clock Configuration Descriptor Count: 0x%02x\n", descr_count); - - for(i=0; idata[offset++]; - control = record->data[offset++]; - printf("\tCLK-ID: 0x%02x - ", channel_id); - printf("CTRL 0x%02x [ %12s ]\n", control, - ((control&0x1)==0)?"Carrier IPMC":"Application"); - - indirect_cnt = record->data[offset++]; - direct_cnt = record->data[offset++]; - printf("\t Count: Indirect 0x%02x / Direct 0x%02x\n", indirect_cnt, - direct_cnt ); - - /* indirect desc */ - for(j=0; jdata[offset++]; - dep_chn_id = record->data[offset++]; - printf("\t\tFeature: 0x%02x [%8s] - ", feature, - (feature&0x1)==1?"Source":"Receiver"); - printf(" Dep. CLK-ID: 0x%02x\n", dep_chn_id); - } - - /* direct desc */ - for(j=0; jdata[offset++]; - family = record->data[offset++]; - accuracy = record->data[offset++]; - freq = (record->data[offset+0] << 0 ) - | (record->data[offset+1] << 8 ) - | (record->data[offset+2] << 16) - | (record->data[offset+3] << 24); - offset += 4; - min_freq = (record->data[offset+0] << 0 ) - | (record->data[offset+1] << 8 ) - | (record->data[offset+2] << 16) - | (record->data[offset+3] << 24); - offset += 4; - max_freq = (record->data[offset+0] << 0 ) - | (record->data[offset+1] << 8 ) - | (record->data[offset+2] << 16) - | (record->data[offset+3] << 24); - offset += 4; - - printf("\t- Feature: 0x%02x - PLL: %x / Asym: %s\n", - feature, - (feature > 1) & 1, - (feature&1)?"Source":"Receiver"); - printf("\tFamily: 0x%02x - AccLVL: 0x%02x\n", family, accuracy); - printf("\tFRQ: %-9ld - min: %-9ld - max: %-9ld\n", - freq, min_freq, max_freq); - } - printf("\n"); - } + unsigned char resource_id; + unsigned char descr_count; + int i; + int offset = START_DATA_OFFSET; + + resource_id = record->data[offset++]; + descr_count = record->data[offset++]; + printf(" Clock Resource ID: 0x%02x\n", resource_id); + printf(" Clock Configuration Descriptor Count: 0x%02x\n", descr_count); + + for (i = 0; i < descr_count; i++) { + int j = 0; + unsigned char channel_id; + unsigned char control; + unsigned char indirect_cnt; + unsigned char direct_cnt; + + channel_id = record->data[offset++]; + control = record->data[offset++]; + printf("\tCLK-ID: 0x%02x - ", channel_id); + printf("CTRL 0x%02x [ %12s ]\n", control, + ((control & 0x1) == 0) ? "Carrier IPMC" : "Application"); + + indirect_cnt = record->data[offset++]; + direct_cnt = record->data[offset++]; + printf("\t Count: Indirect 0x%02x / Direct 0x%02x\n", + indirect_cnt, + direct_cnt); + + /* indirect desc */ + for (j = 0; j < indirect_cnt; j++) { + unsigned char feature; + unsigned char dep_chn_id; + + feature = record->data[offset++]; + dep_chn_id = record->data[offset++]; + printf("\t\tFeature: 0x%02x [%8s] - ", + feature, + (feature & 0x1) == 1 ? "Source" : "Receiver"); + printf(" Dep. CLK-ID: 0x%02x\n", dep_chn_id); + } + /* direct desc */ + for (j = 0; j < direct_cnt; j++) { + unsigned char feature; + unsigned char family; + unsigned char accuracy; + unsigned long freq; + unsigned long min_freq; + unsigned long max_freq; + + feature = record->data[offset++]; + family = record->data[offset++]; + accuracy = record->data[offset++]; + freq = (record->data[offset+0] << 0) + | (record->data[offset+1] << 8) + | (record->data[offset+2] << 16) + | (record->data[offset+3] << 24); + offset += 4; + min_freq = (record->data[offset+0] << 0) + | (record->data[offset+1] << 8) + | (record->data[offset+2] << 16) + | (record->data[offset+3] << 24); + offset += 4; + max_freq = (record->data[offset+0] << 0) + | (record->data[offset+1] << 8) + | (record->data[offset+2] << 16) + | (record->data[offset+3] << 24); + offset += 4; + + printf("\t- Feature: 0x%02x - PLL: %x / Asym: %s\n", + feature, + (feature > 1) & 1, + (feature & 1) ? "Source" : "Receiver"); + printf("\tFamily: 0x%02x - AccLVL: 0x%02x\n", + family, accuracy); + printf("\tFRQ: %-9ld - min: %-9ld - max: %-9ld\n", + freq, min_freq, max_freq); + } + printf("\n"); + } } /************************************************************************** @@ -4022,12 +4006,12 @@ ipmi_ek_display_clock_config_record( struct ipmi_ek_multi_header * record ) * ***************************************************************************/ static int -ipmi_ekanalyzer_fru_file2structure(char * filename, - struct ipmi_ek_multi_header ** list_head, - struct ipmi_ek_multi_header ** list_record, - struct ipmi_ek_multi_header ** list_last) +ipmi_ekanalyzer_fru_file2structure(char *filename, + struct ipmi_ek_multi_header **list_head, + struct ipmi_ek_multi_header **list_record, + struct ipmi_ek_multi_header **list_last) { - FILE * input_file; + FILE *input_file; unsigned char data; unsigned char last_record = 0; unsigned int multi_offset = 0; @@ -4050,21 +4034,23 @@ ipmi_ekanalyzer_fru_file2structure(char * filename, } if (data == 0) { lprintf(LOG_ERR, "There is no multi record in the file '%s'", - filename); + filename); fclose(input_file); return ERROR_STATUS; } /* the offset value is in multiple of 8 bytes. */ multi_offset = data * 8; lprintf(LOG_DEBUG, "start multi offset = 0x%02x", - multi_offset ); + multi_offset); fseek(input_file, multi_offset, SEEK_SET); while (!feof(input_file)) { + /* TODO - check malloc() */ *list_record = malloc(sizeof(struct ipmi_ek_multi_header)); ret = fread(&(*list_record)->header, START_DATA_OFFSET, 1, input_file); if ((ret != 1) || ferror(input_file)) { + /* TODO - no free?! */ lprintf(LOG_ERR, "Invalid Header!"); fclose(input_file); return ERROR_STATUS; @@ -4115,7 +4101,6 @@ ipmi_ekanalyzer_fru_file2structure(char * filename, return OK_STATUS; } - /************************************************************************** * * Function name: ipmi_ek_add_record2list @@ -4135,24 +4120,25 @@ ipmi_ekanalyzer_fru_file2structure(char * filename, * ***************************************************************************/ static void -ipmi_ek_add_record2list( struct ipmi_ek_multi_header ** record, - struct ipmi_ek_multi_header ** list_head, - struct ipmi_ek_multi_header ** list_last ) +ipmi_ek_add_record2list(struct ipmi_ek_multi_header **record, + struct ipmi_ek_multi_header **list_head, + struct ipmi_ek_multi_header **list_last) { - if (*list_head == NULL) { - *list_head = *record; - (*record)->prev = NULL; - if (verbose > 2) - printf("Adding first record to list\n"); - } - else { - (*list_last)->next = *record; - (*record)->prev = *list_last; - if (verbose > 2) - printf("Add 1 record to list\n"); - } - *list_last = *record; - (*record)->next = NULL; + if (*list_head == NULL) { + *list_head = *record; + (*record)->prev = NULL; + if (verbose > 2) { + printf("Adding first record to list\n"); + } + } else { + (*list_last)->next = *record; + (*record)->prev = *list_last; + if (verbose > 2) { + printf("Add 1 record to list\n"); + } + } + *list_last = *record; + (*record)->next = NULL; } /************************************************************************** @@ -4174,22 +4160,20 @@ ipmi_ek_add_record2list( struct ipmi_ek_multi_header ** record, * ***************************************************************************/ static void -ipmi_ek_remove_record_from_list( struct ipmi_ek_multi_header * record, - struct ipmi_ek_multi_header ** list_head, - struct ipmi_ek_multi_header ** list_last ) +ipmi_ek_remove_record_from_list(struct ipmi_ek_multi_header *record, + struct ipmi_ek_multi_header **list_head, + struct ipmi_ek_multi_header **list_last) { - if (record->prev == NULL) - *list_head = record->next; - else - record->prev->next = record->next; - if ( record->next == NULL ) - (*list_last) = record->prev; - else - record->next->prev = record->prev; - free(record); - record = NULL; + if (record->prev == NULL) { + *list_head = record->next; + } else { + record->prev->next = record->next; + } + if (record->next == NULL) { + (*list_last) = record->prev; + } else { + record->next->prev = record->prev; + } + free(record); + record = NULL; } - - - - diff --git a/lib/ipmi_fru.c b/lib/ipmi_fru.c index 1b2e0cd..17afe5f 100644 --- a/lib/ipmi_fru.c +++ b/lib/ipmi_fru.c @@ -3111,7 +3111,8 @@ ipmi_fru_print_all(struct ipmi_intf * intf) mc = (struct sdr_record_mc_locator *) ipmi_sdr_get_record(intf, header, itr); /* Does this MC device support FRU inventory device? */ - if (mc && (mc->dev_support & 0x08)) { /* FRU inventory device? */ + if (mc && (mc->dev_support & 0x08) && /* FRU inventory device? */ + intf->target_addr != mc->dev_slave_addr) { /* Yes. Prepare to issue FRU commands to FRU device #0 LUN 0 */ /* using the slave address specified in the MC record. */ diff --git a/lib/ipmi_fwum.c b/lib/ipmi_fwum.c index b666a2b..68f40d4 100644 --- a/lib/ipmi_fwum.c +++ b/lib/ipmi_fwum.c @@ -892,14 +892,14 @@ KfwumUploadFirmware(struct ipmi_intf *intf, unsigned char *pBuffer, } if (rc == 0) { if ((address % 1024) == 0) { - KfwumShowProgress("Writting Firmware in Flash", + KfwumShowProgress("Writing Firmware in Flash", address, totalSize); } sequenceNumber++; } } while ((rc == 0) && (address < totalSize)); if (rc == 0) { - KfwumShowProgress("Writting Firmware in Flash", + KfwumShowProgress("Writing Firmware in Flash", 100, 100); } return rc; diff --git a/lib/ipmi_hpmfwupg.c b/lib/ipmi_hpmfwupg.c index 69950b7..fbb5a62 100644 --- a/lib/ipmi_hpmfwupg.c +++ b/lib/ipmi_hpmfwupg.c @@ -344,6 +344,8 @@ HpmfwupgTargetCheck(struct ipmi_intf *intf, int option) generalPropResp.GeneralCompProperties.bitfield.rollbackBackup; gVersionInfo[componentId].coldResetRequired = getCompProp.resp.Response. generalPropResp.GeneralCompProperties.bitfield.payloadColdReset; + gVersionInfo[componentId].deferredActivationSupported = getCompProp.resp.Response. + generalPropResp.GeneralCompProperties.bitfield.deferredActivation; getCompProp.req.selector = HPMFWUPG_COMP_DESCRIPTION_STRING; rc = HpmfwupgGetComponentProperties(intf, &getCompProp); if (rc != HPMFWUPG_SUCCESS) { @@ -395,6 +397,16 @@ HpmfwupgTargetCheck(struct ipmi_intf *intf, int option) gVersionInfo[componentId].rollbackAux[2] = getCompProp.resp.Response.rollbackFwVersionResp.rollbackFwVersion[4]; gVersionInfo[componentId].rollbackAux[3] = getCompProp.resp.Response.rollbackFwVersionResp.rollbackFwVersion[5]; } + mode |= ROLLBACK_VER; + } else { + gVersionInfo[componentId].rollbackMajor = 0xff; + gVersionInfo[componentId].rollbackMinor = 0xff; + gVersionInfo[componentId].rollbackAux[0] = 0xff; + gVersionInfo[componentId].rollbackAux[1] = 0xff; + gVersionInfo[componentId].rollbackAux[2] = 0xff; + gVersionInfo[componentId].rollbackAux[3] = 0xff; + } + if (gVersionInfo[componentId].deferredActivationSupported) { getCompProp.req.selector = HPMFWUPG_COMP_DEFERRED_FIRMWARE_VERSION; rc = HpmfwupgGetComponentProperties(intf, &getCompProp); if (rc != HPMFWUPG_SUCCESS) { @@ -411,14 +423,7 @@ HpmfwupgTargetCheck(struct ipmi_intf *intf, int option) gVersionInfo[componentId].deferredAux[2] = getCompProp.resp.Response.deferredFwVersionResp.deferredFwVersion[4]; gVersionInfo[componentId].deferredAux[3] = getCompProp.resp.Response.deferredFwVersionResp.deferredFwVersion[5]; } - mode |= ROLLBACK_VER; } else { - gVersionInfo[componentId].rollbackMajor = 0xff; - gVersionInfo[componentId].rollbackMinor = 0xff; - gVersionInfo[componentId].rollbackAux[0] = 0xff; - gVersionInfo[componentId].rollbackAux[1] = 0xff; - gVersionInfo[componentId].rollbackAux[2] = 0xff; - gVersionInfo[componentId].rollbackAux[3] = 0xff; gVersionInfo[componentId].deferredMajor = 0xff; gVersionInfo[componentId].deferredMinor = 0xff; gVersionInfo[componentId].deferredAux[0] = 0xff; @@ -1235,10 +1240,12 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components, } else { /* success, buf length is valid */ bufLengthIsSet = 1; - if (blockLength > firmwareLength) { + if (imageOffset + blockLength > firmwareLength || + imageOffset + blockLength < blockLength) { /* * blockLength is the remaining length of the firmware to upload so - * if its greater than the firmware length then its kind of error + * if imageOffset and blockLength sum is greater than the firmware + * length then its kind of error */ lprintf(LOG_NOTICE, "\n Error in Upload FIRMWARE command [rc=%d]\n", @@ -1247,6 +1254,7 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components, "\n TotalSent:0x%x Img offset:0x%x Blk length:0x%x Fwlen:0x%x\n", totalSent,imageOffset,blockLength,firmwareLength); rc = HPMFWUPG_ERROR; + continue; } totalSent += count; if (imageOffset != 0x00) { @@ -2296,7 +2304,8 @@ HpmfwupgWaitLongDurationCmd(struct ipmi_intf *intf, * receive d5 (on the first get status) from * the ipmi driver. */ - (upgStatusCmd.resp.lastCmdCompCode != 0x00 ) + (upgStatusCmd.resp.lastCmdCompCode == 0x80 || + upgStatusCmd.resp.lastCmdCompCode == 0xD5) && ((timeoutSec2 - timeoutSec1) < upgradeTimeout ) && (rc == HPMFWUPG_SUCCESS)) { /* Must wait at least 1000 ms between status requests */ diff --git a/lib/ipmi_kontronoem.c b/lib/ipmi_kontronoem.c index c154eda..48dc684 100644 --- a/lib/ipmi_kontronoem.c +++ b/lib/ipmi_kontronoem.c @@ -39,770 +39,609 @@ * * This code implements an Kontron OEM proprietary commands. */ - - #include #include +#include #include #include #include - extern int verbose; -extern int read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, - uint8_t id, uint32_t offset, uint32_t length, - uint8_t *frubuf); -extern int write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, - unsigned char id, unsigned int soffset, - unsigned int doffset, unsigned int length, - unsigned char *pFrubuf); - -extern char * get_fru_area_str(uint8_t * data, uint32_t * offset); - - +extern int read_fru_area(struct ipmi_intf *intf, struct fru_info *fru, + uint8_t id, uint32_t offset, uint32_t length, + uint8_t *frubuf); +extern int write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, + uint8_t id, uint16_t soffset, + uint16_t doffset, uint16_t length, + uint8_t *pFrubuf); +extern char *get_fru_area_str(uint8_t *data, uint32_t *offset); static void ipmi_kontron_help(void); -static int ipmi_kontron_set_serial_number(struct ipmi_intf * intf); -static int ipmi_kontron_set_mfg_date (struct ipmi_intf * intf); - +static int ipmi_kontron_set_serial_number(struct ipmi_intf *intf); +static int ipmi_kontron_set_mfg_date (struct ipmi_intf *intf); static void ipmi_kontron_nextboot_help(void); -static int ipmi_kontron_nextboot_set(struct ipmi_intf * intf, - int argc, char **argv); +static int ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc, + char **argv); +static int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf, + unsigned char channel, unsigned char size); -static int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, - unsigned char channel, - unsigned char size); +static char *bootdev[] = {"BIOS", "FDD", "HDD", "CDROM", "network", 0}; int -ipmi_kontronoem_main(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_kontronoem_main(struct ipmi_intf *intf, int argc, char **argv) { - int rc = 0; - - if (argc == 0) - ipmi_kontron_help(); - else if (strncmp(argv[0], "help", 4) == 0) - ipmi_kontron_help(); - - else if (!strncmp(argv[0], "setsn", 5)) - { - if(argc >= 1) - { - if(ipmi_kontron_set_serial_number(intf) > 0) - { - printf("FRU serial number setted successfully\n"); - } - else - { - printf("FRU serial number set failed\n"); - } - } - else - { - printf("fru setsn\n"); - } - } - else if (!strncmp(argv[0], "setmfgdate", 5)) - { - if(argc >= 1) - { - if(ipmi_kontron_set_mfg_date(intf) > 0) - { - printf("FRU manufacturing date setted successfully\n"); - } - else - { - printf("FRU manufacturing date set failed\n"); - } - } - else - { - printf("fru setmfgdate\n"); - } - } - else if (!strncmp(argv[0], "nextboot", sizeof("nextboot")-1)) - { - if (argc > 1) - { - if ((rc = ipmi_kontron_nextboot_set(intf, argc-1, argv+1)) == 0) - { - printf("Nextboot set successfully\n"); - } - else - { - printf("Nextboot set failed\n"); - } - } - else - { - ipmi_kontron_nextboot_help(); - } - } - - else - { - printf("Invalid Kontron command: %s", argv[0]); - ipmi_kontron_help(); - rc = -1; - } - - return rc; + int rc = 0; + if (argc == 0) { + lprintf(LOG_ERR, "Not enough parameters given."); + ipmi_kontron_help(); + return (-1); + } + if (strncmp(argv[0], "help", 4) == 0) { + ipmi_kontron_help(); + rc = 0; + } else if (!strncmp(argv[0], "setsn", 5)) { + if (argc < 1) { + printf("fru setsn\n"); + return (-1); + } + if (ipmi_kontron_set_serial_number(intf) > 0) { + printf("FRU serial number setted successfully\n"); + } else { + printf("FRU serial number set failed\n"); + rc = (-1); + } + } else if (!strncmp(argv[0], "setmfgdate", 10)) { + if (argc < 1) { + printf("fru setmfgdate\n"); + return (-1); + } + if (ipmi_kontron_set_mfg_date(intf) > 0) { + printf("FRU manufacturing date setted successfully\n"); + } else { + printf("FRU manufacturing date set failed\n"); + rc = (-1); + } + } else if (!strncmp(argv[0], "nextboot", 8)) { + if (argc < 2) { + lprintf(LOG_ERR, "Not enough parameters given."); + ipmi_kontron_nextboot_help(); + rc = (-1); + } + rc = ipmi_kontron_nextboot_set(intf, (argc - 1), (argv + 1)); + if (rc == 0) { + printf("Nextboot set successfully\n"); + } else { + printf("Nextboot set failed\n"); + rc = (-1); + } + } else { + lprintf(LOG_ERR, "Invalid Kontron command: %s", argv[0]); + ipmi_kontron_help(); + rc = (-1); + } + return rc; } - -static void ipmi_kontron_help(void) +static void +ipmi_kontron_help(void) { - printf("Kontron Commands: setsn setmfgdate nextboot\n"); -} - + printf("Kontron Commands: setsn setmfgdate nextboot\n"); +} -int ipmi_kontronoem_set_large_buffer(struct ipmi_intf * intf, unsigned char size) +int +ipmi_kontronoem_set_large_buffer(struct ipmi_intf *intf, unsigned char size) { - uint8_t error_occurs = 0; - uint32_t prev_target_addr = intf->target_addr ; - - if ( intf->target_addr > 0 && (intf->target_addr != intf->my_addr) ) - { - intf->target_addr = intf->my_addr; - - printf("Set local big buffer\n"); - if(ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, size ) == 0) - { - printf("Set local big buffer:success\n"); - } - else - { - error_occurs = 1; - } - - if (error_occurs == 0) - { - if(ipmi_kontronoem_send_set_large_buffer( intf, 0x00, size ) == 0) - { - printf("IPMB was set\n"); - } - else - { - /* Revert back the previous set large buffer */ - error_occurs = 1; - ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, 0 ); - } - } - - /* Restore target address */ - intf->target_addr = prev_target_addr; - } - - if (error_occurs == 0) - { - if(ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, size ) == 0) - { - //printf("Set remote big buffer\n"); - } - else - { - if ( intf->target_addr > 0 && (intf->target_addr != intf->my_addr) ) - { - /* Error occurs revert back the previous set large buffer*/ - intf->target_addr = intf->my_addr; - - //ipmi_kontronoem_send_set_large_buffer( intf, 0x00, 0 ); - ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, 0 ); - - intf->target_addr = prev_target_addr; - } - } - } - return error_occurs; + uint8_t error_occurs = 0; + uint32_t prev_target_addr = intf->target_addr ; + if (intf->target_addr > 0 && (intf->target_addr != intf->my_addr)) { + intf->target_addr = intf->my_addr; + printf("Set local big buffer\n"); + if (ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, size) == 0) { + printf("Set local big buffer:success\n"); + } else { + error_occurs = 1; + } + if (error_occurs == 0) { + if (ipmi_kontronoem_send_set_large_buffer(intf, 0x00, size) == 0) { + printf("IPMB was set\n"); + } else { + /* Revert back the previous set large buffer */ + error_occurs = 1; + ipmi_kontronoem_send_set_large_buffer( intf, 0x0e, 0 ); + } + } + /* Restore target address */ + intf->target_addr = prev_target_addr; + } + if (error_occurs == 0) { + if(ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, size) == 0) { + /* printf("Set remote big buffer\n"); */ + } else { + if (intf->target_addr > 0 && (intf->target_addr != intf->my_addr)) { + /* Error occurs revert back the previous set large buffer */ + intf->target_addr = intf->my_addr; + /* ipmi_kontronoem_send_set_large_buffer(intf, 0x00, 0); */ + ipmi_kontronoem_send_set_large_buffer(intf, 0x0e, 0); + intf->target_addr = prev_target_addr; + } + } + } + return error_occurs; } - -int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf * intf, unsigned char channel,unsigned char size) +int +ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf, + unsigned char channel, unsigned char size) { - struct ipmi_rs *rsp; - struct ipmi_rq req; - uint8_t msg_data[2]; - int i; - - memset(msg_data, 0, sizeof(msg_data)); - msg_data[0] = channel/*0x0e*/; // Currently running interface - msg_data[1] = size; - - memset(&req, 0, sizeof(req)); - req.msg.netfn = 0x3E; /* OEM NetFn */ - req.msg.cmd = 0x82; /* Set Channel Buffer Length - OEM */ - req.msg.data = msg_data; - req.msg.data_len = 2; - - req.msg.lun = 0x00; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) - { - printf("Cannot send large buffer command\n"); - return(-1); - } - if (rsp->ccode > 0) - { - printf("Invalid length for the selected interface (%s) %d\n", - val2str(rsp->ccode, completion_code_vals), rsp->ccode); - return(-1); - } - return 0; + struct ipmi_rs *rsp; + struct ipmi_rq req; + uint8_t msg_data[2]; + int i; + memset(msg_data, 0, sizeof(msg_data)); + /* channel =~ 0x0e => Currently running interface */ + msg_data[0] = channel; + msg_data[1] = size; + memset(&req, 0, sizeof(req)); + req.msg.netfn = 0x3E; + /* Set Channel Buffer Length - OEM */ + req.msg.cmd = 0x82; + req.msg.data = msg_data; + req.msg.data_len = 2; + req.msg.lun = 0x00; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + printf("Cannot send large buffer command\n"); + return(-1); + } else if (rsp->ccode > 0) { + printf("Invalid length for the selected interface (%s) %d\n", + val2str(rsp->ccode, completion_code_vals), rsp->ccode); + return(-1); + } + return 0; } - /* ipmi_fru_set_serial_number - Set the Serial Number in FRU * - * @intf: ipmi interface - * @id: fru id + * @intf: ipmi interface + * @id: fru id * * returns -1 on error * returns 1 if successful */ static int -ipmi_kontron_set_serial_number(struct ipmi_intf * intf) +ipmi_kontron_set_serial_number(struct ipmi_intf *intf) { - struct ipmi_rs *rsp; - struct ipmi_rq req; - struct fru_info fru; - struct fru_header header; - uint8_t msg_data[4]; - char *sn; - uint8_t sn_size, checksum; - uint8_t *fru_data; - char *fru_area; - uint32_t fru_data_offset, fru_data_offset_tmp, board_sec_len, prod_sec_len, i; - - sn = NULL; - fru_data = NULL; - - memset(msg_data, 0, 4); - msg_data[0] = 0xb4; - msg_data[1] = 0x90; - msg_data[2] = 0x91; - msg_data[3] = 0x8b; - - memset(&req, 0, sizeof(req)); - req.msg.netfn = 0x3E; - req.msg.cmd = 0x0C; - req.msg.data = msg_data; - req.msg.data_len = 4; - - - /* Set Lun, necessary for this oem command */ - req.msg.lun = 0x03; - - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) - { - printf(" Device not present (No Response)\n"); - return -11; - } - - if (rsp->ccode > 0) - { - printf(" This option is not implemented for this board\n"); - return -1; - } - - sn_size = rsp->data_len; - - sn = malloc(sn_size + 1); - - if(sn == NULL) - { - printf("Out of memory!"); - return -1; - } - - memset(sn, 0, sn_size + 1); - memcpy(sn, rsp->data, sn_size); - - if(verbose >= 1) - { - printf("Original serial number is : [%s]\n", sn); - } - - - - memset(msg_data, 0, 4); - msg_data[0] = 0; - - memset(&req, 0, sizeof(req)); - req.msg.netfn = IPMI_NETFN_STORAGE; - req.msg.cmd = GET_FRU_INFO; - req.msg.data = msg_data; - req.msg.data_len = 1; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - printf(" Device not present (No Response)\n"); - free(sn); - sn = NULL; - return -1; - } - if (rsp->ccode > 0) { - printf(" Device not present (%s)\n", - val2str(rsp->ccode, completion_code_vals)); - free(sn); - sn = NULL; - return(-1); - } - - memset(&fru, 0, sizeof(fru)); - fru.size = (rsp->data[1] << 8) | rsp->data[0]; - fru.access = rsp->data[2] & 0x1; - - if (fru.size < 1) { - printf(" Invalid FRU size %d", fru.size); - free(sn); - sn = NULL; - return -1; - } - - /* - * retrieve the FRU header - */ - msg_data[0] = 0; - msg_data[1] = 0; - msg_data[2] = 0; - msg_data[3] = 8; - - memset(&req, 0, sizeof(req)); - req.msg.netfn = IPMI_NETFN_STORAGE; - req.msg.cmd = GET_FRU_DATA; - req.msg.data = msg_data; - req.msg.data_len = 4; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) - { - printf(" Device not present (No Response)\n"); - free(sn); - sn = NULL; - return(-1); - } - if (rsp->ccode > 0) - { - printf(" Device not present (%s)\n", - val2str(rsp->ccode, completion_code_vals)); - free(sn); - sn = NULL; - return(-1); - } - - if (verbose > 1) - printbuf(rsp->data, rsp->data_len, "FRU DATA"); - - memcpy(&header, rsp->data + 1, 8); - - if (header.version != 1) - { - printf(" Unknown FRU header version 0x%02x", - header.version); - free(sn); - sn = NULL; - return(-1); - } - - /* Set the Board Section */ - board_sec_len = (header.offset.product * 8) - (header.offset.board * 8); - - - fru_data = malloc( fru.size); - - if(fru_data == NULL) - { - printf("Out of memory!"); - free(sn); - sn = NULL; - return(-1); - } - - memset(fru_data, 0, fru.size); - if(read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8) ,board_sec_len , fru_data) < 0) - { - free(sn); - sn = NULL; - free(fru_data); - fru_data = NULL; - return(-1); - } - - /*Position at Board Manufacturer*/ - fru_data_offset = (header.offset.board * 8) + 6; - fru_area = get_fru_area_str(fru_data, &fru_data_offset); - - /*Position at Board Product Name*/ - fru_area = get_fru_area_str(fru_data, &fru_data_offset); - - fru_data_offset_tmp = fru_data_offset; - - /*Position at Serial Number*/ - fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp); - - fru_data_offset ++; - - if(strlen(fru_area) != sn_size) - { - printf("The length of the serial number in the FRU Board Area is wrong.\n"); - free(sn); - sn = NULL; - free(fru_data); - fru_data = NULL; - return(-1); - } - - /* Copy the new serial number in the board section saved in memory*/ - memcpy(fru_data + fru_data_offset, sn, sn_size); - - checksum = 0; - /* Calculate Header Checksum */ - for( i = (header.offset.board * 8); i < (((header.offset.board * 8)+board_sec_len) - 2) ; i ++ ) - { - checksum += fru_data[i]; - } - checksum = (~checksum) + 1; - - - fru_data[(header.offset.board * 8)+board_sec_len - 1] = checksum; - - /* Write the new FRU Board section */ - if(write_fru_area(intf, &fru, 0, (header.offset.board * 8), (header.offset.board * 8), board_sec_len, fru_data) < 0) - { - free(sn); - sn = NULL; - free(fru_data); - fru_data = NULL; - return(-1); - } - - /* Set the Product Section */ - prod_sec_len = (header.offset.multi * 8) - (header.offset.product * 8); - - if(read_fru_area(intf ,&fru ,0 ,(header.offset.product * 8) ,prod_sec_len , fru_data) < 0) - { - free(sn); - sn = NULL; - free(fru_data); - fru_data = NULL; - return(-1); - } - - /*Position at Product Manufacturer*/ - fru_data_offset = (header.offset.product * 8) + 3; - fru_area = get_fru_area_str(fru_data, &fru_data_offset); - - /*Position at Product Name*/ - fru_area = get_fru_area_str(fru_data, &fru_data_offset); - - /*Position at Product Part*/ - fru_area = get_fru_area_str(fru_data, &fru_data_offset); - - /*Position at Product Version*/ - fru_area = get_fru_area_str(fru_data, &fru_data_offset); - - - - fru_data_offset_tmp = fru_data_offset; - - /*Position at Serial Number*/ - fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp); - - fru_data_offset ++; - - if(strlen(fru_area) != sn_size) - { - free(sn); - sn = NULL; - free(fru_data); - fru_data = NULL; - printf("The length of the serial number in the FRU Product Area is wrong.\n"); - return(-1); - - } - - /* Copy the new serial number in the product section saved in memory*/ - memcpy(fru_data + fru_data_offset, sn, sn_size); - - checksum = 0; - /* Calculate Header Checksum */ - for( i = (header.offset.product * 8); i < (((header.offset.product * 8)+prod_sec_len) - 2) ; i ++ ) - { - checksum += fru_data[i]; - } - checksum = (~checksum) + 1; - - - fru_data[(header.offset.product * 8)+prod_sec_len - 1] = checksum; - - /* Write the new FRU Board section */ - if(write_fru_area(intf, &fru, 0, (header.offset.product * 8), (header.offset.product * 8), prod_sec_len, fru_data) < 0) - { - free(sn); - sn = NULL; - free(fru_data); - fru_data = NULL; - return -1; - } - - free(sn); - sn = NULL; - free(fru_data); - fru_data = NULL; - - return(1); - + struct fru_header header; + struct fru_info fru; + struct ipmi_rs *rsp; + struct ipmi_rq req; + char *sn; + char *fru_area; + uint8_t checksum; + uint8_t *fru_data; + uint8_t msg_data[4]; + uint8_t sn_size; + uint32_t board_sec_len; + uint32_t fru_data_offset; + uint32_t fru_data_offset_tmp; + uint32_t i; + uint32_t prod_sec_len; + + sn = NULL; + fru_data = NULL; + + memset(msg_data, 0, 4); + msg_data[0] = 0xb4; + msg_data[1] = 0x90; + msg_data[2] = 0x91; + msg_data[3] = 0x8b; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = 0x3E; + req.msg.cmd = 0x0C; + req.msg.data = msg_data; + req.msg.data_len = 4; + /* Set Lun, necessary for this oem command */ + req.msg.lun = 0x03; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + printf(" Device not present (No Response)\n"); + return (-1); + } else if (rsp->ccode > 0) { + printf(" This option is not implemented for this board\n"); + return (-1); + } + sn_size = rsp->data_len; + sn = malloc(sn_size + 1); + if (sn == NULL) { + lprintf(LOG_ERR, "ipmitool: malloc failure"); + return (-1); + } + memset(sn, 0, sn_size + 1); + memcpy(sn, rsp->data, sn_size); + if (verbose >= 1) { + printf("Original serial number is : [%s]\n", sn); + } + memset(msg_data, 0, 4); + msg_data[0] = 0; + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_STORAGE; + req.msg.cmd = GET_FRU_INFO; + req.msg.data = msg_data; + req.msg.data_len = 1; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + printf(" Device not present (No Response)\n"); + free(sn); + sn = NULL; + return (-1); + } else if (rsp->ccode > 0) { + printf(" Device not present (%s)\n", + val2str(rsp->ccode, completion_code_vals)); + free(sn); + sn = NULL; + return (-1); + } + memset(&fru, 0, sizeof(fru)); + fru.size = (rsp->data[1] << 8) | rsp->data[0]; + fru.access = rsp->data[2] & 0x1; + if (fru.size < 1) { + printf(" Invalid FRU size %d", fru.size); + free(sn); + sn = NULL; + return (-1); + } + /* retrieve the FRU header */ + msg_data[0] = 0; + msg_data[1] = 0; + msg_data[2] = 0; + msg_data[3] = 8; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_STORAGE; + req.msg.cmd = GET_FRU_DATA; + req.msg.data = msg_data; + req.msg.data_len = 4; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + printf(" Device not present (No Response)\n"); + free(sn); + sn = NULL; + return (-1); + } else if (rsp->ccode > 0) { + printf(" Device not present (%s)\n", + val2str(rsp->ccode, completion_code_vals)); + free(sn); + sn = NULL; + return (-1); + } + if (verbose > 1) { + printbuf(rsp->data, rsp->data_len, "FRU DATA"); + } + memcpy(&header, rsp->data + 1, 8); + if (header.version != 1) { + printf(" Unknown FRU header version 0x%02x", + header.version); + free(sn); + sn = NULL; + return(-1); + } + /* Set the Board Section */ + board_sec_len = (header.offset.product * 8) - (header.offset.board * 8); + fru_data = malloc(fru.size); + if (fru_data == NULL) { + lprintf(LOG_ERR, "ipmitool: malloc failure"); + free(sn); + sn = NULL; + return (-1); + } + memset(fru_data, 0, fru.size); + if (read_fru_area(intf, &fru, 0, (header.offset.board * 8), + board_sec_len, fru_data) < 0) { + free(sn); + sn = NULL; + free(fru_data); + fru_data = NULL; + return (-1); + } + /* Position at Board Manufacturer */ + fru_data_offset = (header.offset.board * 8) + 6; + fru_area = get_fru_area_str(fru_data, &fru_data_offset); + /* Position at Board Product Name */ + fru_area = get_fru_area_str(fru_data, &fru_data_offset); + fru_data_offset_tmp = fru_data_offset; + /* Position at Serial Number */ + fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp); + fru_data_offset++; + if (strlen(fru_area) != sn_size) { + printf("The length of the serial number in the FRU Board Area is wrong.\n"); + free(sn); + sn = NULL; + free(fru_data); + fru_data = NULL; + return(-1); + } + /* Copy the new serial number in the board section saved in memory*/ + memcpy(fru_data + fru_data_offset, sn, sn_size); + checksum = 0; + /* Calculate Header Checksum */ + for(i = (header.offset.board * 8); + i < (((header.offset.board * 8) + board_sec_len) - 2); + i++) { + checksum += fru_data[i]; + } + checksum = (~checksum) + 1; + fru_data[(header.offset.board * 8) + board_sec_len - 1] = checksum; + /* Write the new FRU Board section */ + if (write_fru_area(intf, &fru, 0, (header.offset.board * 8), + (header.offset.board * 8), + board_sec_len, fru_data) < 0) { + free(sn); + sn = NULL; + free(fru_data); + fru_data = NULL; + return(-1); + } + /* Set the Product Section */ + prod_sec_len = (header.offset.multi * 8) - (header.offset.product * 8); + if (read_fru_area(intf, &fru, 0, (header.offset.product * 8), + prod_sec_len, fru_data) < 0) { + free(sn); + sn = NULL; + free(fru_data); + fru_data = NULL; + return(-1); + } + /* Position at Product Manufacturer */ + fru_data_offset = (header.offset.product * 8) + 3; + fru_area = get_fru_area_str(fru_data, &fru_data_offset); + /* Position at Product Name */ + fru_area = get_fru_area_str(fru_data, &fru_data_offset); + /* Position at Product Part */ + fru_area = get_fru_area_str(fru_data, &fru_data_offset); + /* Position at Product Version */ + fru_area = get_fru_area_str(fru_data, &fru_data_offset); + fru_data_offset_tmp = fru_data_offset; + /* Position at Serial Number */ + fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp); + fru_data_offset ++; + if (strlen(fru_area) != sn_size) { + free(sn); + sn = NULL; + free(fru_data); + fru_data = NULL; + printf("The length of the serial number in the FRU Product Area is wrong.\n"); + return(-1); + } + /* Copy the new serial number in the product section saved in memory*/ + memcpy(fru_data + fru_data_offset, sn, sn_size); + checksum = 0; + /* Calculate Header Checksum */ + for (i = (header.offset.product * 8); + i < (((header.offset.product * 8) + prod_sec_len) - 2); + i ++) { + checksum += fru_data[i]; + } + checksum = (~checksum) + 1; + fru_data[(header.offset.product * 8)+prod_sec_len - 1] = checksum; + /* Write the new FRU Board section */ + if (write_fru_area(intf, &fru, 0, (header.offset.product * 8), + (header.offset.product * 8), + prod_sec_len, fru_data) < 0) { + free(sn); + sn = NULL; + free(fru_data); + fru_data = NULL; + return -1; + } + free(sn); + sn = NULL; + free(fru_data); + fru_data = NULL; + return(1); } - /* ipmi_fru_set_mfg_date - Set the Manufacturing Date in FRU * - * @intf: ipmi interface - * @id: fru id + * @intf: ipmi interface + * @id: fru id * * returns -1 on error * returns 1 if successful */ static int -ipmi_kontron_set_mfg_date (struct ipmi_intf * intf) +ipmi_kontron_set_mfg_date (struct ipmi_intf *intf) { - struct ipmi_rs *rsp; - struct ipmi_rq req; - struct fru_info fru; - struct fru_header header; - uint8_t msg_data[4]; - uint8_t mfg_date[3]; - - uint32_t board_sec_len, i; - uint8_t *fru_data, checksum; - - - - - memset(msg_data, 0, 4); - msg_data[0] = 0xb4; - msg_data[1] = 0x90; - msg_data[2] = 0x91; - msg_data[3] = 0x8b; - - memset(&req, 0, sizeof(req)); - req.msg.netfn = 0x3E; - req.msg.cmd = 0x0E; - req.msg.data = msg_data; - req.msg.data_len = 4; - - /* Set Lun temporary, necessary for this oem command */ - req.msg.lun = 0x03; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) - { - printf("Device not present (No Response)\n"); - return(-1); - } - - if (rsp->ccode > 0) - { - printf("This option is not implemented for this board\n"); - return(-1); - } - - if(rsp->data_len != 3) - { - printf("Invalid response for the Manufacturing date\n"); - return(-1); - } - - memset(mfg_date, 0, 3); - memcpy(mfg_date, rsp->data, 3); - - memset(msg_data, 0, 4); - msg_data[0] = 0; - - memset(&req, 0, sizeof(req)); - req.msg.netfn = IPMI_NETFN_STORAGE; - req.msg.cmd = GET_FRU_INFO; - req.msg.data = msg_data; - req.msg.data_len = 1; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - printf(" Device not present (No Response)\n"); - return(-1); - } - if (rsp->ccode > 0) { - printf(" Device not present (%s)\n", - val2str(rsp->ccode, completion_code_vals)); - return(-1); - } - - memset(&fru, 0, sizeof(fru)); - fru.size = (rsp->data[1] << 8) | rsp->data[0]; - fru.access = rsp->data[2] & 0x1; - - if (fru.size < 1) { - printf(" Invalid FRU size %d", fru.size); - return(-1); - } - - /* - * retrieve the FRU header - */ - msg_data[0] = 0; - msg_data[1] = 0; - msg_data[2] = 0; - msg_data[3] = 8; - - memset(&req, 0, sizeof(req)); - req.msg.netfn = IPMI_NETFN_STORAGE; - req.msg.cmd = GET_FRU_DATA; - req.msg.data = msg_data; - req.msg.data_len = 4; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) - { - printf(" Device not present (No Response)\n"); - return(-1); - } - if (rsp->ccode > 0) - { - printf(" Device not present (%s)\n", - val2str(rsp->ccode, completion_code_vals)); - return(-1); - } - - if (verbose > 1) - printbuf(rsp->data, rsp->data_len, "FRU DATA"); - - memcpy(&header, rsp->data + 1, 8); - - if (header.version != 1) - { - printf(" Unknown FRU header version 0x%02x", - header.version); - return(-1); - } - - - board_sec_len = (header.offset.product * 8) - (header.offset.board * 8); - - fru_data = malloc( fru.size); - - if(fru_data == NULL) - { - printf("Out of memory!"); - return(-1); - } - - memset(fru_data, 0, fru.size); - if(read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8) ,board_sec_len , fru_data) < 0) - { - free(fru_data); - fru_data = NULL; - return(-1); - } - - /* Copy the new manufacturing date in the board section saved in memory*/ - memcpy(fru_data + (header.offset.board * 8) + 3, mfg_date, 3); - - checksum = 0; - /* Calculate Header Checksum */ - for( i = (header.offset.board * 8); i < (((header.offset.board * 8)+board_sec_len) - 2) ; i ++ ) - { - checksum += fru_data[i]; - } - checksum = (~checksum) + 1; - - fru_data[(header.offset.board * 8)+board_sec_len - 1] = checksum; - - /* Write the new FRU Board section */ - if(write_fru_area(intf, &fru, 0, (header.offset.board * 8), (header.offset.board * 8), board_sec_len, fru_data) < 0) - { - free(fru_data); - fru_data = NULL; - return(-1); - } - - free(fru_data); - fru_data = NULL; - return(1); + struct fru_header header; + struct fru_info fru; + struct ipmi_rs *rsp; + struct ipmi_rq req; + uint8_t *fru_data; + uint8_t checksum; + uint8_t msg_data[4]; + uint8_t mfg_date[3]; + uint32_t board_sec_len; + uint32_t i; + + memset(msg_data, 0, 4); + msg_data[0] = 0xb4; + msg_data[1] = 0x90; + msg_data[2] = 0x91; + msg_data[3] = 0x8b; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = 0x3E; + req.msg.cmd = 0x0E; + req.msg.data = msg_data; + req.msg.data_len = 4; + /* Set Lun temporary, necessary for this oem command */ + req.msg.lun = 0x03; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + printf("Device not present (No Response)\n"); + return(-1); + } else if (rsp->ccode > 0) { + printf("This option is not implemented for this board\n"); + return(-1); + } + if (rsp->data_len != 3) { + printf("Invalid response for the Manufacturing date\n"); + return(-1); + } + memset(mfg_date, 0, 3); + memcpy(mfg_date, rsp->data, 3); + memset(msg_data, 0, 4); + msg_data[0] = 0; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_STORAGE; + req.msg.cmd = GET_FRU_INFO; + req.msg.data = msg_data; + req.msg.data_len = 1; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + printf(" Device not present (No Response)\n"); + return(-1); + } else if (rsp->ccode > 0) { + printf(" Device not present (%s)\n", + val2str(rsp->ccode, completion_code_vals)); + return(-1); + } + + memset(&fru, 0, sizeof(fru)); + fru.size = (rsp->data[1] << 8) | rsp->data[0]; + fru.access = rsp->data[2] & 0x1; + if (fru.size < 1) { + printf(" Invalid FRU size %d", fru.size); + return(-1); + } + /* retrieve the FRU header */ + msg_data[0] = 0; + msg_data[1] = 0; + msg_data[2] = 0; + msg_data[3] = 8; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_STORAGE; + req.msg.cmd = GET_FRU_DATA; + req.msg.data = msg_data; + req.msg.data_len = 4; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + printf(" Device not present (No Response)\n"); + return (-1); + } else if (rsp->ccode > 0) { + printf(" Device not present (%s)\n", + val2str(rsp->ccode, completion_code_vals)); + return (-1); + } + if (verbose > 1) { + printbuf(rsp->data, rsp->data_len, "FRU DATA"); + } + memcpy(&header, rsp->data + 1, 8); + if (header.version != 1) { + printf(" Unknown FRU header version 0x%02x", + header.version); + return(-1); + } + board_sec_len = (header.offset.product * 8) - (header.offset.board * 8); + fru_data = malloc(fru.size); + if(fru_data == NULL) { + lprintf(LOG_ERR, "ipmitool: malloc failure"); + return(-1); + } + memset(fru_data, 0, fru.size); + if (read_fru_area(intf ,&fru ,0 ,(header.offset.board * 8), + board_sec_len ,fru_data) < 0) { + free(fru_data); + fru_data = NULL; + return(-1); + } + /* Copy the new manufacturing date in the board section saved in memory*/ + memcpy(fru_data + (header.offset.board * 8) + 3, mfg_date, 3); + checksum = 0; + /* Calculate Header Checksum */ + for (i = (header.offset.board * 8); + i < (((header.offset.board * 8) + board_sec_len) - 2); + i ++ ) { + checksum += fru_data[i]; + } + checksum = (~checksum) + 1; + fru_data[(header.offset.board * 8)+board_sec_len - 1] = checksum; + /* Write the new FRU Board section */ + if (write_fru_area(intf, &fru, 0, (header.offset.board * 8), + (header.offset.board * 8), + board_sec_len, fru_data) < 0) { + free(fru_data); + fru_data = NULL; + return (-1); + } + free(fru_data); + fru_data = NULL; + return (1); } - -static char *bootdev[] = {"BIOS", "FDD", "HDD", "CDROM", "network", 0}; - static void ipmi_kontron_nextboot_help(void) { - int i; - printf("nextboot \n" - "Supported devices:\n"); - for (i = 0; bootdev[i] != 0; i++) { - printf("- %s\n", bootdev[i]); - } + int i; + printf("nextboot \n" + "Supported devices:\n"); + for (i = 0; bootdev[i] != 0; i++) { + printf("- %s\n", bootdev[i]); + } } /* ipmi_kontron_next_boot_set - Select the next boot order on CP6012 * - * @intf: ipmi interface - * @id: fru id + * @intf: ipmi interface + * @id: fru id * * returns -1 on error * returns 1 if successful */ static int -ipmi_kontron_nextboot_set(struct ipmi_intf * intf, int argc, char **argv) +ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc, char **argv) { - struct ipmi_rs *rsp; - struct ipmi_rq req; - uint8_t msg_data[8]; - int i; - - memset(msg_data, 0, sizeof(msg_data)); - msg_data[0] = 0xb4; - msg_data[1] = 0x90; - msg_data[2] = 0x91; - msg_data[3] = 0x8b; - msg_data[4] = 0x9d; - msg_data[5] = 0xFF; - msg_data[6] = 0xFF; /* any */ - - for (i = 0; bootdev[i] != 0; i++) { - if (strcmp(argv[0], bootdev[i]) == 0) { - msg_data[5] = i; - break; - } - } - - /* Invalid device selected? */ - if (msg_data[5] == 0xFF) { - printf("Unknown boot device: %s\n", argv[0]); - return -1; - } - - memset(&req, 0, sizeof(req)); - req.msg.netfn = 0x3E; - req.msg.cmd = 0x02; - req.msg.data = msg_data; - req.msg.data_len = 7; - - /* Set Lun temporary, necessary for this oem command */ - req.msg.lun = 0x03; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) - { - printf("Device not present (No Response)\n"); - return(-1); - } - if (rsp->ccode > 0) { - printf("Device not present (%s)\n", - val2str(rsp->ccode, completion_code_vals)); - return(-1); - } - return 0; + struct ipmi_rs *rsp; + struct ipmi_rq req; + uint8_t msg_data[8]; + int i; + + memset(msg_data, 0, sizeof(msg_data)); + msg_data[0] = 0xb4; + msg_data[1] = 0x90; + msg_data[2] = 0x91; + msg_data[3] = 0x8b; + msg_data[4] = 0x9d; + msg_data[5] = 0xFF; + msg_data[6] = 0xFF; /* any */ + for (i = 0; bootdev[i] != 0; i++) { + if (strcmp(argv[0], bootdev[i]) == 0) { + msg_data[5] = i; + break; + } + } + /* Invalid device selected? */ + if (msg_data[5] == 0xFF) { + printf("Unknown boot device: %s\n", argv[0]); + return (-1); + } + memset(&req, 0, sizeof(req)); + req.msg.netfn = 0x3E; + req.msg.cmd = 0x02; + req.msg.data = msg_data; + req.msg.data_len = 7; + /* Set Lun temporary, necessary for this oem command */ + req.msg.lun = 0x03; + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + printf("Device not present (No Response)\n"); + return(-1); + } else if (rsp->ccode > 0) { + printf("Device not present (%s)\n", + val2str(rsp->ccode, completion_code_vals)); + return (-1); + } + return 0; } - diff --git a/lib/ipmi_main.c b/lib/ipmi_main.c index 14ca183..2bbbe4b 100644 --- a/lib/ipmi_main.c +++ b/lib/ipmi_main.c @@ -125,8 +125,8 @@ ipmi_password_file_read(char * filename) return NULL; } - /* remove trailing whitespace */ - l = strcspn(pass, " \r\n\t"); + /* remove traling */ + l = strcspn(pass, "\r\n\t"); if (l > 0) { pass[l] = '\0'; } diff --git a/lib/ipmi_picmg.c b/lib/ipmi_picmg.c index d1c82b2..7a66aa5 100644 --- a/lib/ipmi_picmg.c +++ b/lib/ipmi_picmg.c @@ -2345,7 +2345,7 @@ picmg_discover(struct ipmi_intf *intf) { req.msg.data_len = 1; msg_data = 0; - lprintf(LOG_INFO, "Running Get PICMG Properties my_addr %#x, transit %#x, target %#x", + lprintf(LOG_DEBUG, "Running Get PICMG Properties my_addr %#x, transit %#x, target %#x", intf->my_addr, intf->transit_addr, intf->target_addr); rsp = intf->sendrecv(intf, &req); if (rsp && !rsp->ccode) { @@ -2353,19 +2353,19 @@ picmg_discover(struct ipmi_intf *intf) { ((rsp->data[1] & 0x0F) == PICMG_ATCA_MAJOR_VERSION || (rsp->data[1] & 0x0F) == PICMG_AMC_MAJOR_VERSION) ) { intf->picmg_avail = 1; - lprintf(LOG_INFO, "Discovered PICMG Extension %d.%d", + lprintf(LOG_DEBUG, "Discovered PICMG Extension %d.%d", (rsp->data[1] & 0x0f), (rsp->data[1] >> 4)); - } + } } else { if (rsp == NULL) { - lprintf(LOG_INFO,"No Response from Get PICMG Properties"); + lprintf(LOG_DEBUG,"No Response from Get PICMG Properties"); } else { - lprintf(LOG_INFO,"Error Response %#x from Get PICMG Properities", rsp->ccode); + lprintf(LOG_DEBUG,"Error Response %#x from Get PICMG Properities", rsp->ccode); } } } if (intf->picmg_avail == 0) { - lprintf(LOG_INFO, "No PICMG Extenstion discovered"); + lprintf(LOG_DEBUG, "No PICMG Extenstion discovered"); } return intf->picmg_avail; } diff --git a/lib/ipmi_sel.c b/lib/ipmi_sel.c index 21ce0c4..67e12e3 100644 --- a/lib/ipmi_sel.c +++ b/lib/ipmi_sel.c @@ -1778,7 +1778,7 @@ ipmi_sel_print_std_entry(struct ipmi_intf * intf, struct sel_event_record * evt) else printf(" | "); - if(evt->record_type < 0xdf) + if(evt->record_type <= 0xdf) { printf ("%02x%02x%02x", evt->sel_type.oem_ts_type.manf_id[0], evt->sel_type.oem_ts_type.manf_id[1], evt->sel_type.oem_ts_type.manf_id[2]); if (csv_output) @@ -1979,7 +1979,7 @@ ipmi_sel_print_std_entry_verbose(struct ipmi_intf * intf, struct sel_event_recor if (evt->record_type >= 0xc0) { - if(evt->record_type < 0xdf) + if(evt->record_type <= 0xdf) { printf (" Manufactacturer ID : %02x%02x%02x\n", evt->sel_type.oem_ts_type.manf_id[0], evt->sel_type.oem_ts_type.manf_id[1], evt->sel_type.oem_ts_type.manf_id[2]); diff --git a/lib/ipmi_sensor.c b/lib/ipmi_sensor.c index 4ef5138..c138c67 100644 --- a/lib/ipmi_sensor.c +++ b/lib/ipmi_sensor.c @@ -42,7 +42,8 @@ #include extern int verbose; -void printf_sensor_get_usage(); +void print_sensor_get_usage(); +void print_sensor_thresh_usage(); // Macro's for Reading the current sensor Data. #define SCANNING_DISABLED 0x40 @@ -515,7 +516,6 @@ __ipmi_sensor_threshold_value_to_raw(struct sdr_record_full_sensor *full, double } } - static int ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) { @@ -531,33 +531,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) struct sdr_record_list *sdr; if (argc < 3 || strncmp(argv[0], "help", 4) == 0) { - lprintf(LOG_NOTICE, "sensor thresh "); - lprintf(LOG_NOTICE, - " id : name of the sensor for which threshold is to be set"); - lprintf(LOG_NOTICE, " threshold : which threshold to set"); - lprintf(LOG_NOTICE, - " unr = upper non-recoverable"); - lprintf(LOG_NOTICE, " ucr = upper critical"); - lprintf(LOG_NOTICE, - " unc = upper non-critical"); - lprintf(LOG_NOTICE, - " lnc = lower non-critical"); - lprintf(LOG_NOTICE, " lcr = lower critical"); - lprintf(LOG_NOTICE, - " lnr = lower non-recoverable"); - lprintf(LOG_NOTICE, - " setting : the value to set the threshold to"); - lprintf(LOG_NOTICE, ""); - lprintf(LOG_NOTICE, - "sensor thresh lower "); - lprintf(LOG_NOTICE, - " Set all lower thresholds at the same time"); - lprintf(LOG_NOTICE, ""); - lprintf(LOG_NOTICE, - "sensor thresh upper "); - lprintf(LOG_NOTICE, - " Set all upper thresholds at the same time"); - lprintf(LOG_NOTICE, ""); + print_sensor_thresh_usage(); return 0; } @@ -589,7 +563,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) } else if (strncmp(thresh, "lower", 5) == 0) { if (argc < 5) { lprintf(LOG_ERR, - "usage: sensor thresh lower "); + "usage: sensor thresh lower "); return -1; } allLower = 1; @@ -899,10 +873,10 @@ ipmi_sensor_get(struct ipmi_intf *intf, int argc, char **argv) if (argc < 1) { lprintf(LOG_ERR, "Not enough parameters given."); - printf_sensor_get_usage(); + print_sensor_get_usage(); return (-1); } else if (strcmp(argv[0], "help") == 0) { - printf_sensor_get_usage(); + print_sensor_get_usage(); return 0; } printf("Locating sensor record...\n"); @@ -952,13 +926,55 @@ ipmi_sensor_main(struct ipmi_intf *intf, int argc, char **argv) return rc; } -/* printf_sensor_get_usage - print usage for # ipmitool sensor get NAC; +/* print_sensor_get_usage - print usage for # ipmitool sensor get NAC; * * @returns: void */ void -printf_sensor_get_usage() +print_sensor_get_usage() { lprintf(LOG_NOTICE, "sensor get ... [id]"); lprintf(LOG_NOTICE, " id : name of desired sensor"); } + +/* print_sensor_thresh_set_usage - print usage for # ipmitool sensor thresh; + * + * @returns: void + */ +void +print_sensor_thresh_usage() +{ + lprintf(LOG_NOTICE, +"sensor thresh "); + lprintf(LOG_NOTICE, +" id : name of the sensor for which threshold is to be set"); + lprintf(LOG_NOTICE, +" threshold : which threshold to set"); + lprintf(LOG_NOTICE, +" unr = upper non-recoverable"); + lprintf(LOG_NOTICE, +" ucr = upper critical"); + lprintf(LOG_NOTICE, +" unc = upper non-critical"); + lprintf(LOG_NOTICE, +" lnc = lower non-critical"); + lprintf(LOG_NOTICE, +" lcr = lower critical"); + lprintf(LOG_NOTICE, +" lnr = lower non-recoverable"); + lprintf(LOG_NOTICE, +" setting : the value to set the threshold to"); + lprintf(LOG_NOTICE, +""); + lprintf(LOG_NOTICE, +"sensor thresh lower "); + lprintf(LOG_NOTICE, +" Set all lower thresholds at the same time"); + lprintf(LOG_NOTICE, +""); + lprintf(LOG_NOTICE, +"sensor thresh upper "); + lprintf(LOG_NOTICE, +" Set all upper thresholds at the same time"); + lprintf(LOG_NOTICE, ""); +} diff --git a/lib/ipmi_sol.c b/lib/ipmi_sol.c index a5b962f..cf58b44 100644 --- a/lib/ipmi_sol.c +++ b/lib/ipmi_sol.c @@ -1477,33 +1477,28 @@ static int ipmi_sol_keepalive_using_sol(struct ipmi_intf * intf) { struct ipmi_v2_payload v2_payload; - struct ipmi_rs * rsp = NULL; struct timeval end; - int ret = 0; - if (_disable_keepalive) return 0; gettimeofday(&end, 0); if (end.tv_sec - _start_keepalive.tv_sec > SOL_KEEPALIVE_TIMEOUT) { - memset(&v2_payload, 0, sizeof(v2_payload)); - - v2_payload.payload.sol_packet.character_count = 0; - - rsp = intf->send_sol(intf, &v2_payload); - + memset(&v2_payload, 0, sizeof(v2_payload)); + v2_payload.payload.sol_packet.character_count = 0; + if (intf->send_sol(intf, &v2_payload) == NULL) + return -1; + /* good return, reset start time */ gettimeofday(&_start_keepalive, 0); - } - return ret; + } + return 0; } static int ipmi_sol_keepalive_using_getdeviceid(struct ipmi_intf * intf) { struct timeval end; - static int ret = 0; if (_disable_keepalive) return 0; @@ -1511,16 +1506,12 @@ ipmi_sol_keepalive_using_getdeviceid(struct ipmi_intf * intf) gettimeofday(&end, 0); if (end.tv_sec - _start_keepalive.tv_sec > SOL_KEEPALIVE_TIMEOUT) { - ret = intf->keepalive(intf); - if ( (ret!=0) && (_keepalive_retries < SOL_KEEPALIVE_RETRIES) ) { - ret = 0; - _keepalive_retries++; - } - else if ((ret==0) && (_keepalive_retries > 0)) - _keepalive_retries = 0; + if (intf->keepalive(intf) != 0) + return -1; + /* good return, reset start time */ gettimeofday(&_start_keepalive, 0); - } - return ret; + } + return 0; } @@ -1653,14 +1644,15 @@ ipmi_sol_red_pill(struct ipmi_intf * intf, int instance) else if (FD_ISSET(intf->fd, &read_fds)) { struct ipmi_rs * rs =intf->recv_sol(intf); - if (! rs) - { - bShouldExit = bBmcClosedSession = 1; - } - else + if ( rs) { output(rs); } + /* + * Should recv_sol come back null, the incoming packet was not ours. + * Just fall through, the keepalive logic will determine if + * the BMC has dropped the session. + */ } diff --git a/lib/ipmi_tsol.c b/lib/ipmi_tsol.c index 94ea284..b4e3cc1 100644 --- a/lib/ipmi_tsol.c +++ b/lib/ipmi_tsol.c @@ -76,78 +76,77 @@ static int _altterm = 0; extern int verbose; static int -ipmi_tsol_command(struct ipmi_intf * intf, char *recvip, int port, unsigned char cmd) +ipmi_tsol_command(struct ipmi_intf *intf, char *recvip, int port, + unsigned char cmd) { - struct ipmi_rs *rsp; - struct ipmi_rq req; - unsigned char data[6]; - unsigned ip1, ip2, ip3, ip4; - - if (sscanf(recvip, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4) != 4) { - lprintf(LOG_ERR, "Invalid IP address: %s", recvip); - return -1; - } - + struct ipmi_rs *rsp; + struct ipmi_rq req; + unsigned char data[6]; + unsigned ip1, ip2, ip3, ip4; + + if (sscanf(recvip, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4) != 4) { + lprintf(LOG_ERR, "Invalid IP address: %s", recvip); + return (-1); + } memset(&req, 0, sizeof(struct ipmi_rq)); - req.msg.netfn = IPMI_NETFN_TSOL; - req.msg.cmd = cmd; - req.msg.data_len = 6; - req.msg.data = data; + req.msg.netfn = IPMI_NETFN_TSOL; + req.msg.cmd = cmd; + req.msg.data_len = 6; + req.msg.data = data; memset(data, 0, sizeof(data)); - data[0] = ip1; - data[1] = ip2; - data[2] = ip3; - data[3] = ip4; - data[4] = (port & 0xff00) >> 8; - data[5] = (port & 0xff); - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + data[0] = ip1; + data[1] = ip2; + data[2] = ip3; + data[3] = ip4; + data[4] = (port & 0xff00) >> 8; + data[5] = (port & 0xff); + + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { lprintf(LOG_ERR, "Unable to perform TSOL command"); - return -1; + return (-1); } if (rsp->ccode > 0) { lprintf(LOG_ERR, "Unable to perform TSOL command: %s", - val2str(rsp->ccode, completion_code_vals)); - return -1; - } - - return 0; + val2str(rsp->ccode, completion_code_vals)); + return (-1); + } + return 0; } static int -ipmi_tsol_start(struct ipmi_intf * intf, char *recvip, int port) +ipmi_tsol_start(struct ipmi_intf *intf, char *recvip, int port) { return ipmi_tsol_command(intf, recvip, port, IPMI_TSOL_CMD_START); } static int -ipmi_tsol_stop(struct ipmi_intf * intf, char *recvip, int port) +ipmi_tsol_stop(struct ipmi_intf *intf, char *recvip, int port) { - return ipmi_tsol_command(intf, recvip, port, IPMI_TSOL_CMD_STOP); + return ipmi_tsol_command(intf, recvip, port, IPMI_TSOL_CMD_STOP); } static int -ipmi_tsol_send_keystroke(struct ipmi_intf * intf, char *buff, int length) +ipmi_tsol_send_keystroke(struct ipmi_intf *intf, char *buff, int length) { - struct ipmi_rs * rsp; - struct ipmi_rq req; - unsigned char data[16]; + struct ipmi_rs *rsp; + struct ipmi_rq req; + unsigned char data[16]; static unsigned char keyseq = 0; memset(&req, 0, sizeof(struct ipmi_rq)); - req.msg.netfn = IPMI_NETFN_TSOL; - req.msg.cmd = IPMI_TSOL_CMD_SENDKEY; - req.msg.data_len = length + 2; - req.msg.data = data; + req.msg.netfn = IPMI_NETFN_TSOL; + req.msg.cmd = IPMI_TSOL_CMD_SENDKEY; + req.msg.data_len = length + 2; + req.msg.data = data; memset(data, 0, sizeof(data)); - data[0] = length + 1; + data[0] = length + 1; memcpy(data + 1, buff, length); data[length + 1] = keyseq++; - rsp = intf->sendrecv(intf, &req); + rsp = intf->sendrecv(intf, &req); if (verbose) { if (rsp == NULL) { lprintf(LOG_ERR, "Unable to send keystroke"); @@ -155,61 +154,56 @@ ipmi_tsol_send_keystroke(struct ipmi_intf * intf, char *buff, int length) } if (rsp->ccode > 0) { lprintf(LOG_ERR, "Unable to send keystroke: %s", - val2str(rsp->ccode, completion_code_vals)); + val2str(rsp->ccode, completion_code_vals)); return -1; } } - - return length; + return length; } static int -tsol_keepalive(struct ipmi_intf * intf) +tsol_keepalive(struct ipmi_intf *intf) { - struct timeval end; - - gettimeofday(&end, 0); - - if (end.tv_sec - _start_keepalive.tv_sec <= 30) - return 0; - - intf->keepalive(intf); - + struct timeval end; + gettimeofday(&end, 0); + if (end.tv_sec - _start_keepalive.tv_sec <= 30) { + return 0; + } + intf->keepalive(intf); gettimeofday(&_start_keepalive, 0); - - return 0; + return 0; } static void print_escape_seq(struct ipmi_intf *intf) { lprintf(LOG_NOTICE, - " %c. - terminate connection\n" - " %c^Z - suspend ipmitool\n" - " %c^X - suspend ipmitool, but don't restore tty on restart\n" - " %c? - this message\n" - " %c%c - send the escape character by typing it twice\n" - " (Note that escapes are only recognized immediately after newline.)", - intf->session->sol_escape_char, - intf->session->sol_escape_char, - intf->session->sol_escape_char, - intf->session->sol_escape_char, - intf->session->sol_escape_char, - intf->session->sol_escape_char); +" %c. - terminate connection\n" +" %c^Z - suspend ipmitool\n" +" %c^X - suspend ipmitool, but don't restore tty on restart\n" +" %c? - this message\n" +" %c%c - send the escape character by typing it twice\n" +" (Note that escapes are only recognized immediately after newline.)", + intf->session->sol_escape_char, + intf->session->sol_escape_char, + intf->session->sol_escape_char, + intf->session->sol_escape_char, + intf->session->sol_escape_char, + intf->session->sol_escape_char); } static int leave_raw_mode(void) { - if (!_in_raw_mode) + if (!_in_raw_mode) { return -1; - else if (tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio) == -1) + } else if (tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio) == -1) { lperror(LOG_ERR, "tcsetattr(stdin)"); - else if (tcsetattr(fileno(stdout), TCSADRAIN, &_saved_tio) == -1) + } else if (tcsetattr(fileno(stdout), TCSADRAIN, &_saved_tio) == -1) { lperror(LOG_ERR, "tcsetattr(stdout)"); - else + } else { _in_raw_mode = 0; - + } return 0; } @@ -217,16 +211,14 @@ static int enter_raw_mode(void) { struct termios tio; - if (tcgetattr(fileno(stdout), &_saved_tio) < 0) { lperror(LOG_ERR, "tcgetattr failed"); return -1; } tio = _saved_tio; - if (_altterm) { - tio.c_iflag &= (ISTRIP | IGNBRK ); + tio.c_iflag &= (ISTRIP | IGNBRK); tio.c_cflag &= ~(CSIZE | PARENB | IXON | IXOFF | IXANY); tio.c_cflag |= (CS8 |CREAD) | (IXON|IXOFF|IXANY); tio.c_lflag &= 0; @@ -241,13 +233,13 @@ enter_raw_mode(void) tio.c_cc[VTIME] = 0; } - if (tcsetattr(fileno(stdin), TCSADRAIN, &tio) < 0) + if (tcsetattr(fileno(stdin), TCSADRAIN, &tio) < 0) { lperror(LOG_ERR, "tcsetattr(stdin)"); - else if (tcsetattr(fileno(stdout), TCSADRAIN, &tio) < 0) + } else if (tcsetattr(fileno(stdout), TCSADRAIN, &tio) < 0) { lperror(LOG_ERR, "tcsetattr(stdout)"); - else + } else { _in_raw_mode = 1; - + } return 0; } @@ -255,11 +247,10 @@ static void suspend_self(int restore_tty) { leave_raw_mode(); - kill(getpid(), SIGTSTP); - - if (restore_tty) + if (restore_tty) { enter_raw_mode(); + } } static int @@ -272,7 +263,7 @@ do_inbuf_actions(struct ipmi_intf *intf, char *in_buff, int len) for(i = 0; i < len ;) { if (!in_esc) { if (last_was_cr && - (in_buff[i] == intf->session->sol_escape_char)) { + (in_buff[i] == intf->session->sol_escape_char)) { in_esc = 1; memmove(in_buff, in_buff + 1, len - i - 1); len--; @@ -289,40 +280,35 @@ do_inbuf_actions(struct ipmi_intf *intf, char *in_buff, int len) switch (in_buff[i]) { case '.': printf("%c. [terminated ipmitool]\n", - intf->session->sol_escape_char); + intf->session->sol_escape_char); return -1; - case 'Z' - 64: printf("%c^Z [suspend ipmitool]\n", - intf->session->sol_escape_char); - suspend_self(1); /* Restore tty back to raw */ + intf->session->sol_escape_char); + /* Restore tty back to raw */ + suspend_self(1); break; - case 'X' - 64: printf("%c^X [suspend ipmitool]\n", - intf->session->sol_escape_char); - suspend_self(0); /* Don't restore to raw mode */ + intf->session->sol_escape_char); + /* Don't restore to raw mode */ + suspend_self(0); break; - case '?': printf("%c? [ipmitool help]\n", - intf->session->sol_escape_char); + intf->session->sol_escape_char); print_escape_seq(intf); break; } - memmove(in_buff, in_buff + 1, len - i - 1); + memmove(in_buff, (in_buff + 1), (len - i - 1)); len--; in_esc = 0; - continue; } - last_was_cr = (in_buff[i] == '\r' || in_buff[i] == '\n'); - i++; } - return len; } @@ -330,27 +316,25 @@ do_inbuf_actions(struct ipmi_intf *intf, char *in_buff, int len) static void do_terminal_cleanup(void) { - if (_saved_winsize.ws_row > 0 && _saved_winsize.ws_col > 0) + if (_saved_winsize.ws_row > 0 && _saved_winsize.ws_col > 0) { ioctl(fileno(stdout), TIOCSWINSZ, &_saved_winsize); - + } leave_raw_mode(); - - if (errno) + if (errno) { lprintf(LOG_ERR, "Exiting due to error %d -> %s", errno, strerror(errno)); + } } static void set_terminal_size(int rows, int cols) { struct winsize winsize; - - if (rows <= 0 || cols <= 0) + if (rows <= 0 || cols <= 0) { return; - + } /* save initial winsize */ ioctl(fileno(stdout), TIOCGWINSZ, &_saved_winsize); - /* set new winsize */ winsize.ws_row = rows; winsize.ws_col = cols; @@ -361,30 +345,35 @@ static void print_tsol_usage(void) { struct winsize winsize; - - lprintf(LOG_NOTICE, "Usage: tsol [recvip] [port=NUM] [ro|rw] [rows=NUM] [cols=NUM] [altterm]"); - lprintf(LOG_NOTICE, " recvip Receiver IP Address [default=local]"); - lprintf(LOG_NOTICE, " port=NUM Receiver UDP Port [default=%d]", - IPMI_TSOL_DEF_PORT); - lprintf(LOG_NOTICE, " ro|rw Set Read-Only or Read-Write [default=rw]"); - - ioctl(fileno(stdout), TIOCGWINSZ, &winsize); - lprintf(LOG_NOTICE, " rows=NUM Set terminal rows [default=%d]", - winsize.ws_row); - lprintf(LOG_NOTICE, " cols=NUM Set terminal columns [default=%d]", - winsize.ws_col); - - lprintf(LOG_NOTICE, " altterm Alternate terminal setup [default=off]"); + lprintf(LOG_NOTICE, +"Usage: tsol [recvip] [port=NUM] [ro|rw] [rows=NUM] [cols=NUM] [altterm]"); + lprintf(LOG_NOTICE, +" recvip Receiver IP Address [default=local]"); + lprintf(LOG_NOTICE, +" port=NUM Receiver UDP Port [default=%d]", + IPMI_TSOL_DEF_PORT); + lprintf(LOG_NOTICE, +" ro|rw Set Read-Only or Read-Write [default=rw]"); + ioctl(fileno(stdout), TIOCGWINSZ, &winsize); + lprintf(LOG_NOTICE, +" rows=NUM Set terminal rows [default=%d]", + winsize.ws_row); + lprintf(LOG_NOTICE, +" cols=NUM Set terminal columns [default=%d]", + winsize.ws_col); + lprintf(LOG_NOTICE, +" altterm Alternate terminal setup [default=off]"); } int -ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_tsol_main(struct ipmi_intf *intf, int argc, char **argv) { struct pollfd fds_wait[3], fds_data_wait[3], *fds; struct sockaddr_in sin, myaddr, *sa_in; socklen_t mylen; char *recvip = NULL; - char out_buff[IPMI_BUF_SIZE * 8], in_buff[IPMI_BUF_SIZE]; + char in_buff[IPMI_BUF_SIZE]; + char out_buff[IPMI_BUF_SIZE * 8]; char buff[IPMI_BUF_SIZE + 4]; int fd_socket, result, i; int out_buff_fill, in_buff_fill; @@ -394,7 +383,7 @@ ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) if (strlen(intf->name) < 3 || strncmp(intf->name, "lan", 3) != 0) { lprintf(LOG_ERR, "Error: Tyan SOL is only available over lan interface"); - return -1; + return (-1); } for (i = 0; isession->addr; result = inet_pton(AF_INET, (const char *)intf->session->hostname, - &sa_in->sin_addr); + &sa_in->sin_addr); if (result <= 0) { struct hostent *host = gethostbyname((const char *)intf->session->hostname); @@ -457,7 +448,7 @@ ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_ERR, "Can't open port %d", port); return -1; } - if (-1 == bind(fd_socket, (struct sockaddr *)&sin, sizeof(sin))) { + if (bind(fd_socket, (struct sockaddr *)&sin, sizeof(sin)) == (-1)) { lprintf(LOG_ERR, "Failed to bind socket."); close(fd_socket); return -1; @@ -467,7 +458,8 @@ ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) * retrieve local IP address if not supplied on command line */ if (recvip == NULL) { - result = intf->open(intf); /* must connect first */ + /* must connect first */ + result = intf->open(intf); if (result < 0) { close(fd_socket); return -1; @@ -489,7 +481,7 @@ ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) } printf("[Starting %sSOL with receiving address %s:%d]\n", - read_only ? "Read-only " : "", recvip, port); + read_only ? "Read-only " : "", recvip, port); set_terminal_size(rows, cols); enter_raw_mode(); @@ -499,14 +491,14 @@ ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) * ipmitool -I lan -H 192.168.168.227 -U Administrator raw 0x30 0x06 0xC0 0xA8 0xA8 0x78 0x1A 0x0A */ result = ipmi_tsol_start(intf, recvip, port); - if (result < 0) { + if (result < 0) { lprintf(LOG_ERR, "Error starting SOL"); close(fd_socket); - return -1; - } + return (-1); + } printf("[SOL Session operational. Use %c? for help]\n", - intf->session->sol_escape_char); + intf->session->sol_escape_char); gettimeofday(&_start_keepalive, 0); @@ -533,52 +525,58 @@ ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) out_buff_fill = 0; in_buff_fill = 0; fds = fds_wait; - for (;;) { - result = poll(fds, 3, 15*1000); - if (result < 0) + result = poll(fds, 3, 15 * 1000); + if (result < 0) { break; + } /* send keepalive packet */ tsol_keepalive(intf); - if ((fds[0].revents & POLLIN) && (sizeof(out_buff) > out_buff_fill)){ + if ((fds[0].revents & POLLIN) && (sizeof(out_buff) > out_buff_fill)) { socklen_t sin_len = sizeof(sin); - result = recvfrom(fd_socket, buff, sizeof(out_buff) - out_buff_fill + 4, 0, - (struct sockaddr *)&sin, &sin_len); - - /* read the data from udp socket, skip some bytes in the head */ - if((result - 4) > 0 ){ + int buff_size = sizeof(buff); + if ((sizeof(out_buff) - out_buff_fill + 4) < buff_size) { + buff_size = (sizeof(out_buff) - out_buff_fill) + 4; + if ((buff_size - 4) <= 0) { + buff_size = 0; + } + } + result = recvfrom(fd_socket, buff, + buff_size, 0, + (struct sockaddr *)&sin, &sin_len); + /* read the data from udp socket, + * skip some bytes in the head + */ + if ((result - 4) > 0) { int length = result - 4; -#if 1 - length = (unsigned char)buff[2] & 0xff; - length *= 256; - length += ((unsigned char)buff[3] & 0xff); - if ((length <= 0) || (length > (result - 4))) - length = result - 4; -#endif memcpy(out_buff + out_buff_fill, buff + 4, length); out_buff_fill += length; } } if ((fds[1].revents & POLLIN) && (sizeof(in_buff) > in_buff_fill)) { + /* Read from keyboard */ result = read(fileno(stdin), in_buff + in_buff_fill, - sizeof(in_buff) - in_buff_fill); // read from keyboard + sizeof(in_buff) - in_buff_fill); if (result > 0) { int bytes; - bytes = do_inbuf_actions(intf, in_buff + in_buff_fill, result); - if(bytes < 0) { + bytes = do_inbuf_actions(intf, + in_buff + in_buff_fill, result); + if (bytes < 0) { result = ipmi_tsol_stop(intf, recvip, port); do_terminal_cleanup(); return result; } - if (read_only) + if (read_only) { bytes = 0; + } in_buff_fill += bytes; } } if ((fds[2].revents & POLLOUT) && out_buff_fill) { - result = write(fileno(stdout), out_buff, out_buff_fill); // to screen + /* To screen */ + result = write(fileno(stdout), out_buff, out_buff_fill); if (result > 0) { out_buff_fill -= result; if (out_buff_fill) { @@ -591,7 +589,8 @@ ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) * translate key and send that to SMDC using IPMI * ipmitool -I lan -H 192.168.168.227 -U Administrator raw 0x30 0x03 0x04 0x1B 0x5B 0x43 */ - result = ipmi_tsol_send_keystroke(intf, in_buff, __min(in_buff_fill,14)); + result = ipmi_tsol_send_keystroke(intf, + in_buff, __min(in_buff_fill, 14)); if (result > 0) { gettimeofday(&_start_keepalive, 0); in_buff_fill -= result; @@ -603,6 +602,5 @@ ipmi_tsol_main(struct ipmi_intf * intf, int argc, char ** argv) fds = (in_buff_fill || out_buff_fill )? fds_data_wait : fds_wait; } - return 0; } -- cgit v1.2.3