diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/Makefile.am | 2 | ||||
-rw-r--r-- | util/Makefile.in | 7 | ||||
-rw-r--r-- | util/ialarms.c | 2 | ||||
-rw-r--r-- | util/icmd.c | 2 | ||||
-rw-r--r-- | util/iconfig.c | 2 | ||||
-rw-r--r-- | util/idcmi.c | 2 | ||||
-rw-r--r-- | util/ievents.c | 2 | ||||
-rw-r--r-- | util/ifirewall.c | 2 | ||||
-rw-r--r-- | util/ifru.c | 2 | ||||
-rw-r--r-- | util/ifruset.c | 2 | ||||
-rw-r--r-- | util/igetevent.c | 2 | ||||
-rw-r--r-- | util/ihealth.c | 5 | ||||
-rw-r--r-- | util/ilan.c | 9765 | ||||
-rw-r--r-- | util/ilan.c~ | 5242 | ||||
-rw-r--r-- | util/ipicmg.c | 2 | ||||
-rw-r--r-- | util/ipmiutil.c | 5 | ||||
-rw-r--r-- | util/ipmiutil.h | 1 | ||||
-rw-r--r-- | util/ipmiutil.mak | 5 | ||||
-rw-r--r-- | util/ipmiutil64.mak | 5 | ||||
-rw-r--r-- | util/ireset.c | 2 | ||||
-rw-r--r-- | util/isel.c | 2 | ||||
-rw-r--r-- | util/iseltime.c | 55 | ||||
-rw-r--r-- | util/isensor.c | 2 | ||||
-rw-r--r-- | util/iserial.c | 2 | ||||
-rw-r--r-- | util/isol.c | 2 | ||||
-rw-r--r-- | util/itsol.c | 2 | ||||
-rw-r--r-- | util/iuser.c | 298 | ||||
-rw-r--r-- | util/iwdt.c | 2 | ||||
-rw-r--r-- | util/oem_dell.c | 2 | ||||
-rw-r--r-- | util/oem_hp.c | 13 | ||||
-rw-r--r-- | util/oem_sun.c | 2 | ||||
-rw-r--r-- | util/oem_supermicro.c | 2 |
32 files changed, 10948 insertions, 4495 deletions
diff --git a/util/Makefile.am b/util/Makefile.am index 3293943..f8f0bab 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -27,7 +27,7 @@ OEMMOD = oem_kontron.c oem_fujitsu.c oem_intel.c oem_sun.c oem_supermicro.c oem_ L2OBJ = @SAM2OBJ@ AM_CPPFLAGS += -I. -I.. -DMETACOMMAND -METASOURCE = ipmiutil.c ialarms.c ihealth.c ievents.c ifru.c ifru_picmg.c igetevent.c ireset.c icmd.c ilan.c isensor.c isel.c iserial.c iwdt.c isol.c idiscover.c iconfig.c ipicmg.c ifirewall.c ifwum.c ihpm.c itsol.c idcmi.c $(OEMMOD) $(CMDMOD) +METASOURCE = ipmiutil.c ialarms.c ihealth.c ievents.c ifru.c ifru_picmg.c igetevent.c ireset.c icmd.c ilan.c isensor.c isel.c iserial.c iwdt.c isol.c idiscover.c iconfig.c ipicmg.c ifirewall.c ifwum.c ihpm.c itsol.c idcmi.c iuser.c $(OEMMOD) $(CMDMOD) LDADD += -lpthread # The LanDesk library is proprietary, so it is incompatible with ALLOW_GPL. diff --git a/util/Makefile.in b/util/Makefile.in index 30be248..08c6ba2 100644 --- a/util/Makefile.in +++ b/util/Makefile.in @@ -87,8 +87,8 @@ am__objects_3 = ipmiutil.$(OBJEXT) ialarms.$(OBJEXT) ihealth.$(OBJEXT) \ iserial.$(OBJEXT) iwdt.$(OBJEXT) isol.$(OBJEXT) \ idiscover.$(OBJEXT) iconfig.$(OBJEXT) ipicmg.$(OBJEXT) \ ifirewall.$(OBJEXT) ifwum.$(OBJEXT) ihpm.$(OBJEXT) \ - itsol.$(OBJEXT) idcmi.$(OBJEXT) $(am__objects_1) \ - $(am__objects_2) + itsol.$(OBJEXT) idcmi.$(OBJEXT) iuser.$(OBJEXT) \ + $(am__objects_1) $(am__objects_2) am_ipmiutil_OBJECTS = $(am__objects_3) ipmiutil_OBJECTS = $(am_ipmiutil_OBJECTS) ipmiutil_LDADD = $(LDADD) @@ -297,7 +297,7 @@ CMDMOD = ipmicmd.c mem_if.c ipmidir.c imbapi.c ipmimv.c ipmild.c \ LIBOBJ = ipmicmd.o mem_if.o ipmidir.o imbapi.o ipmimv.o ipmild.o ipmibmc.o ipmilipmi.o subs.o md5.o md2.o $(tmpobj)/ipmilan.o $(tmpobj)/ipmilanplus.o @LIBSENSORS@ OEMMOD = oem_kontron.c oem_fujitsu.c oem_intel.c oem_sun.c oem_supermicro.c oem_dell.c oem_quanta.c oem_hp.c oem_newisys.c oem_lenovo.c oem_asus.c iekanalyzer.c L2OBJ = @SAM2OBJ@ -METASOURCE = ipmiutil.c ialarms.c ihealth.c ievents.c ifru.c ifru_picmg.c igetevent.c ireset.c icmd.c ilan.c isensor.c isel.c iserial.c iwdt.c isol.c idiscover.c iconfig.c ipicmg.c ifirewall.c ifwum.c ihpm.c itsol.c idcmi.c $(OEMMOD) $(CMDMOD) +METASOURCE = ipmiutil.c ialarms.c ihealth.c ievents.c ifru.c ifru_picmg.c igetevent.c ireset.c icmd.c ilan.c isensor.c isel.c iserial.c iwdt.c isol.c idiscover.c iconfig.c ipicmg.c ifirewall.c ifwum.c ihpm.c itsol.c idcmi.c iuser.c $(OEMMOD) $(CMDMOD) LANPLUS_OBJ = $(shell ar t @LANPLUS_LIB@ 2>/dev/null) DEV_LIB = libipmiutil.a # SHRLINK is libipmiutil.so.1 if OS supports it @@ -476,6 +476,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iserial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itsol.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iuser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iwdt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ diff --git a/util/ialarms.c b/util/ialarms.c index 3fa821b..3b73885 100644 --- a/util/ialarms.c +++ b/util/ialarms.c @@ -75,7 +75,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* * Global variables */ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "ialarms"; static char fdebug = 0; static char fbmctam = 0; diff --git a/util/icmd.c b/util/icmd.c index d2f7508..2f62b00 100644 --- a/util/icmd.c +++ b/util/icmd.c @@ -78,7 +78,7 @@ extern void ipmi_lan_set_timeout(int ipmito, int tries, int pingto); /* * Global variables */ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "icmd"; static char fdebug = 0; static char fquiet = 0; diff --git a/util/iconfig.c b/util/iconfig.c index dd43225..d29dd8f 100644 --- a/util/iconfig.c +++ b/util/iconfig.c @@ -172,7 +172,7 @@ typedef struct /* * Global variables */ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "iconfig"; static char fdebug = 0; static char fipmilan = 0; diff --git a/util/idcmi.c b/util/idcmi.c index fcadbac..9382aa7 100644 --- a/util/idcmi.c +++ b/util/idcmi.c @@ -62,7 +62,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "idcmi.h" static char * progname = "idcmi"; -static char * progver = "3.02"; +static char * progver = "3.03"; extern char fdebug; /*from ipmicmd.c*/ static uchar g_bus = PUBLIC_BUS; static uchar g_sa = BMC_SA; diff --git a/util/ievents.c b/util/ievents.c index 284343b..dc49508 100644 --- a/util/ievents.c +++ b/util/ievents.c @@ -76,7 +76,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SELprintf printf #define SMS_SA 0x41 #define SMI_SA 0x21 -static char *progver = "3.02"; +static char *progver = "3.03"; static char *progname = "ievents"; static char fsensdesc = 0; /* 1= get extended sensor descriptions*/ static char fcanonical = 0; /* 1= show canonical, delimited output*/ diff --git a/util/ifirewall.c b/util/ifirewall.c index 25954e5..e3e7626 100644 --- a/util/ifirewall.c +++ b/util/ifirewall.c @@ -64,7 +64,7 @@ /* global variables */ static char * progname = "ifirewall"; -static char * progver = "3.02"; +static char * progver = "3.03"; static char fdebug = 0; static uchar g_bus = PUBLIC_BUS; static uchar g_sa = BMC_SA; diff --git a/util/ifru.c b/util/ifru.c index 9ddfd8b..6c3573c 100644 --- a/util/ifru.c +++ b/util/ifru.c @@ -116,7 +116,7 @@ extern int ipmi_kontronoem_main(void * intf, int argc, char ** argv); #endif static char *progname = "ifru"; -static char *progver = "3.02"; +static char *progver = "3.03"; static int vend_id = 0; static int prod_id = 0; static char fdebug = 0; diff --git a/util/ifruset.c b/util/ifruset.c index b29800d..b62d885 100644 --- a/util/ifruset.c +++ b/util/ifruset.c @@ -106,7 +106,7 @@ extern void fmt_time(time_t etime, char *buf, int bufsz); /*see ievents.c*/ #define IPROD_OEM 7 static char *progname = "ifruset"; -static char *progver = "3.02"; +static char *progver = "3.03"; static char fdebug = 0; static char fpicmg = 0; static char fonlybase = 0; diff --git a/util/igetevent.c b/util/igetevent.c index 49476bd..9f8a2c0 100644 --- a/util/igetevent.c +++ b/util/igetevent.c @@ -169,7 +169,7 @@ extern void free_sdr_cache(uchar *pret); /*see isensor.c*/ * Global variables */ static char * progname = "igetevent"; -static char * progver = "3.02"; +static char * progver = "3.03"; static char fdebug = 0; static char fipmilan = 0; static char frunonce = 0; diff --git a/util/ihealth.c b/util/ihealth.c index 2ff5ba8..be5c57a 100644 --- a/util/ihealth.c +++ b/util/ihealth.c @@ -82,7 +82,7 @@ extern int oem_supermicro_get_firmware_str(char *pstr, int sz); /*oem_supermicro * Global variables */ static char * progname = "ihealth"; -static char * progver = "3.02"; +static char * progver = "3.03"; static char fdebug = 0; static char fipmilan = 0; static char fcanonical = 0; @@ -732,6 +732,7 @@ void show_devid_all(int dtype, uchar *devrec, int sdevrec) break; } do_powerstate = 0; /*HP does not support get_power_state cmd*/ + if (!fipmilan) lan_ch_restrict = 1; /*fw bug, gets 0xcc locally*/ break; case VENDOR_DELL: /*=0x0002A2*/ switch(prod) { /* show product names for some */ @@ -766,6 +767,7 @@ void show_devid_all(int dtype, uchar *devrec, int sdevrec) case 2097: prodstr = "(X10DRL)"; /*0x0831*/ do_powerstate = 0; break; case 2137: prodstr = "(X10DRH)"; break; /*0x0859*/ + case 2203: prodstr = "(X11SSW-F)"; break; /*0x089b*/ case 4520: prodstr = "(H8DGU)"; break; case 43025: prodstr = "(H8DGU-F)"; break; case 43707: prodstr = "(X8DTH)"; break; @@ -784,6 +786,7 @@ void show_devid_all(int dtype, uchar *devrec, int sdevrec) case VENDOR_LENOVO2: if (prod == 0x143) prodstr = "(x3650 M4)"; else prodstr = ""; + do_powerstate = 0; break; case VENDOR_IBM: /*=0x0002*/ switch(prod) { /* show product names for some */ diff --git a/util/ilan.c b/util/ilan.c index 6f4d448..6451ba8 100644 --- a/util/ilan.c +++ b/util/ilan.c @@ -88,7 +88,7 @@ * fix -L with lan_ch_parm. mods to GetBmcEthDevice * 03/18/05 Andy Cress v1.39 fix GetBmcEthDevice for invalid MAC compares * 06/03/05 Andy Cress v1.40 For my MAC in BMC, check user-specified, then - check existing BMC MAC, then check OS MAC. + * check existing BMC MAC, then check OS MAC. * 06/10/05 Andy Cress v1.41 Display multiple Alert Destinations, * handle fSOL20 commands * 07/07/05 Andy Cress v1.42 Fix GetBmcEthDevice for TIGI2U to skip GCM ch 3 @@ -127,13 +127,13 @@ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: a.. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + this list of conditions and the following disclaimer. b.. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. c.. Neither the name of Kontron nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + may be used to endorse or promote products derived from this software + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED @@ -161,7 +161,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <stdlib.h> #include <string.h> #include "getopt.h" -#else +#else /* Linux or similar */ #include <stdio.h> #include <stdlib.h> @@ -177,9 +177,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <getopt.h> #endif #include <string.h> -#include <sys/socket.h> -#include <sys/ioctl.h> -#include <net/if.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <net/if.h> #include <errno.h> #endif #ifdef LINUX @@ -193,32 +193,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #elif defined(BSD) #include <sys/sockio.h> #define SIOCGIFHWADDR SIOCGIFMAC -#define ifr_netmask ifr_ifru.ifru_addr +#define ifr_netmask ifr_ifru.ifru_addr // #define ifr_hwaddr.sa_data ifr_ifru.ifru_addr #elif defined(MACOS) #include <sys/sockio.h> -#define ifr_netmask ifr_ifru.ifru_addr +#define ifr_netmask ifr_ifru.ifru_addr #endif -#include "ipmicmd.h" -#include "oem_intel.h" -#include "oem_supermicro.h" - +#include "ipmicmd.h" +#include "oem_intel.h" +#include "oem_supermicro.h" + #define SELprintf printf -#define RTF_UP 0x0001 /* route usable */ +#define RTF_UP 0x0001 /* route usable */ #define SOL_ENABLE_FLAG 0x01 #define SOL_DISABLE_FLAG 0x00 #define SOL_PRIVILEGE_LEVEL_USER 0x02 #define SOL_PRIVILEGE_LEVEL_OPERATOR 0x03 #define SOL_PRIVILEGE_LEVEL_ADMIN 0x04 -#define SOL_PREFERRED_BAUD_RATE 0x0a /*115.2k*/ +#define SOL_PREFERRED_BAUD_RATE 0x0a /*115.2k */ /* For IPMI 1.5, use Intel SOL commands & subfunctions */ #define SOL_ENABLE_PARAM 0x01 #define SOL_AUTHENTICATION_PARAM 0x02 #define SOL_ACC_INTERVAL_PARAM 0x03 #define SOL_RETRY_PARAM 0x04 -#define SOL_BAUD_RATE_PARAM 0x05 /*non-volatile*/ -#define SOL_VOL_BAUD_RATE_PARAM 0x06 /*volatile*/ +#define SOL_BAUD_RATE_PARAM 0x05 /*non-volatile */ +#define SOL_VOL_BAUD_RATE_PARAM 0x06 /*volatile */ /* For IPMI 2.0, use IPMI SOL commands & subfunctions */ #define SOL_ENABLE_PARAM2 0x08 #define SOL_AUTHENTICATION_PARAM2 0x09 @@ -230,12 +230,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define GET_PAYLOAD_SUPPORT 0x4E /* Channel Access values */ -#define CHAN_ACC_DISABLE 0x20 /* PEF off, disabled*/ -#define CHAN_ACC_PEFON 0x02 /* PEF on, always avail */ -#define CHAN_ACC_PEFOFF 0x22 /* PEF off, always avail*/ +#define CHAN_ACC_DISABLE 0x20 /* PEF off, disabled */ +#define CHAN_ACC_PEFON 0x02 /* PEF on, always avail */ +#define CHAN_ACC_PEFOFF 0x22 /* PEF off, always avail */ /* special channel access values for ia64 */ -#define CHAN_ACC_PEFON64 0x0A /* PEF on, always avail, UserLevelAuth=off */ -#define CHAN_ACC_PEFOFF64 0x2A /* PEF off, always avail, UserLevelAuth=off */ +#define CHAN_ACC_PEFON64 0x0A /* PEF on, always avail, UserLevelAuth=off */ +#define CHAN_ACC_PEFOFF64 0x2A /* PEF off, always avail, UserLevelAuth=off */ #define OS_LINUX 1 #define OS_WINDOWS 2 #define OS_SOLARIS 3 @@ -245,19 +245,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* TSRLT2 Channels: 0=IPMB, 1=Serial/EMP, 6=LAN2, 7=LAN1 */ /* S5000 Channels: 0=IPMB, 1=LAN1, 2=LAN2, 3=RMM2, 4=Serial, 6=pci, 7=sys */ /* For TIGPT1U/mBMC: 1=LAN channel, no serial */ -#define LAN_CH 1 +#define LAN_CH 1 #define SER_CH 4 -#define MAXCHAN 12 /*was 16, reduced for gnu ipmi_lan*/ -#define NUM_DEVICES_TO_CHECK 32 /*for GetBmcEthDevice()*/ -#define MAC_LEN 6 /*length of MAC Address*/ -#define PSW_LEN 16 /* see also PSW_MAX =20 in ipmicmd.h*/ +#define MAXCHAN 12 /*was 16, reduced for gnu ipmi_lan */ +#define NUM_DEVICES_TO_CHECK 32 /*for GetBmcEthDevice() */ +#define MAC_LEN 6 /*length of MAC Address */ +#define PSW_LEN 16 /* see also PSW_MAX =20 in ipmicmd.h */ /* Note: The optional IPMI 2.0 20-byte passwords are not supported here, * due to back-compatibility issues. */ /* IP address source values */ #define SRC_STATIC 0x01 -#define SRC_DHCP 0x02 /* BMC running DHCP */ -#define SRC_BIOS 0x03 /* BIOS, sometimes DHCP */ +#define SRC_DHCP 0x02 /* BMC running DHCP */ +#define SRC_BIOS 0x03 /* BIOS, sometimes DHCP */ #define SRC_OTHER 0x04 /* PEF event severities */ @@ -268,206 +268,209 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PEF_SEV_WARN 0x08 #define PEF_SEV_CRIT 0x10 #define PEF_SEV_NORECOV 0x20 -#define FLAG_INIT 99 /*initial value of char flag, beyond scope*/ +#define FLAG_INIT 99 /*initial value of char flag, beyond scope */ #define PARM_INIT 0xff typedef struct -{ /* See IPMI Table 15-2 */ - uchar rec_id; - uchar fconfig; - uchar action; - uchar policy; - uchar severity; - uchar genid1; - uchar genid2; - uchar sensor_type; - uchar sensor_no; - uchar event_trigger; - uchar data1; - uchar mask1; - uchar res[9]; -} PEF_RECORD; +{ /* See IPMI Table 15-2 */ + uchar rec_id; + uchar fconfig; + uchar action; + uchar policy; + uchar severity; + uchar genid1; + uchar genid2; + uchar sensor_type; + uchar sensor_no; + uchar event_trigger; + uchar data1; + uchar mask1; + uchar res[9]; +} PEF_RECORD; typedef struct -{ /* See IPMI Table 19-3 */ - uchar data[36]; -} LAN_RECORD; /*LanRecord*/ +{ /* See IPMI Table 19-3 */ + uchar data[36]; +} LAN_RECORD; /*LanRecord */ #ifdef METACOMMAND -extern int get_lan_stats(uchar chan); /*see bmchealth.c */ -extern char *get_sensor_type_desc(uchar stype); /*from ievents.c*/ +extern int get_lan_stats (uchar chan); /*see bmchealth.c */ +extern char *get_sensor_type_desc (uchar stype); /*from ievents.c */ #endif #define MYIP 0x01 #define GWYIP 0x02 #define DESTIP 0x04 -#define MAXPEF 41 /* max pefnum offset = 40 (41 entries) */ +#define MAXPEF 41 /* max pefnum offset = 40 (41 entries) */ /* * Global variables */ -static char * progver = "3.02"; -static char * progname = "ilan"; -static char fdebug = 0; -static char fipmilan = 0; -static char fIPMI10 = 0; /* =1 if IPMI v1.0 or less */ -static char fIPMI20 = 0; /* =1 if IPMI v2.0 or greater */ -static char fSOL20 = 1; /* =1 if use Serial-Over-Lan 2.0 w IPMI 2.0 */ -static char fsharedMAC = 0; /* =1 if special shared-MAC BMC LAN port */ -static char fAdjustPefNum = 0; /* =1 adjust pefnum to first empty index */ -static char fUserPefNum = 0; /* =1 if user specified a valid pefnum value*/ -static char freadonly = 1; /* =1 to only read LAN & PEF parameters */ -static char fcanonical = 0; /* =1 to show only canonical output */ -static char flansecure = 0; /* =1 set lan security: no null, cipher0 off*/ -static char bdelim = BCOLON; /* delimiter ':' or '|' if canonical output*/ -static char ftestonly = 0; -static char fprivset = 0; -static char flanstats = 0; /* =1 to show the IPMI LAN statistics */ -static char foptmsg = 0; /* =1 to show the option warning msg */ -static char fshowchan = 0; /* =1 to show the IPMI channels */ -static char nopts = 0; /* number of pefconfig options specified*/ -static int nerrs = 0; /* number of errors during processing */ -static int ngood = 0; /* number of good results */ -static int lasterr = 0; /* value of the last error */ -static char fCustomPEF = 0; /* =1 if -j to input a custom PEF record */ -static char fSetPEFOks = 0; /* =1 if -k to set PEF OK rules */ -static char fdisable = 0; -static char fenable = 0; /* =1 to config BMC LAN and PEF */ -static char fpefenable = 0; /* =1 enable PEF if Alert Dest is specified*/ -static char fdisableSOL = 0; -static char fgetser = 0; -static char fsetifn = 0; /* =1 if user specified ifname[] with -i */ -static char fethfound = 0; /* =1 if FindEthNum successful */ -static char fset_ip = 0; /* !=0 if options used to specify an IP addr*/ -static char fpassword = 0; /* =1 user-specified a password, so set it. */ -static uchar fmBMC = 0; /* =1 mini-BMC, =0 Sahalee BMC */ -static uchar fiBMC = 0; /* =1 Intel iBMC */ -static uchar fRomley = 0; /* =1 Intel Romley BMC */ -static uchar fGrantley = 0; -static uchar fipv6 = 0; /* =1 if BMC supports IPv6 */ -static uchar bmcpefctl = 0; /* existing BMC PEF Control, !0 = enabled */ -static char alertnum = 1; /* alert dest num (usu 1 thru 4) */ -static char alertmax = 9; /* alert dest num max (usu 4, error if >9) */ -static char pefnum = 12; /* 11 pre-defined entries, adding 12th */ -static char pefadd = 0; /* num PEF rules added (usu 2, could be 5 */ -static char pefmax = MAXPEF; /* 20 for Sahalee, 30 for miniBMC */ -static char *myuser = NULL; /* username to set, specified by -u */ -static uchar usernum = 0; /* set non-zero to specify user number */ -static uchar rgmyip[4] = {0,0,0,0}; -static uchar rggwyip[4] = {0,0,0,0}; -static uchar rggwy2ip[4] = {0,0,0,0}; -static uchar rgdestip[4] = {0,0,0,0}; -static uchar rgsubnet[4] = {0,0,0,0}; -static uchar bmcsubnet[4] = {255,255,255,0}; /* default subnet */ -static uchar ossubnet[4] = {0,0,0,0}; -static uchar osmyip[4] = {0,0,0,0}; -static uchar bmcmyip[4] = {0,0,0,0}; -static uchar bmcdestip[4] = {0,0,0,0}; -static uchar bmcdestmac[6]= {0xff,0,0,0,0,0}; -static uchar bmcgwyip[4] = {0,0,0,0}; -static uchar bmcgwymac[6]= {0xff,0,0,0,0,0}; -static uchar bmcmymac[6] = {0xff,0,0,0,0,0}; -static uchar rgmymac[6] = {0xff,0,0,0,0,0}; -static uchar osmymac[6] = {0xff,0,0,0,0,0}; -static uchar rggwymac[6] = {0xff,0,0,0,0,0}; -static uchar rggwy2mac[6] = {0xff,0,0,0,0,0}; -static uchar rgdestmac[6] = {0xff,0,0,0,0,0}; -static uchar rgdhcpmac[6] = {0xff,0,0,0,0,0}; -static int nciphers = 16; -static int ncipher0 = 0; -static uchar rgciphers[16] = {0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; -static char rghostname[32] = {'\0'}; -static uchar custPEF[20]; /* max used = 18 bytes */ -static char rgcommunity[19] = "public"; /* default community */ -static char fsetcommunity = 0; /* =1 if user-specified community */ -static char passwordData[PSW_MAX+1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; -static uchar authmask = 0; /* usu 0x17, mBMC = 0x15 */ -static uchar bAuth = 0x16; /*exclude auth=None for security*/ -static uchar lan_access = 0x04; /* usu 4=Admin, 3=Operator, 2=User */ -static uchar lan_user = 0x02; /* if -u specified, use user 2 for lan */ -static uchar arp_interval = 0x04; /* in 500 ms increments, 0-based */ -static uchar arp_ctl = 0x01; /* 01=grat arp, 02=arp resp, 03=both*/ -static uchar fsetarp = 0; /* 1=user-specified arp_ctl */ +static char *progver = "3.03"; +static char *progname = "ilan"; +static char fdebug = 0; +static char fipmilan = 0; +static char fIPMI10 = 0; /* =1 if IPMI v1.0 or less */ +static char fIPMI20 = 0; /* =1 if IPMI v2.0 or greater */ +static char fSOL20 = 1; /* =1 if use Serial-Over-Lan 2.0 w IPMI 2.0 */ +static char fsharedMAC = 0; /* =1 if special shared-MAC BMC LAN port */ +static char fAdjustPefNum = 0; /* =1 adjust pefnum to first empty index */ +static char fUserPefNum = 0; /* =1 if user specified a valid pefnum value */ +static char freadonly = 1; /* =1 to only read LAN & PEF parameters */ +static char fcanonical = 0; /* =1 to show only canonical output */ +static char flansecure = 0; /* =1 set lan security: no null, cipher0 off */ +static char bdelim = BCOLON; /* delimiter ':' or '|' if canonical output */ +static char ftestonly = 0; +static char fprivset = 0; +static char flanstats = 0; /* =1 to show the IPMI LAN statistics */ +static char foptmsg = 0; /* =1 to show the option warning msg */ +static char fshowchan = 0; /* =1 to show the IPMI channels */ +static char nopts = 0; /* number of pefconfig options specified */ +static int nerrs = 0; /* number of errors during processing */ +static int ngood = 0; /* number of good results */ +static int lasterr = 0; /* value of the last error */ +static char fCustomPEF = 0; /* =1 if -j to input a custom PEF record */ +static char fSetPEFOks = 0; /* =1 if -k to set PEF OK rules */ +static char fdisable = 0; +static char fenable = 0; /* =1 to config BMC LAN and PEF */ +static char fpefenable = 0; /* =1 enable PEF if Alert Dest is specified */ +static char fdisableSOL = 0; +static char fgetser = 0; +static char fsetifn = 0; /* =1 if user specified ifname[] with -i */ +static char fethfound = 0; /* =1 if FindEthNum successful */ +static char fset_ip = 0; /* !=0 if options used to specify an IP addr */ +static char fpassword = 0; /* =1 user-specified a password, so set it. */ +static uchar fmBMC = 0; /* =1 mini-BMC, =0 Sahalee BMC */ +static uchar fiBMC = 0; /* =1 Intel iBMC */ +static uchar fRomley = 0; /* =1 Intel Romley BMC */ +static uchar fGrantley = 0; +static uchar fipv6 = 0; /* =1 if BMC supports IPv6 */ +static uchar bmcpefctl = 0; /* existing BMC PEF Control, !0 = enabled */ +static char alertnum = 1; /* alert dest num (usu 1 thru 4) */ +static char alertmax = 9; /* alert dest num max (usu 4, error if >9) */ +static char pefnum = 12; /* 11 pre-defined entries, adding 12th */ +static char pefadd = 0; /* num PEF rules added (usu 2, could be 5 */ +static char pefmax = MAXPEF; /* 20 for Sahalee, 30 for miniBMC */ +static char *myuser = NULL; /* username to set, specified by -u */ +static uchar usernum = 0; /* set non-zero to specify user number */ +static uchar rgmyip[4] = { 0, 0, 0, 0 }; +static uchar rggwyip[4] = { 0, 0, 0, 0 }; +static uchar rggwy2ip[4] = { 0, 0, 0, 0 }; +static uchar rgdestip[4] = { 0, 0, 0, 0 }; +static uchar rgsubnet[4] = { 0, 0, 0, 0 }; +static uchar bmcsubnet[4] = { 255, 255, 255, 0 }; /* default subnet */ +static uchar ossubnet[4] = { 0, 0, 0, 0 }; +static uchar osmyip[4] = { 0, 0, 0, 0 }; +static uchar bmcmyip[4] = { 0, 0, 0, 0 }; +static uchar bmcdestip[4] = { 0, 0, 0, 0 }; +static uchar bmcdestmac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static uchar bmcgwyip[4] = { 0, 0, 0, 0 }; +static uchar bmcgwymac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static uchar bmcmymac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static uchar rgmymac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static uchar osmymac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static uchar rggwymac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static uchar rggwy2mac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static uchar rgdestmac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static uchar rgdhcpmac[6] = { 0xff, 0, 0, 0, 0, 0 }; +static int nciphers = 16; +static int ncipher0 = 0; +static uchar rgciphers[16] = + { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static char rghostname[32] = { '\0' }; +static uchar custPEF[20]; /* max used = 18 bytes */ +static char rgcommunity[19] = "public"; /* default community */ +static char fsetcommunity = 0; /* =1 if user-specified community */ +static char passwordData[PSW_MAX + 1] = + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static uchar authmask = 0; /* usu 0x17, mBMC = 0x15 */ +static uchar bAuth = 0x16; /*exclude auth=None for security */ +static uchar arp_interval = 0x04; /* in 500 ms increments, 0-based */ +static uchar arp_ctl = 0x01; /* 01=grat arp, 02=arp resp, 03=both */ +static uchar fsetarp = 0; /* 1=user-specified arp_ctl */ #ifdef WIN32 -static uchar ostype = OS_WINDOWS; /*windows*/ -static char ifname[64] = "Local Area Connection "; /* interface name */ -static char ifpattn[25] = "Local Area Connection "; +static uchar ostype = OS_WINDOWS; /*windows */ +static char ifname[64] = "Local Area Connection "; /* interface name */ +static char ifpattn[25] = "Local Area Connection "; #elif SOLARIS /* for i86pc use "e1000g0", but for sun4u(sparc) this might be "eri0" */ -static uchar ostype = OS_SOLARIS; +static uchar ostype = OS_SOLARIS; #ifdef __SPARC__ -static char ifname[16] = "eri0"; /* SPARC interface name */ -static char ifname0[16] = "eri0"; -static char ifpattn[14] = "eri"; +static char ifname[16] = "eri0"; /* SPARC interface name */ +static char ifname0[16] = "eri0"; +static char ifpattn[14] = "eri"; #else -static char ifname[16] = "e1000g0"; /* Solaris x86 interface name */ -static char ifname0[16] = "e1000g0"; -static char ifpattn[14] = "e1000g"; +static char ifname[16] = "e1000g0"; /* Solaris x86 interface name */ +static char ifname0[16] = "e1000g0"; +static char ifpattn[14] = "e1000g"; #endif #elif defined(BSD) -static uchar ostype = OS_BSD; -static char ifname[16] = "em0"; /* interface name */ -static char ifname0[16] = "em0"; -static char ifpattn[14] = "em"; +static uchar ostype = OS_BSD; +static char ifname[16] = "em0"; /* interface name */ +static char ifname0[16] = "em0"; +static char ifpattn[14] = "em"; #elif defined(HPUX) -static uchar ostype = OS_HPUX; -static char ifname[16] = "lan0"; /* interface name */ -static char ifname0[16] = "lan0"; -static char ifpattn[14] = "lan"; +static uchar ostype = OS_HPUX; +static char ifname[16] = "lan0"; /* interface name */ +static char ifname0[16] = "lan0"; +static char ifpattn[14] = "lan"; #else -static uchar ostype = OS_LINUX; -static char ifname[16] = "eth0"; /* interface name */ -static char ifname0[16] = "eth0"; -static char ifpattn[14] = "eth"; +static uchar ostype = OS_LINUX; +static char ifname[16] = "eth0"; /* interface name */ +static char ifname0[16] = "eth0"; +static char ifpattn[14] = "eth"; #endif -static char *pspace1 = "\t"; /*used for fcanonical output*/ -static char *pspace2 = "\t\t"; -static char *pspace3 = "\t\t\t"; -static char *pspace4 = "\t\t\t\t"; -static int vend_id; -static int prod_id; -static int lan_dhcp = 0; /*=1 if using DHCP for bmc lan channel*/ -static uchar ser_ch = SER_CH; -static uchar lan_ch = LAN_CH; -static uchar lan_ch_parm = PARM_INIT; -static uchar gcm_ch = PARM_INIT; -static uchar vlan_enable = PARM_INIT; -static uchar failover_enable = PARM_INIT; -static uchar vlan_prio = 0; /*default = 0*/ -static ushort vlan_id = 0; /*max 12 bits used*/ -static uchar max_users = 5; /* set in GetUser(1); */ -static uchar enabled_users = 0; /* set in GetUser(1); */ -static uchar show_users = 5; /* default, adjusted based on DeviceID */ -static uchar fnewbaud = 0; /* =1 if user specified baud */ -static uchar sol_baud = SOL_PREFERRED_BAUD_RATE; /*115.2k default*/ -static uchar sol_accum[2] = { 0x04, 0x32 }; -static uchar sol_retry[2] = { 0x06, 0x14 }; -static uchar sol_bvalid = 0; /* =1 if SOL baud is valid */ -static uchar chan_pefon = CHAN_ACC_PEFON; -static uchar chan_pefoff = CHAN_ACC_PEFOFF; -static uchar SessInfo[18]; /* Session Info data */ +static char *pspace1 = "\t"; /*used for fcanonical output */ +static char *pspace2 = "\t\t"; +static char *pspace3 = "\t\t\t"; +static char *pspace4 = "\t\t\t\t"; +static int vend_id; +static int prod_id; +static int lan_dhcp = 0; /*=1 if using DHCP for bmc lan channel*/ +static uchar ser_ch = SER_CH; +static uchar gcm_ch = PARM_INIT; +static uchar failover_enable = PARM_INIT; +static uchar vlan_enable = PARM_INIT; +static uchar vlan_prio = 0; /*default = 0 */ +static ushort vlan_id = 0; /*max 12 bits used */ +static uchar lan_access = 0x04; /* -v usu 4=Admin, 3=Operator, 2=User */ +static uchar lan_user = 0x02; /* -u if specified, default to user 2 */ +static uchar lan_ch_parm = PARM_INIT; /* -L to set, unused if PARM_INIT */ +static uchar lan_ch = LAN_CH; /* default=LAN_CH=1 */ +static uchar max_users = 5; /* set in GetUser(1); */ +static uchar enabled_users = 0; /* set in GetUser(1); */ +static uchar show_users = 5; /* default, adjusted based on DeviceID */ +static uchar fnewbaud = 0; /* =1 if user specified baud */ +static uchar sol_baud = SOL_PREFERRED_BAUD_RATE; /*115.2k default */ +static uchar sol_accum[2] = { 0x04, 0x32 }; +static uchar sol_retry[2] = { 0x06, 0x14 }; +static uchar sol_bvalid = 0; /* =1 if SOL baud is valid */ +static uchar chan_pefon = CHAN_ACC_PEFON; +static uchar chan_pefoff = CHAN_ACC_PEFOFF; +static uchar SessInfo[18]; /* Session Info data */ // static uchar bparm7[3] = {0x00, 0x00, 0x00}; /*ipv4 header before*/ -static uchar iparm7[3] = {0x1E, 0x00, 0x00}; /*intel ipv4 TTL,Flags,Service*/ -static uchar oparm7[3] = {0x40, 0x40, 0x10}; /*other ipv4 TTL,Flags,Service*/ +static uchar iparm7[3] = { 0x1E, 0x00, 0x00 }; /*intel ipv4 TTL,Flags,Service */ +static uchar oparm7[3] = { 0x40, 0x40, 0x10 }; /*other ipv4 TTL,Flags,Service */ static uchar *parm7 = &oparm7[0]; #define MAX_PEFPARAMS 14 /* max pef params = 14 */ -uchar peflen[MAX_PEFPARAMS] = {0,1,1,1,1,1,21,2,1,4,17,1,3,18}; /*for ShowPef*/ -uchar pef_array[MAXPEF][21]; /* array of all PEF entries read, */ - /* sizeof(PEF_RECORD) = 21 */ -uchar pef_defaults[11][21] = { /* array of first 11 default PEF entries */ -{0x01,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x01,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Temp*/ -{0x02,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x02,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Volt*/ -{0x03,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x04,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Fan*/ -{0x04,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x05,0x05,0x03,0x01,0x00,0,0,0,0,0,0,0,0,0}, /*Chass*/ -{0x05,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x08,0xff,0x6f,0x06,0x00,0,0,0,0,0,0,0,0,0}, /*PS*/ -{0x06,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x0c,0x08,0x6f,0x02,0x00,0,0,0,0,0,0,0,0,0}, /*ECC*/ -{0x07,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x0f,0x06,0x6f,0x01,0x00,0,0,0,0,0,0,0,0,0}, /*FRB*/ -{0x08,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x07,0xff,0x6f,0x1c,0x00,0,0,0,0,0,0,0,0,0}, /*POST*/ -{0x09,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x13,0xff,0x6f,0x3e,0x03,0,0,0,0,0,0,0,0,0}, /*NMI*/ -{0x0a,0x80,1,1,PEF_SEV_INFO,0xff,0xff,0x23,0x03,0x6f,0x0e,0x00,0,0,0,0,0,0,0,0,0}, /*WDT*/ -{0x0b,0x80,1,1,PEF_SEV_MON,0xff,0xff,0x12,0xff,0x6f,0x02,0x00,0,0,0,0,0,0,0,0,0} };/*Restart*/ +uchar peflen[MAX_PEFPARAMS] = { 0, 1, 1, 1, 1, 1, 21, 2, 1, 4, 17, 1, 3, 18 }; /*for ShowPef */ +uchar pef_array[MAXPEF][21]; /* array of all PEF entries read, */ + /* sizeof(PEF_RECORD) = 21 */ +uchar pef_defaults[11][21] = { /* array of first 11 default PEF entries */ + {0x01, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x01, 0xff, 0x01, 0x95, 0x0a, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*Temp */ + {0x02, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x02, 0xff, 0x01, 0x95, 0x0a, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*Volt */ + {0x03, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x04, 0xff, 0x01, 0x95, 0x0a, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*Fan */ + {0x04, 0x80, 1, 1, PEF_SEV_WARN, 0xff, 0xff, 0x05, 0x05, 0x03, 0x01, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*Chass */ + {0x05, 0x80, 1, 1, PEF_SEV_WARN, 0xff, 0xff, 0x08, 0xff, 0x6f, 0x06, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*PS*/ + {0x06, 0x80, 1, 1, PEF_SEV_WARN, 0xff, 0xff, 0x0c, 0x08, 0x6f, 0x02, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*ECC*/ + {0x07, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x0f, 0x06, 0x6f, 0x01, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*FRB*/ + {0x08, 0x80, 1, 1, PEF_SEV_WARN, 0xff, 0xff, 0x07, 0xff, 0x6f, 0x1c, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*POST*/ + {0x09, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x13, 0xff, 0x6f, 0x3e, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*NMI*/ + {0x0a, 0x80, 1, 1, PEF_SEV_INFO, 0xff, 0xff, 0x23, 0x03, 0x6f, 0x0e, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*WDT*/ + {0x0b, 0x80, 1, 1, PEF_SEV_MON, 0xff, 0xff, 0x12, 0xff, 0x6f, 0x02, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0} /*Restart */ +}; char **pefdesc; -char *pefdesc1[MAXPEF] = { /* for Sahalee BMC */ +char *pefdesc1[MAXPEF] = { /* for Sahalee BMC */ /* 0 0x00 */ "", /* 1 0x01 */ "Temperature Sensor", /* 2 0x02 */ "Voltage Sensor", @@ -498,12 +501,14 @@ char *pefdesc1[MAXPEF] = { /* for Sahalee BMC */ /*27 */ "reserved", /*28 */ "reserved", /*29 */ "unused", -/*30 */ "unused" }; +/*30 */ "unused" +}; -char *pefdesc2[MAXPEF] = { /* for NSC miniBMC */ +char *pefdesc2[MAXPEF] = { /* for NSC miniBMC */ /* 0 */ "", /* 1 0x02*/ "Voltage Sensor Assert", -/* 2 0x23*/ "Watchdog FRB Timeout", /* was "Proc FRB Thermal", */ + /* 2 0x23*/ "Watchdog FRB Timeout", + /* was "Proc FRB Thermal", */ /* 3 0x02*/ "Voltage Sensor Deassert", /* 4 0x07*/ "Proc1 IERR", /* 5 0xff*/ "Digital Sensor OK", @@ -531,1143 +536,1308 @@ char *pefdesc2[MAXPEF] = { /* for NSC miniBMC */ /*27 0x0f*/ "POST Code Error", /*28 0x02*/ "Voltage Failure", /*29 0x04*/ "Fan Failure", -/*30 0x01*/ "Temperature Failure"}; +/*30 0x01*/ "Temperature Failure" +}; #define NLAN 39 -char canon_param[NLAN] = { 0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,0,1, - 0,0,0,0,0,0,1,1,1,1}; +char canon_param[NLAN] = { 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 }; struct { int cmd; int sz; char desc[28]; -} lanparams[NLAN] = { /* see IPMI Table 19-4 */ - /* 0 */ { 0, 1, "Set in progress"}, - /* 1 */ { 1, 1, "Auth type support"}, - /* 2 */ { 2, 5, "Auth type enables"}, - /* 3 */ { 3, 4, "IP address"}, - /* 4 */ { 4, 1, "IP addr src"}, /* (DHCP/Static) */ - /* 5 */ { 5, 6, "MAC addr"}, - /* 6 */ { 6, 4, "Subnet mask"}, - /* 7 */ { 7, 3, "IPv4 header"}, - /* 8 */ { 8, 2, "Prim RMCP port"}, - /* 9 */ { 9, 2, "Sec RMCP port"}, - /* 10 */ {10, 1, "BMC grat ARP"}, - /* 11 */ {11, 1, "grat ARP interval"}, - /* 12 */ {12, 4, "Def gateway IP"}, - /* 13 */ {13, 6, "Def gateway MAC"}, - /* 14 */ {14, 4, "Sec gateway IP"}, - /* 15 */ {15, 6, "Sec gateway MAC"}, - /* 16 */ {16,18, "Community string"}, - /* 17 */ {17, 1, "Num dest"}, - /* 18 */ {18, 5, "Dest type"}, - /* 19 */ {19, 13, "Dest address"}, - /* 20 */ {20, 2, "VLAN ID"}, - /* 21 */ {21, 1, "VLAN Priority"}, - /* 22 */ {22, 1, "Cipher Suite Support"}, - /* 23 */ {23,17, "Cipher Suites "}, - /* 24 */ {24, 9, "Cipher Suite Priv"}, - /* 25 */ {25, 4, "VLAN Dest Tag"}, - /* 26 */ {96, 28, "OEM Alert String"}, - /* 27 */ {97, 1, "Alert Retry Algorithm"}, - /* 28 */ {98, 3, "UTC Offset"}, - /* 29 */ {102, 1, "IPv6 Enable"}, - /* 30 */ {103, 1, "IPv6 Addr Source"}, - /* 31 */ {104,16, "IPv6 Address"}, - /* 32 */ {105, 1, "IPv6 Prefix Len"}, - /* 33 */ {106,16, "IPv6 Default Gateway"}, - /* 34 */ {108,17, "IPv6 Dest address"}, - /* 35 */ {192, 4, "DHCP Server IP"}, - /* 36 */ {193, 6, "DHCP MAC Address"}, - /* 37 */ {194, 1, "DHCP Enable"}, - /* 38 */ {201, 2, "Channel Access Mode(Lan)"} +} lanparams[NLAN] = { /* see IPMI Table 19-4 */ + /* 0 */ { 0, 1, "Set in progress"}, + /* 1 */ { 1, 1, "Auth type support"}, + /* 2 */ { 2, 5, "Auth type enables"}, + /* 3 */ { 3, 4, "IP address"}, + /* 4 */ { 4, 1, "IP addr src"}, /* (DHCP/Static) */ + /* 5 */ { 5, 6, "MAC addr"}, + /* 6 */ { 6, 4, "Subnet mask"}, + /* 7 */ { 7, 3, "IPv4 header"}, + /* 8 */ { 8, 2, "Prim RMCP port"}, + /* 9 */ { 9, 2, "Sec RMCP port"}, + /* 10 */ { 10, 1, "BMC grat ARP"}, + /* 11 */ { 11, 1, "grat ARP interval"}, + /* 12 */ { 12, 4, "Def gateway IP"}, + /* 13 */ { 13, 6, "Def gateway MAC"}, + /* 14 */ { 14, 4, "Sec gateway IP"}, + /* 15 */ { 15, 6, "Sec gateway MAC"}, + /* 16 */ { 16, 18, "Community string"}, + /* 17 */ { 17, 1, "Num dest"}, + /* 18 */ { 18, 5, "Dest type"}, + /* 19 */ { 19, 13, "Dest address"}, + /* 20 */ { 20, 2, "VLAN ID"}, + /* 21 */ { 21, 1, "VLAN Priority"}, + /* 22 */ { 22, 1, "Cipher Suite Support"}, + /* 23 */ { 23, 17, "Cipher Suites "}, + /* 24 */ { 24, 9, "Cipher Suite Priv"}, + /* 25 */ { 25, 4, "VLAN Dest Tag"}, + /* 26 */ { 96, 28, "OEM Alert String"}, + /* 27 */ { 97, 1, "Alert Retry Algorithm"}, + /* 28 */ { 98, 3, "UTC Offset"}, + /* 29 */ { 102, 1, "IPv6 Enable"}, + /* 30 */ { 103, 1, "IPv6 Addr Source"}, + /* 31 */ { 104, 16, "IPv6 Address"}, + /* 32 */ { 105, 1, "IPv6 Prefix Len"}, + /* 33 */ { 106, 16, "IPv6 Default Gateway"}, + /* 34 */ { 108, 17, "IPv6 Dest address"}, + /* 35 */ { 192, 4, "DHCP Server IP"}, + /* 36 */ { 193, 6, "DHCP MAC Address"}, + /* 37 */ { 194, 1, "DHCP Enable"}, + /* 38 */ { 201, 2, "Channel Access Mode(Lan)"} }; -#define NSER 22 /* max=32 */ +#define NSER 22 /* max=32 */ struct { int cmd; int sz; char desc[28]; -} serparams[NSER] = { /* see IPMI Table 20-4 */ - /* 0 */ { 0, 1, "Set in progress"}, - /* 1 */ { 1, 1, "Auth type support"}, - /* 2 */ { 2, 5, "Auth type enables"}, - /* 3 */ { 3, 1, "Connection Mode"}, - /* 4 */ { 4, 1, "Sess Inactiv Timeout"}, - /* 5 */ { 5, 5, "Channel Callback"}, - /* 6 */ { 6, 1, "Session Termination"}, - /* 7 */ { 7, 2, "IPMI Msg Comm"}, - /* 8 */ { 8, 2, "Mux Switch"}, - /* 9 */ { 9, 2, "Modem Ring Time"}, - /* 10 */ {10,17, "Modem Init String"}, - /* 11 */ {11, 5, "Modem Escape Seq"}, - /* 12 */ {12, 8, "Modem Hangup Seq"}, - /* 13 */ {13, 8, "Modem Dial Command"}, - /* 14 */ {14, 1, "Page Blackout Interval"}, - /* 15 */ {15,18, "Community String"}, - /* 16 */ {16, 1, "Num of Alert Dest"}, - /* 17 */ {17, 5, "Destination Info"}, - /* 18 */ {18, 1, "Call Retry Interval"}, - /* 19 */ {19, 3, "Destination Comm Settings"}, - /* 20 */ {29, 2, "Terminal Mode Config"}, - /* 21 */ {201, 2,"Channel Access Mode (Ser)"} +} serparams[NSER] = { /* see IPMI Table 20-4 */ + /* 0 */ { 0, 1, "Set in progress"}, + /* 1 */ { 1, 1, "Auth type support"}, + /* 2 */ { 2, 5, "Auth type enables"}, + /* 3 */ { 3, 1, "Connection Mode"}, + /* 4 */ { 4, 1, "Sess Inactiv Timeout"}, + /* 5 */ { 5, 5, "Channel Callback"}, + /* 6 */ { 6, 1, "Session Termination"}, + /* 7 */ { 7, 2, "IPMI Msg Comm"}, + /* 8 */ { 8, 2, "Mux Switch"}, + /* 9 */ { 9, 2, "Modem Ring Time"}, + /* 10 */ { 10, 17, "Modem Init String"}, + /* 11 */ { 11, 5, "Modem Escape Seq"}, + /* 12 */ { 12, 8, "Modem Hangup Seq"}, + /* 13 */ { 13, 8, "Modem Dial Command"}, + /* 14 */ { 14, 1, "Page Blackout Interval"}, + /* 15 */ { 15, 18, "Community String"}, + /* 16 */ { 16, 1, "Num of Alert Dest"}, + /* 17 */ { 17, 5, "Destination Info"}, + /* 18 */ { 18, 1, "Call Retry Interval"}, + /* 19 */ { 19, 3, "Destination Comm Settings"}, + /* 20 */ { 29, 2, "Terminal Mode Config"}, + /* 21 */ { 201, 2, "Channel Access Mode (Ser)"} }; -static void getauthstr(uchar auth, char *s) +static void +getauthstr (uchar auth, char *s) { - if (s == NULL) return; - s[0] = 0; - if (auth & 0x01) strcat(s,"None "); - if (auth & 0x02) strcat(s,"MD2 "); - if (auth & 0x04) strcat(s,"MD5 "); - if (auth & 0x10) strcat(s,"Pswd "); - if (auth & 0x20) strcat(s,"OEM "); - return; + if (s == NULL) + return; + s[0] = 0; + if (auth & 0x01) + strcat (s, "None "); + if (auth & 0x02) + strcat (s, "MD2 "); + if (auth & 0x04) + strcat (s, "MD5 "); + if (auth & 0x10) + strcat (s, "Pswd "); + if (auth & 0x20) + strcat (s, "OEM "); + return; } -static int GetDeviceID(LAN_RECORD *pLanRecord) -{ /*See also ipmi_getdeviceid( pLanRecord, sizeof(LAN_RECORD),fdebug); */ - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - int status; - uchar inputData[24]; - uchar completionCode; - - if (pLanRecord == NULL) return(-1); - - status = ipmi_cmd(GET_DEVICE_ID, inputData, 0, responseData, - &responseLength, &completionCode, fdebug); - - if (status == ACCESS_OK) { - if( completionCode ) { - SELprintf("GetDeviceID: completion code=%x\n", - completionCode); - status = completionCode; - } else { - memcpy(pLanRecord,&responseData[0],responseLength); - set_mfgid(&responseData[0],responseLength); - return(0); // successful, done - } - } /* endif */ - /* if get here, error */ - return(status); -} /*end GetDeviceID() */ +static int +GetDeviceID (LAN_RECORD * pLanRecord) +{ /*See also ipmi_getdeviceid( pLanRecord, sizeof(LAN_RECORD),fdebug); */ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar inputData[24]; + uchar completionCode; + + if (pLanRecord == NULL) + return (-1); + + status = ipmi_cmd (GET_DEVICE_ID, inputData, 0, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if (completionCode) { + SELprintf ("GetDeviceID: completion code=%x\n", completionCode); + status = completionCode; + } + else { + memcpy (pLanRecord, &responseData[0], responseLength); + set_mfgid (&responseData[0], responseLength); + return (0); // successful, done + } + } /* endif */ + /* if get here, error */ + return (status); +} /*end GetDeviceID() */ -static int GetChanAcc(uchar chan, uchar parm, LAN_RECORD *pLanRecord) +static int +GetChanAcc (uchar chan, uchar parm, LAN_RECORD * pLanRecord) { - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - int status; - uchar inputData[24]; - uchar completionCode; - - if (pLanRecord == NULL) return(-1); - responseLength = 3; - inputData[0] = chan; - inputData[1] = parm; /* 0x80 = active, 0x40 = non-volatile */ - responseLength = sizeof(responseData); - status = ipmi_cmd(GET_CHANNEL_ACC, inputData, 2, responseData, - &responseLength, &completionCode, fdebug); - - if (status == ACCESS_OK) { - if( completionCode ) { - SELprintf("GetChanAcc: completion code=%x\n", - completionCode); - status = completionCode; - } else { - // dont copy first byte (Parameter revision, usu 0x11) - memcpy(pLanRecord,&responseData[0],responseLength); - return(0); // successful, done - } - } /* endif */ - /* if get here, error */ - return(status); -} /*GetChanAcc()*/ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar inputData[24]; + uchar completionCode; + + if (pLanRecord == NULL) + return (-1); + responseLength = 3; + inputData[0] = chan; + inputData[1] = parm; /* 0x80 = active, 0x40 = non-volatile */ + responseLength = sizeof (responseData); + status = ipmi_cmd (GET_CHANNEL_ACC, inputData, 2, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if (completionCode) { + SELprintf ("GetChanAcc: completion code=%x\n", completionCode); + status = completionCode; + } + else { + // dont copy first byte (Parameter revision, usu 0x11) + memcpy (pLanRecord, &responseData[0], responseLength); + return (0); // successful, done + } + } /* endif */ + /* if get here, error */ + return (status); +} /*GetChanAcc() */ -static int SetChanAcc(uchar chan, uchar parm, uchar val) +static int +SetChanAcc (uchar chan, uchar parm, uchar val) { - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - int status; - uchar inputData[24]; - uchar completionCode; - - if (fmBMC) return(0); /* mBMC doesn't support this */ - /* parm: 0x80 = active, 0x40 = set non-vol*/ - responseLength = 1; - inputData[0] = chan; /* channel */ - inputData[1] = (parm & 0xc0) | (val & 0x3F); - inputData[2] = (parm & 0xc0) | lan_access; /* set priv level to Admin */ - - responseLength = sizeof(responseData); - status = ipmi_cmd(SET_CHANNEL_ACC, inputData, 3, responseData, - &responseLength, &completionCode, fdebug); - - if (status == ACCESS_OK) { - if( completionCode ) { - SELprintf("SetChanAcc: completion code=%x\n", - completionCode); - status = completionCode; - } else { - return(0); // successful, done - } - } /* endif */ - /* if get here, error */ - return(status); -} /*SetChanAcc()*/ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar inputData[24]; + uchar completionCode; + + if (fmBMC) + return (0); /* mBMC doesn't support this */ + /* parm: 0x80 = active, 0x40 = set non-vol */ + responseLength = 1; + inputData[0] = chan; /* channel */ + inputData[1] = (parm & 0xc0) | (val & 0x3F); + inputData[2] = (parm & 0xc0) | lan_access; /* set priv level to Admin */ + + responseLength = sizeof (responseData); + status = ipmi_cmd (SET_CHANNEL_ACC, inputData, 3, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if (completionCode) { + SELprintf ("SetChanAcc: completion code=%x\n", completionCode); + status = completionCode; + } + else { + return (0); // successful, done + } + } /* endif */ + /* if get here, error */ + return (status); +} /*SetChanAcc() */ int -SetPasswd(int unum, char *uname, char *upswd) +SetPasswd (int unum, char *uname, char *upswd, uchar chan, uchar priv) { - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - int status, i, psw_len; - uchar completionCode; - uchar inputData[24]; - int ret = 0; - - inputData[0] = (uchar)unum; /*user 1 = null user */ - responseLength = sizeof(responseData); - status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData, - &responseLength, &completionCode, fdebug); - SELprintf("GET_USERNAME: %x %x %x, status = %x, ccode=%x\n", - responseData[0],responseData[1],responseData[2], - status,completionCode); - if (fdebug) { - char aname[17]; - printf("User %d: ",unum); - for (i = 0; i < responseLength; i++) { - printf("%02x ",responseData[i]); - if (responseData[i] < 0x20) aname[i] = '.'; - else aname[i] = responseData[i]; - } - aname[16] = 0; - printf(" %s\n",aname); - } - - if (unum != 1) - { /* user specified a lan username */ - if (fiBMC && (unum == 2)) { - /* cannot set user 2 name */ - if (uname != NULL) { - if (strcmp(uname,"root") != 0) - printf("SETUSERNAME - user2 name %s must be root\n",uname); - } - } else if (unum == 2 && (vend_id == VENDOR_SUPERMICROX || - vend_id == VENDOR_SUPERMICRO) ) { - /* cannot set user 2 name */ - if (uname != NULL) { - if (strcmp(uname,"ADMIN") != 0) - printf("SETUSERNAME - user2 name %s must be ADMIN\n",uname); - } - } else { - inputData[0] = (uchar)unum; - memset(&inputData[1],0,16); - if (uname != NULL) - memcpy(&inputData[1],uname,strlen(uname)); - status = ipmi_cmd(SET_USER_NAME, inputData, 17, responseData, - &responseLength, &completionCode, fdebug); - if (completionCode == 0xCC) - status = 0; /*setting username to previous gives 0xCC, ok*/ - else { - SELprintf("SETUSERNAME - %x %x %x status = %x, ccode=%x\n", - inputData[0],inputData[1],inputData[2], - status,completionCode); - if (status == 0) status = completionCode; - if (status != 0) ret = status; - } - } - } - - if ((unum != 1) && (uname == NULL)) { - ; /* if no username, do not enable user */ - } else { - inputData[0] = (uchar)unum; - inputData[1] = 0x01; /*enable user*/ - responseLength = sizeof(responseData); - status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2, responseData, - &responseLength, &completionCode, fdebug); - printf("SETUSERENAB - inputData %x %x %x, status = %x, ccode=%x\n", - inputData[0],inputData[1],inputData[2], - status,completionCode); - if (status == 0) status = completionCode; - if (status != 0) ret = status; - } - - inputData[0] = (uchar)unum; - inputData[1] = 0x02; /*set password*/ - psw_len = PSW_LEN; /*=16 change if 20-byte passwords supported */ - memset(&inputData[2],0,psw_len); - if (upswd != NULL) - strcpy((char *)&inputData[2],upswd); - if (fdebug) { - char apsw[PSW_MAX+1]; - char c; - printf("Pswd %d: ",unum); - for (i = 0; i < psw_len; i++) { - c = inputData[i+2]; - printf("%02x ",(unsigned char)c); - if (c < 0x20) apsw[i] = '.'; - else apsw[i] = c; - } - apsw[psw_len] = 0; - printf(" %s\n",apsw); - } - responseLength = sizeof(responseData); - status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2+psw_len, - responseData,&responseLength, &completionCode,fdebug); - SELprintf("SETUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n", - inputData[0],inputData[1],inputData[2], - status,completionCode); - if (status == 0) status = completionCode; - if (status != 0) ret = status; - - inputData[0] = (uchar)unum; /*user 1 = null user */ - inputData[1] = 0x03; /*test password*/ - memset(&inputData[2],0,psw_len); - if (upswd != NULL) - strcpy((char *)&inputData[2],upswd); - responseLength = sizeof(responseData); - status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2+psw_len, - responseData,&responseLength, &completionCode,fdebug); - SELprintf("TESTUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n", - inputData[0],inputData[1],inputData[2], - status,completionCode); - - if (fiBMC && (unum == 2)) { /*iBMC doesn't support this on user 2*/ - if (fdebug) - printf("skipping SETUSER_ACCESS on iBMC for user %d\n",unum); - } else { - inputData[0] = 0x90 | lan_ch; /* = 0x97 */ - inputData[1] = (uchar)unum; /* user num */ - inputData[2] = lan_access; /* usu admin */ - inputData[3] = 0x00; /* User Session Limit, 0=not limited*/ - responseLength = sizeof(responseData); - status = ipmi_cmd(SET_USER_ACCESS, inputData, 4, responseData, - &responseLength, &completionCode, fdebug); - printf("SETUSER_ACCESS - inputData %x %x %x, status = %x ccode=%x\n", - (uchar)inputData[0],inputData[1],inputData[2], - status,completionCode); - if (status == 0) status = completionCode; - if (status != 0) ret = status; - } - - return(ret); -} /*end SetPswd()*/ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status, i, psw_len; + uchar completionCode; + uchar inputData[24]; + int ret = 0; + + inputData[0] = (uchar) unum; /*user 1 = null user */ + responseLength = sizeof (responseData); + status = ipmi_cmd (GET_USER_NAME, inputData, 1, responseData, + &responseLength, &completionCode, fdebug); + SELprintf ("GET_USERNAME: %x %x %x, status = %x, ccode=%x\n", + responseData[0], responseData[1], responseData[2], + status, completionCode); + if (fdebug) { + char aname[17]; + printf ("User %d: ", unum); + for (i = 0; i < responseLength; i++) { + printf ("%02x ", responseData[i]); + if (responseData[i] < 0x20) + aname[i] = '.'; + else + aname[i] = responseData[i]; + } + aname[16] = 0; + printf (" %s\n", aname); + } + + if (unum != 1) { /* user specified a lan username */ + if (fiBMC && (unum == 2)) { + /* cannot set user 2 name */ + if (uname != NULL) { + if (strcmp (uname, "root") != 0) + printf ("SETUSERNAME - user2 name %s must be root\n", uname); + } + } + else if (unum == 2 && (vend_id == VENDOR_SUPERMICROX || + vend_id == VENDOR_SUPERMICRO)) { + /* cannot set user 2 name */ + if (uname != NULL) { + if (strcmp (uname, "ADMIN") != 0) + printf ("SETUSERNAME - user2 name %s must be ADMIN\n", uname); + } + } + else if (uname != NULL) { + inputData[0] = (uchar) unum; + memset (&inputData[1], 0, 16); + memcpy (&inputData[1], uname, strlen (uname)); + status = ipmi_cmd (SET_USER_NAME, inputData, 17, responseData, + &responseLength, &completionCode, fdebug); + if (completionCode == 0xCC) + status = 0; /*setting username to previous gives 0xCC, ok */ + else { + SELprintf ("SETUSERNAME - %x %x %x status = %x, ccode=%x\n", + inputData[0], inputData[1], inputData[2], + status, completionCode); + if (status == 0) + status = completionCode; + if (status != 0) + ret = status; + } + } + } + + if ((unum != 1) && (uname == NULL)) { + ; /* if no username, do not enable user */ + } + else { + inputData[0] = (uchar) unum; + inputData[1] = 0x01; /*enable user */ + responseLength = sizeof (responseData); + status = ipmi_cmd (SET_USER_PASSWORD, inputData, 2, responseData, + &responseLength, &completionCode, fdebug); + printf ("SETUSERENAB - inputData %x %x %x, status = %x, ccode=%x\n", + inputData[0], inputData[1], inputData[2], status, completionCode); + if (status == 0) + status = completionCode; + if (status != 0) + ret = status; + } + + if (upswd != NULL) { + inputData[0] = (uchar) unum; + inputData[1] = 0x02; /*set password */ + psw_len = PSW_LEN; /*=16 change if 20-byte passwords supported */ + memset (&inputData[2], 0, psw_len); + strcpy ((char *) &inputData[2], upswd); + if (fdebug) { + char apsw[PSW_MAX + 1]; + char c; + printf ("Pswd %d: ", unum); + for (i = 0; i < psw_len; i++) { + c = inputData[i + 2]; + printf ("%02x ", (unsigned char) c); + if (c < 0x20) + apsw[i] = '.'; + else + apsw[i] = c; + } + apsw[psw_len] = 0; + printf (" %s\n", apsw); + } + responseLength = sizeof (responseData); + status = ipmi_cmd (SET_USER_PASSWORD, inputData, 2 + psw_len, + responseData, &responseLength, &completionCode, + fdebug); + SELprintf ("SETUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n", + inputData[0], inputData[1], inputData[2], status, + completionCode); + if (status == 0) + status = completionCode; + if (status != 0) + ret = status; + + inputData[0] = (uchar) unum; /*user 1 = null user */ + inputData[1] = 0x03; /*test password */ + memset (&inputData[2], 0, psw_len); + if (upswd != NULL) + strcpy ((char *) &inputData[2], upswd); + responseLength = sizeof (responseData); + status = ipmi_cmd (SET_USER_PASSWORD, inputData, 2 + psw_len, + responseData, &responseLength, &completionCode, + fdebug); + SELprintf ("TESTUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n", + inputData[0], inputData[1], inputData[2], status, + completionCode); + } + + if (fiBMC && (unum == 2)) { /*iBMC doesn't support this on user 2 */ + if (fdebug) + printf ("skipping SETUSER_ACCESS on iBMC for user %d\n", unum); + } + else { + inputData[0] = 0x90 | chan; /* = 0x97 for chan=lan_ch=7 */ + inputData[1] = (uchar) unum; /* user num */ + inputData[2] = priv; /* usu priv=lan_access is admin */ + inputData[3] = 0x00; /* User Session Limit, 0=not limited */ + responseLength = sizeof (responseData); + status = ipmi_cmd (SET_USER_ACCESS, inputData, 4, responseData, + &responseLength, &completionCode, fdebug); + printf ("SETUSER_ACCESS - inputData %x %x %x, status = %x ccode=%x\n", + (uchar) inputData[0], inputData[1], inputData[2], + status, completionCode); + if (status == 0) + status = completionCode; + if (status != 0) + ret = status; + } + + return (ret); +} /*end SetPswd() */ -int SetUser(int unum, char *uname, char *passwd) +int +SetUser (int unum, char *uname, char *passwd, uchar chan) { - int ret = 0; - /* if the user specified a username or password, set it. */ - if ((fpassword) || (uname != NULL)) { - ret = SetPasswd(unum, uname,passwd); /*set username and password*/ - } - return(ret); -} /*end SetUser()*/ + int ret = 0; + /* if the user specified a username or password, set it. */ + if ((fpassword) || (uname != NULL)) { + /* set username and password */ + ret = SetPasswd (unum, uname, passwd, chan, lan_access); + } + return (ret); +} /*end SetUser() */ int -DisableUser(int unum) +DisableUser (int unum, uchar chan) { - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - int status; - uchar completionCode; - uchar inputData[24]; - - inputData[0] = 0x80 | lan_ch; /* = 0x87, no IPMI */ - inputData[1] = (uchar)unum; /* user 1 */ - inputData[2] = 0x0F; /* No access */ - inputData[3] = 0x00; /* User Session Limit, 0=not limited*/ - responseLength = sizeof(responseData); - status = ipmi_cmd(SET_USER_ACCESS, inputData, 4, responseData, - &responseLength, &completionCode, fdebug); - if (status == 0) status = completionCode; - return(status); + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar completionCode; + uchar inputData[24]; + + inputData[0] = 0x80 | chan; /* = 0x87, no IPMI */ + inputData[1] = (uchar) unum; /* user 1 */ + inputData[2] = 0x0F; /* No access */ + inputData[3] = 0x00; /* User Session Limit, 0=not limited */ + responseLength = sizeof (responseData); + status = ipmi_cmd (SET_USER_ACCESS, inputData, 4, responseData, + &responseLength, &completionCode, fdebug); + if (status == 0) + status = completionCode; + return (status); } -static char *parse_priv(uchar c) +char * parse_priv (uchar c) { - char *p; - c = (c & 0x0f); - switch(c) { - case 1: p = "Callback"; break; - case 2: p = "User "; break; - case 3: p = "Operator"; break; - case 4: p = "Admin "; break; - case 5: p = "OEM "; break; - case 0x0f: p = "No access"; break; - default: p = "Reserved"; /*usually =0*/ - } - return(p); + char *p; + c = (c & 0x0f); + switch (c) { + case 1: p = "Callback"; break; + case 2: p = "User "; break; + case 3: p = "Operator"; break; + case 4: p = "Admin "; break; + case 5: p = "OEM "; break; + case 0x0f: p = "No access"; break; + default: p = "Reserved"; /*usually =0 */ + } + return (p); } -static void show_priv(uchar c) +static void +show_priv (uchar c) { - char *privstr; - privstr = parse_priv(c); - printf("%s",privstr); + char *privstr; + privstr = parse_priv (c); + printf ("%s", privstr); } -static int valid_priv(int c) +static int +valid_priv (int c) { - int rv; - switch(c) { - case 1: - case 2: - case 3: - case 4: - case 5: - case 0x0f: - rv = 1; - break; - default: - rv = 0; - break; - } - return rv; + int rv; + switch (c) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 0x0f: + rv = 1; + break; + default: + rv = 0; + break; + } + return rv; } -int GetUser(uchar user_num) -{ - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - int status; - uchar completionCode; - uchar inputData[24]; - - inputData[0] = lan_ch; - inputData[1] = user_num; /* usually = 1 for BMC LAN */ - responseLength = sizeof(responseData); - status = ipmi_cmd(GET_USER_ACCESS, inputData, 2, responseData, - &responseLength, &completionCode, fdebug); - if (status == 0 && completionCode == 0) { - uchar c; - if (user_num == 1) { /*get max_users and enabled_users*/ - max_users = responseData[0] & 0x3f; - enabled_users = responseData[1] & 0x3f; - if (enabled_users > show_users) show_users = enabled_users; - if (show_users > max_users) show_users = max_users; - if (!fcanonical) - SELprintf("Users: showing %d of max %d users (%d enabled)\n", - show_users,max_users,enabled_users); - } - if (fcanonical) - SELprintf("Channel %d User %d Access %s%c ", lan_ch, user_num, - pspace2,bdelim); - else - SELprintf("User Access(chan%d,user%d): %02x %02x %02x %02x : ", - lan_ch, user_num, (uchar)responseData[0], - responseData[1],responseData[2], responseData[3]); - c = responseData[3]; - inputData[0] = user_num; /* usually = 1 for BMC LAN */ - responseLength = sizeof(responseData); - status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData, - &responseLength, &completionCode, fdebug); - if (status != 0 || completionCode != 0) - responseData[0] = 0; - if (c & 0x10) printf("IPMI, "); - show_priv(c); - printf(" (%s)\n",responseData); /*show user name */ - } else - SELprintf("Get User Access(%d,%d), status=%x, ccode=%x\n", - lan_ch, user_num, status, completionCode); - return(status); -} /*end GetUser()*/ - -static int GetSerEntry(uchar subfunc, LAN_RECORD *pLanRecord) +/* GetUserINfo - get user configuration info for user subfunction */ +int +GetUserInfo (uchar unum, uchar chan, uchar * enab, uchar * priv, char *uname, + char fdbg) { - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - uchar inputData[24]; - int status; - uchar completionCode; - uchar chan; uchar bset; - - if (pLanRecord == NULL) - { - if (fdebug) - printf("GetSerEntry(%d): error, output buffer is NULL\n",subfunc); - return (-1); - } - - chan = ser_ch; /* 1=EMP, 0=IPMB, 6=LAN2, 7=LAN1 */ - bset = 0; + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status, rv; + uchar completionCode; + uchar inputData[24]; + uchar upriv; + + if (fdbg) fdebug = 1; + if (enab == NULL || priv == NULL) + return (-2); + inputData[0] = chan; /*lan_ch */ + inputData[1] = unum; /* user number for IPMI LAN */ + responseLength = sizeof (responseData); + status = ipmi_cmd (GET_USER_ACCESS, inputData, 2, responseData, + &responseLength, &completionCode, fdebug); + rv = status; + if (status == 0 && completionCode != 0) + rv = completionCode; + if (rv == 0) { + if (unum == 1) { /*get max_users and enabled_users */ + max_users = responseData[0] & 0x3f; + enabled_users = responseData[1] & 0x3f; + } + upriv = responseData[3]; + if ((responseData[1] & 0x80) != 0) *enab = 0; + else *enab = 1; + inputData[0] = unum; /* usually = 1 for BMC LAN */ + responseLength = sizeof (responseData); + status = ipmi_cmd (GET_USER_NAME, inputData, 1, responseData, + &responseLength, &completionCode, fdebug); + if (status != 0 || completionCode != 0) + responseData[0] = 0; /*empty user name */ + responseData[PSW_MAX - 1] = 0; /*for safety */ + *priv = upriv; + if (uname != NULL) + strcpy (uname, responseData); + } + return (rv); +} - inputData[0] = chan; // flags, channel 3:0 (1=EMP) - inputData[1] = subfunc; // Param selector - inputData[2] = bset; // Set selector - inputData[3] = 0; // Block selector - if (subfunc == 10) { - inputData[2] = 0; - inputData[3] = 1; - } - - status = ipmi_cmd(GET_SER_CONFIG, inputData, 4, responseData, - &responseLength, &completionCode, fdebug); - - if (status == ACCESS_OK) { - if( completionCode ) { - if (fdebug) - SELprintf("GetSerEntry(%d,%d): completion code=%x\n", - chan,subfunc,completionCode); - } else { - // dont copy first byte (Parameter revision, usu 0x11) - memcpy(pLanRecord,&responseData[1],responseLength-1); - pLanRecord->data[responseLength-1] = 0; - //successful, done - return(0); - } - } +/* GetUser - get and show user configuration */ +int +GetUser (uchar user_num, uchar chan) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar completionCode; + uchar inputData[24]; + + inputData[0] = chan; /*lan_ch */ + inputData[1] = user_num; /* usually = 1 for BMC LAN */ + responseLength = sizeof (responseData); + status = ipmi_cmd (GET_USER_ACCESS, inputData, 2, responseData, + &responseLength, &completionCode, fdebug); + if (status == 0 && completionCode == 0) { + uchar c; + if (user_num == 1) { /*get max_users and enabled_users */ + max_users = responseData[0] & 0x3f; + enabled_users = responseData[1] & 0x3f; + if (enabled_users > show_users) + show_users = enabled_users; + if (show_users > max_users) + show_users = max_users; + if (!fcanonical) + SELprintf ("Users: showing %d of max %d users (%d enabled)\n", + show_users, max_users, enabled_users); + } + if (fcanonical) + SELprintf ("Channel %d User %d Access %s%c ", chan, user_num, + pspace2, bdelim); + else + SELprintf ("User Access(chan%d,user%d): %02x %02x %02x %02x : ", + chan, user_num, (uchar) responseData[0], + responseData[1], responseData[2], responseData[3]); + c = responseData[3]; + inputData[0] = user_num; /* usually = 1 for BMC LAN */ + responseLength = sizeof (responseData); + status = ipmi_cmd (GET_USER_NAME, inputData, 1, responseData, + &responseLength, &completionCode, fdebug); + if (status != 0 || completionCode != 0) + responseData[0] = 0; + if (c & 0x10) + printf ("IPMI, "); + show_priv (c); + printf (" (%s)\n", responseData); /*show user name */ + } + else + SELprintf ("Get User Access(%d,%d), status=%x, ccode=%x\n", + chan, user_num, status, completionCode); + return (status); +} /*end ShowUser() */ + +static int +GetSerEntry (uchar subfunc, LAN_RECORD * pLanRecord) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[24]; + int status; + uchar completionCode; + uchar chan; + uchar bset; + + if (pLanRecord == NULL) { + if (fdebug) + printf ("GetSerEntry(%d): error, output buffer is NULL\n", subfunc); + return (-1); + } + + chan = ser_ch; /* 1=EMP, 0=IPMB, 6=LAN2, 7=LAN1 */ + bset = 0; + + inputData[0] = chan; // flags, channel 3:0 (1=EMP) + inputData[1] = subfunc; // Param selector + inputData[2] = bset; // Set selector + inputData[3] = 0; // Block selector + if (subfunc == 10) { + inputData[2] = 0; + inputData[3] = 1; + } + + status = ipmi_cmd (GET_SER_CONFIG, inputData, 4, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if (completionCode) { + if (fdebug) + SELprintf ("GetSerEntry(%d,%d): completion code=%x\n", + chan, subfunc, completionCode); + } + else { + // dont copy first byte (Parameter revision, usu 0x11) + memcpy (pLanRecord, &responseData[1], responseLength - 1); + pLanRecord->data[responseLength - 1] = 0; + //successful, done + return (0); + } + } - // we are here because completionCode is not COMPLETION_CODE_OK - if (fdebug) - SELprintf("GetSerEntry(%d,%d): ipmi_cmd status=%x ccode=%x\n", - chan,subfunc,status,completionCode); - return -1; + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf ("GetSerEntry(%d,%d): ipmi_cmd status=%x ccode=%x\n", + chan, subfunc, status, completionCode); + return -1; } -static int GetLanEntry(uchar subfunc, uchar bset, LAN_RECORD *pLanRecord) +static int +GetLanEntry (uchar subfunc, uchar bset, LAN_RECORD * pLanRecord) { - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - uchar inputData[24]; - int status, n; - uchar completionCode; - uchar chan; - - if (pLanRecord == NULL) - { - if (fdebug) - printf("GetLanEntry: error, output buffer is NULL\n"); - return (-1); - } + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[24]; + int status, n; + uchar completionCode; + uchar chan; + + if (pLanRecord == NULL) { + if (fdebug) + printf ("GetLanEntry: error, output buffer is NULL\n"); + return (-1); + } - chan = lan_ch; /* LAN 1 = 7 */ - - inputData[0] = chan; // flags, channel 3:0 (LAN 1) - inputData[1] = subfunc; // Param selector (3 = ip addr) - inputData[2] = bset; // Set selector - inputData[3] = 0; // Block selector - - status = ipmi_cmd(GET_LAN_CONFIG, inputData, 4, responseData, - &responseLength, &completionCode, fdebug); - - if (status == ACCESS_OK) { - if( completionCode ) { - if (fdebug) - SELprintf("GetLanEntry: completion code=%x\n", - completionCode); - status = completionCode; - } else { - // dont copy first byte (Parameter revision, usu 0x11) - if (responseLength > 0) { - n = responseLength-1; - memcpy(pLanRecord,&responseData[1],n); - } else n = 0; - pLanRecord->data[n] = 0; - //successful, done - return(0); - } - } + chan = lan_ch; /* LAN 1 = 7 */ - // we are here because completionCode is not COMPLETION_CODE_OK - if (fdebug) - SELprintf("GetLanEntry: ipmi_cmd status=%d completionCode=%x\n", - status,completionCode); - return status; -} /* end GetLanEntry() */ + inputData[0] = chan; // flags, channel 3:0 (LAN 1) + inputData[1] = subfunc; // Param selector (3 = ip addr) + inputData[2] = bset; // Set selector + inputData[3] = 0; // Block selector -static int SetLanEntry(uchar subfunc, LAN_RECORD *pLanRecord, int reqlen) -{ - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - uchar inputData[24]; - int status; - uchar completionCode; + status = ipmi_cmd (GET_LAN_CONFIG, inputData, 4, responseData, + &responseLength, &completionCode, fdebug); - if (pLanRecord == NULL) - { - if (fdebug) - printf("SetLanEntry(%d): error, input buffer is NULL\n",subfunc); - return (-1); - } - if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) { - /* SUPERMICRO cannot set grat arp or grat arp interval */ - if (subfunc == 10 || subfunc == 11) return(0); - } - - inputData[0] = lan_ch; // flags, channel 3:0 (LAN 1) - inputData[1] = subfunc; // Param selector (3 = ip addr) - memcpy(&inputData[2],pLanRecord,reqlen); - - status = ipmi_cmd(SET_LAN_CONFIG, inputData, (uchar)(reqlen+2), - responseData, &responseLength,&completionCode,fdebug); - - if (status == ACCESS_OK) { - if( completionCode ) { - if (fdebug) - SELprintf("SetLanEntry(%d): completion code=%x\n", - subfunc,completionCode); // responseData[0]); - return(completionCode); - } else { - //successful, done - return(0); - } - } + if (status == ACCESS_OK) { + if (completionCode) { + if (fdebug) + SELprintf ("GetLanEntry: completion code=%x\n", completionCode); + status = completionCode; + } + else { + // dont copy first byte (Parameter revision, usu 0x11) + if (responseLength > 0) { + n = responseLength - 1; + memcpy (pLanRecord, &responseData[1], n); + } + else + n = 0; + pLanRecord->data[n] = 0; + //successful, done + return (0); + } + } - // we are here because completionCode is not COMPLETION_CODE_OK - if (fdebug) - SELprintf("SetLanEntry(%d): ipmi_cmd status=%d ccode=%x\n", - subfunc,status,completionCode); - return status; -} /* end SetLanEntry() */ + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf ("GetLanEntry: ipmi_cmd status=%d completionCode=%x\n", + status, completionCode); + return status; +} /* end GetLanEntry() */ -int GetPefEntry(uchar subfunc, ushort rec_id, PEF_RECORD *pPefRecord) +static int +SetLanEntry (uchar subfunc, LAN_RECORD * pLanRecord, int reqlen) { - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - uchar inputData[24]; /* only use 3 bytes for input */ - int status, n; - uchar completionCode; + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[24]; + int status; + uchar completionCode; - if (pPefRecord == NULL) - { - if (fdebug) - printf("GetPefEntry(%d): error, output buffer is NULL\n",subfunc); - return (-1); - } + if (pLanRecord == NULL) { + if (fdebug) + printf ("SetLanEntry(%d): error, input buffer is NULL\n", subfunc); + return (-1); + } + if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) { + /* SUPERMICRO cannot set grat arp or grat arp interval */ + if (subfunc == 10 || subfunc == 11) + return (0); + } + + inputData[0] = lan_ch; // flags, channel 3:0 (LAN 1) + inputData[1] = subfunc; // Param selector (3 = ip addr) + memcpy (&inputData[2], pLanRecord, reqlen); + + status = ipmi_cmd (SET_LAN_CONFIG, inputData, (uchar) (reqlen + 2), + responseData, &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if (completionCode) { + if (fdebug) + SELprintf ("SetLanEntry(%d): completion code=%x\n", subfunc, completionCode); // responseData[0]); + return (completionCode); + } + else { + //successful, done + return (0); + } + } - inputData[0] = subfunc; // Parameter = Evt Filter Table - inputData[1] = (uchar)rec_id; - inputData[2] = 0; - - status = ipmi_cmd(GET_PEF_CONFIG, inputData, 3, responseData, - &responseLength, &completionCode, fdebug); - - if (status == ACCESS_OK) { - if( completionCode ) { - if (fdebug) - SELprintf("GetPefEntry(%d/%d): completion code=%x\n", - subfunc,rec_id,completionCode); - status = completionCode; - } else { - /* expect PEF record to be >=21 bytes */ - if (responseLength > 1) n = responseLength-1; - else n = 0; - if (n > 21) n = 21; /*only use 21 bytes*/ - if ((subfunc == 6) && (n < 21)) { - if (fdebug) - printf("GetPefEntry(%d/%d): length %d too short\n", - subfunc,rec_id,responseLength); - } - // dont copy first byte (Parameter revision, usu 0x11) - if (n == 0) memset(pPefRecord,0,21); - else memcpy(pPefRecord,&responseData[1],n); - //successful, done - return(0); - } - } + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf ("SetLanEntry(%d): ipmi_cmd status=%d ccode=%x\n", + subfunc, status, completionCode); + return status; +} /* end SetLanEntry() */ + +int +GetPefEntry (uchar subfunc, ushort rec_id, PEF_RECORD * pPefRecord) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[24]; /* only use 3 bytes for input */ + int status, n; + uchar completionCode; + + if (pPefRecord == NULL) { + if (fdebug) + printf ("GetPefEntry(%d): error, output buffer is NULL\n", subfunc); + return (-1); + } + + inputData[0] = subfunc; // Parameter = Evt Filter Table + inputData[1] = (uchar) rec_id; + inputData[2] = 0; + + status = ipmi_cmd (GET_PEF_CONFIG, inputData, 3, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if (completionCode) { + if (fdebug) + SELprintf ("GetPefEntry(%d/%d): completion code=%x\n", + subfunc, rec_id, completionCode); + status = completionCode; + } + else { + /* expect PEF record to be >=21 bytes */ + if (responseLength > 1) + n = responseLength - 1; + else + n = 0; + if (n > 21) + n = 21; /*only use 21 bytes */ + if ((subfunc == 6) && (n < 21)) { + if (fdebug) + printf ("GetPefEntry(%d/%d): length %d too short\n", + subfunc, rec_id, responseLength); + } + // dont copy first byte (Parameter revision, usu 0x11) + if (n == 0) + memset (pPefRecord, 0, 21); + else + memcpy (pPefRecord, &responseData[1], n); + //successful, done + return (0); + } + } - // we are here because completionCode is not COMPLETION_CODE_OK - if (fdebug) - SELprintf("GetPefEntry: ipmi_cmd status=%x completionCode=%x\n", - status, completionCode); - return status; -} /* end GetPefEntry() */ + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf ("GetPefEntry: ipmi_cmd status=%x completionCode=%x\n", + status, completionCode); + return status; +} /* end GetPefEntry() */ -int SetPefEntry(PEF_RECORD *pPefRecord) +int +SetPefEntry (PEF_RECORD * pPefRecord) { - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - uchar inputData[32]; /* sizeof(PEF_RECORD) = 21 +1=22 */ - int status; - uchar completionCode; - uchar subfunc; - - subfunc = 0x06; // Parameter = Evt Filter Table - - if (pPefRecord == NULL) { - if (fdebug) - printf("SetPefEntry: error, output buffer is NULL\n"); - return (-1); - } + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[32]; /* sizeof(PEF_RECORD) = 21 +1=22 */ + int status; + uchar completionCode; + uchar subfunc; - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 - // 06 0c 80 01 01 00 ff ff 20 ff 6f ff 00 00 00 00 00 00 00 00 00 00 - // memset(&inputData[0],0,requestData.dataLength); - inputData[0] = subfunc; - memcpy(&inputData[1],pPefRecord,sizeof(PEF_RECORD)); - - status = ipmi_cmd(SET_PEF_CONFIG, inputData, sizeof(PEF_RECORD)+1, - responseData, &responseLength, &completionCode, fdebug); - - if (status == ACCESS_OK) { - if( completionCode ) { - if (fdebug) - SELprintf("SetPefEntry: completion code=%x\n", - completionCode); // responseData[0]); - status = completionCode; - } else { - //successful, done - return(0); - } + subfunc = 0x06; // Parameter = Evt Filter Table - } + if (pPefRecord == NULL) { + if (fdebug) + printf ("SetPefEntry: error, output buffer is NULL\n"); + return (-1); + } + + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 + // 06 0c 80 01 01 00 ff ff 20 ff 6f ff 00 00 00 00 00 00 00 00 00 00 + // memset(&inputData[0],0,requestData.dataLength); + inputData[0] = subfunc; + memcpy (&inputData[1], pPefRecord, sizeof (PEF_RECORD)); + + status = ipmi_cmd (SET_PEF_CONFIG, inputData, sizeof (PEF_RECORD) + 1, + responseData, &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if (completionCode) { + if (fdebug) + SELprintf ("SetPefEntry: completion code=%x\n", completionCode); // responseData[0]); + status = completionCode; + } + else { + //successful, done + return (0); + } - // we are here because completionCode is not COMPLETION_CODE_OK - if (fdebug) - SELprintf("SetPefEntry: ipmi_cmd status=%d completion code=%x\n", - status,completionCode); - return(status); - -} /* end SetPefEntry() */ + } -int DisablePef(int anum) -{ - uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ - uchar rData[MAX_BUFFER_SIZE]; - int rLength = MAX_BUFFER_SIZE; - uchar cc; - int status; - - if (fmBMC) { - SELprintf("mini-BMC does not support disabling BMC LAN\n"); - return(-1); - } else { - status = SetChanAcc(lan_ch, 0x80, CHAN_ACC_DISABLE); - if (fdebug) SELprintf("SetChanAcc(lan/active), ret = %d\n",status); - status = SetChanAcc(lan_ch, 0x40, CHAN_ACC_DISABLE); - SELprintf("SetChanAcc(lan), ret = %d\n",status); - if (status != 0) return(status); - } + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf ("SetPefEntry: ipmi_cmd status=%d completion code=%x\n", + status, completionCode); + return (status); - iData[0] = 0x01; /* PEF Control Param */ - iData[1] = 0x00; /* PEF disable */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, - &cc, fdebug); - if (status != 0) return(status); - if( cc ) { - SELprintf("DisablePef[%d]: completion code=%x\n",iData[0],cc); - return(-1); - } +} /* end SetPefEntry() */ - if (anum != 0) { - iData[0] = 0x09; /* PEF Alert Policy Table */ - iData[1] = (uchar)anum; /* Policy number (default 0x01) */ - iData[2] = 0x10; /* PEF LAN, policy disable */ - iData[3] = 0x00; /* LAN_CH=00, default dest=00 */ - iData[4] = 0x00; /* No alert string */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(SET_PEF_CONFIG, iData, 5, rData, &rLength, - &cc, fdebug); - if (status != 0) return(status); - if( cc ) { - SELprintf("DisablePef[%d]: completion code=%x\n",iData[0],cc); - return(-1); - } - } - return(status); +int +DisablePef (int anum) +{ + uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ + uchar rData[MAX_BUFFER_SIZE]; + int rLength = MAX_BUFFER_SIZE; + uchar cc; + int status; + + if (fmBMC) { + SELprintf ("mini-BMC does not support disabling BMC LAN\n"); + return (-1); + } + else { + status = SetChanAcc (lan_ch, 0x80, CHAN_ACC_DISABLE); + if (fdebug) + SELprintf ("SetChanAcc(lan/active), ret = %d\n", status); + status = SetChanAcc (lan_ch, 0x40, CHAN_ACC_DISABLE); + SELprintf ("SetChanAcc(lan), ret = %d\n", status); + if (status != 0) + return (status); + } + + iData[0] = 0x01; /* PEF Control Param */ + iData[1] = 0x00; /* PEF disable */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength, &cc, fdebug); + if (status != 0) + return (status); + if (cc) { + SELprintf ("DisablePef[%d]: completion code=%x\n", iData[0], cc); + return (-1); + } + + if (anum != 0) { + iData[0] = 0x09; /* PEF Alert Policy Table */ + iData[1] = (uchar) anum; /* Policy number (default 0x01) */ + iData[2] = 0x10; /* PEF LAN, policy disable */ + iData[3] = 0x00; /* LAN_CH=00, default dest=00 */ + iData[4] = 0x00; /* No alert string */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (SET_PEF_CONFIG, iData, 5, rData, &rLength, + &cc, fdebug); + if (status != 0) + return (status); + if (cc) { + SELprintf ("DisablePef[%d]: completion code=%x\n", iData[0], cc); + return (-1); + } + } + return (status); } -int ShowPef(void) +int +ShowPef (void) { - uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ - uchar rData[MAX_BUFFER_SIZE]; - int rLength = MAX_BUFFER_SIZE; - uchar cc; - int status, i,j; - - for (j = 1; j < MAX_PEFPARAMS; j++) { - if (j == 4 && fmBMC) { - /* fmBMC gets cc=0x80 for param 4, so skip it. */ - continue; - } - iData[0] = (uchar)j; /* PEF Control Param */ - if (j == 6 || j == 7 || j == 9) iData[1] = 1; - else iData[1] = 0x00; /* PEF Set Selector */ - if (j == 13) iData[2] = 1; - else iData[2] = 0x00; /* PEF Block Selector */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength, - &cc, fdebug); - if (status == 0 && cc == 0) { - SELprintf("PefParam[%d]: ",iData[0]); - if (rLength > 0) - for (i=0;i<peflen[j];i++) SELprintf("%02x ", rData[1+i]); - SELprintf("\n"); - } else - SELprintf("PefParam[%d]: GET_PEF status=%d cc=%x\n", - iData[0],status,cc); - } - return(status); + uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ + uchar rData[MAX_BUFFER_SIZE]; + int rLength = MAX_BUFFER_SIZE; + uchar cc; + int status, i, j; + + for (j = 1; j < MAX_PEFPARAMS; j++) { + if (j == 4 && fmBMC) { + /* fmBMC gets cc=0x80 for param 4, so skip it. */ + continue; + } + iData[0] = (uchar) j; /* PEF Control Param */ + if (j == 6 || j == 7 || j == 9) + iData[1] = 1; + else + iData[1] = 0x00; /* PEF Set Selector */ + if (j == 13) + iData[2] = 1; + else + iData[2] = 0x00; /* PEF Block Selector */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (GET_PEF_CONFIG, iData, 3, rData, &rLength, + &cc, fdebug); + if (status == 0 && cc == 0) { + SELprintf ("PefParam[%d]: ", iData[0]); + if (rLength > 0) + for (i = 0; i < peflen[j]; i++) + SELprintf ("%02x ", rData[1 + i]); + SELprintf ("\n"); + } + else + SELprintf ("PefParam[%d]: GET_PEF status=%d cc=%x\n", + iData[0], status, cc); + } + return (status); } -int EnablePef(int anum) +int +EnablePef (int anum) { - uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ - uchar rData[MAX_BUFFER_SIZE]; - int rLength = MAX_BUFFER_SIZE; - uchar cc; - int status; - uchar sdelay; - - status = SetChanAcc(lan_ch, 0x80, chan_pefon); - if (fdebug) SELprintf("SetChanAcc(lan/active), ret = %d\n",status); - status = SetChanAcc(lan_ch, 0x40, chan_pefon); - SELprintf("SetChanAcc(lan), ret = %d\n",status); - if (status != 0) return(status); - - { - iData[0] = 0x01; /* PEF Control Param */ - iData[1] = 0x00; /* PEF Set Selector */ - iData[2] = 0x00; /* PEF Block Selector */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength, - &cc, fdebug); - if (status != 0 || cc != 0) sdelay = 0; - else sdelay = rData[1]; - if (fdebug) SELprintf("EnablePef[%d]: get cc=%x, control=%02x\n", - iData[0],cc,sdelay); - iData[0] = 0x01; /* PEF Control Param (0x01 or 0x05) */ - iData[1] = 0x01; /* PEF enable, & no startup delay */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, - &cc, fdebug); - if (status != 0) return(status); - if( cc ) { - SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); - return(-1); - } + uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ + uchar rData[MAX_BUFFER_SIZE]; + int rLength = MAX_BUFFER_SIZE; + uchar cc; + int status; + uchar sdelay; + + status = SetChanAcc (lan_ch, 0x80, chan_pefon); + if (fdebug) + SELprintf ("SetChanAcc(lan/active), ret = %d\n", status); + status = SetChanAcc (lan_ch, 0x40, chan_pefon); + SELprintf ("SetChanAcc(lan), ret = %d\n", status); + if (status != 0) + return (status); + + { + iData[0] = 0x01; /* PEF Control Param */ + iData[1] = 0x00; /* PEF Set Selector */ + iData[2] = 0x00; /* PEF Block Selector */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (GET_PEF_CONFIG, iData, 3, rData, &rLength, + &cc, fdebug); + if (status != 0 || cc != 0) + sdelay = 0; + else + sdelay = rData[1]; + if (fdebug) + SELprintf ("EnablePef[%d]: get cc=%x, control=%02x\n", + iData[0], cc, sdelay); + iData[0] = 0x01; /* PEF Control Param (0x01 or 0x05) */ + iData[1] = 0x01; /* PEF enable, & no startup delay */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (status != 0) + return (status); + if (cc) { + SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc); + return (-1); + } #ifdef TEST - iData[0] = 0x01; /* Serial Channel */ - iData[1] = 0x13; /* Dest Com settings = 19. */ - iData[2] = 0x01; /* POL Default Dest */ - iData[3] = 0x60; - iData[4] = 0x07; - status = ipmi_cmd(SET_SER_CONFIG, iData, 5, rData, &rLength, - &cc, fdebug); + iData[0] = 0x01; /* Serial Channel */ + iData[1] = 0x13; /* Dest Com settings = 19. */ + iData[2] = 0x01; /* POL Default Dest */ + iData[3] = 0x60; + iData[4] = 0x07; + status = ipmi_cmd (SET_SER_CONFIG, iData, 5, rData, &rLength, + &cc, fdebug); #endif - iData[0] = 0x02; /* PEF Action Param */ - iData[1] = 0x00; /* PEF Set Selector */ - iData[2] = 0x00; /* PEF Block Selector */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength, - &cc, fdebug); - if (fdebug) SELprintf("EnablePef[%d]: get cc=%x, val=%02x\n", - iData[0],cc,rData[1]); - iData[0] = 0x02; /* PEF Action Param */ - if (vend_id == VENDOR_INTEL) - iData[1] = 0x2f; /* enable alerts, reset, power cycle/down, diag*/ - else - iData[1] = 0x0f; /* enable alerts, reset, power cycle/down */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, - &cc, fdebug); - if (status != 0) return(status); - if( cc ) { - SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); - return(-1); - } + iData[0] = 0x02; /* PEF Action Param */ + iData[1] = 0x00; /* PEF Set Selector */ + iData[2] = 0x00; /* PEF Block Selector */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (GET_PEF_CONFIG, iData, 3, rData, &rLength, + &cc, fdebug); + if (fdebug) + SELprintf ("EnablePef[%d]: get cc=%x, val=%02x\n", + iData[0], cc, rData[1]); + iData[0] = 0x02; /* PEF Action Param */ + if (vend_id == VENDOR_INTEL) + iData[1] = 0x2f; /* enable alerts, reset, power cycle/down, diag */ + else + iData[1] = 0x0f; /* enable alerts, reset, power cycle/down */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (status != 0) + return (status); + if (cc) { + SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc); + return (-1); + } - if ((sdelay & 0x04) != 0) { /* startup delay is supported */ - iData[0] = 0x03; /* PEF Startup Delay Param */ - iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, - &cc, fdebug); - if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n", - iData[0],iData[1],cc); - if (status != 0) return(status); - if( cc ) { - SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); - // return(-1); - } - iData[0] = 0x04; /* PEF Alert Startup Delay Param */ - iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, - &cc, fdebug); - if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n", - iData[0],iData[1],cc); - if (status != 0) return(status); - if( cc ) { - SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); - // return(-1); - } - } /*endif sdelay*/ - - iData[0] = 0x09; /* PEF Alert Policy Table */ - iData[1] = (uchar)anum; /* Policy number (default 0x01) */ - iData[2] = 0x18; /* PEF LAN, always alert, policy enable */ - iData[3] = (lan_ch << 4) + anum; /* LAN_CH=70, default dest=01 */ - iData[4] = 0x00; /* No alert string */ - rLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(SET_PEF_CONFIG, iData, 5, rData, &rLength, - &cc, fdebug); - if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n", - iData[0],iData[1],cc); - if (status != 0) return(status); - if( cc ) { - SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); - return(-1); - } - } /*endif IPMI 1.5 */ + if ((sdelay & 0x04) != 0) { /* startup delay is supported */ + iData[0] = 0x03; /* PEF Startup Delay Param */ + iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (fdebug) + SELprintf ("EnablePef[%d]: set val=%02x cc=%x\n", + iData[0], iData[1], cc); + if (status != 0) + return (status); + if (cc) { + SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc); + // return(-1); + } + iData[0] = 0x04; /* PEF Alert Startup Delay Param */ + iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (fdebug) + SELprintf ("EnablePef[%d]: set val=%02x cc=%x\n", + iData[0], iData[1], cc); + if (status != 0) + return (status); + if (cc) { + SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc); + // return(-1); + } + } /*endif sdelay */ + + iData[0] = 0x09; /* PEF Alert Policy Table */ + iData[1] = (uchar) anum; /* Policy number (default 0x01) */ + iData[2] = 0x18; /* PEF LAN, always alert, policy enable */ + iData[3] = (lan_ch << 4) + anum; /* LAN_CH=70, default dest=01 */ + iData[4] = 0x00; /* No alert string */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (SET_PEF_CONFIG, iData, 5, rData, &rLength, + &cc, fdebug); + if (fdebug) + SELprintf ("EnablePef[%d]: set val=%02x cc=%x\n", + iData[0], iData[1], cc); + if (status != 0) + return (status); + if (cc) { + SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc); + return (-1); + } + } /*endif IPMI 1.5 */ - return(status); -} /* end EnablePef */ + return (status); +} /* end EnablePef */ #define NBAUDS 10 -static struct { - unsigned char val; - char str[8]; - } mapbaud[NBAUDS] = { - { 6, "9600" }, - { 6, "9.6K" }, - { 7, "19.2K" }, - { 7, "19200" }, - { 8, "38.4K" }, - { 8, "38400" }, - { 9, "57.6K" }, - { 9, "57600" }, - { 10, "115.2K" }, - { 10, "115200" } - }; - -static unsigned char Str2Baud(char * str) +static struct +{ + unsigned char val; + char str[8]; +} mapbaud[NBAUDS] = { + { + 6, "9600"}, { + 6, "9.6K"}, { + 7, "19.2K"}, { + 7, "19200"}, { + 8, "38.4K"}, { + 8, "38400"}, { + 9, "57.6K"}, { + 9, "57600"}, { + 10, "115.2K"}, { + 10, "115200"} +}; + +static unsigned char +Str2Baud (char *str) { - unsigned char baud = 0; - int i, n, len; - len = strlen_(str); - for (i = 0; i < len; i++) /*toupper*/ - if (str[i] >= 'a' && str[i] <= 'z') str[i] &= 0x5F; - for (i = 0; i < NBAUDS; i++) { - n = strlen_(mapbaud[i].str); - if (strncmp(str,mapbaud[i].str,n) == 0) { - baud = mapbaud[i].val; - break; - } - } - if (i == NBAUDS || baud == 0) { - printf("Invalid -B parameter value (%s), using 19.2K.\n",str); - i = 1; /* default is 19.2K */ - baud = mapbaud[i].val; /* =7 */ - } - if (fdebug) printf("new baud = %02x (%s)\n",baud,mapbaud[i].str); - return(baud); + unsigned char baud = 0; + int i, n, len; + len = strlen_ (str); + for (i = 0; i < len; i++) /*toupper */ + if (str[i] >= 'a' && str[i] <= 'z') + str[i] &= 0x5F; + for (i = 0; i < NBAUDS; i++) { + n = strlen_ (mapbaud[i].str); + if (strncmp (str, mapbaud[i].str, n) == 0) { + baud = mapbaud[i].val; + break; + } + } + if (i == NBAUDS || baud == 0) { + printf ("Invalid -B parameter value (%s), using 19.2K.\n", str); + i = 1; /* default is 19.2K */ + baud = mapbaud[i].val; /* =7 */ + } + if (fdebug) + printf ("new baud = %02x (%s)\n", baud, mapbaud[i].str); + return (baud); } -static char *Baud2Str(unsigned char bin) +static char * +Baud2Str (unsigned char bin) { - char *baudstr; - unsigned char b; - b = bin & 0x0f; - switch(b) { - case 6: baudstr = "9600 "; break; - case 7: baudstr = "19.2k"; break; - case 8: baudstr = "38.4k"; break; - case 9: baudstr = "57.6k"; break; - case 10: baudstr = "115.2k"; break; - default: baudstr = "nobaud"; - } - return(baudstr); + char *baudstr; + unsigned char b; + b = bin & 0x0f; + switch (b) { + case 6: + baudstr = "9600 "; + break; + case 7: + baudstr = "19.2k"; + break; + case 8: + baudstr = "38.4k"; + break; + case 9: + baudstr = "57.6k"; + break; + case 10: + baudstr = "115.2k"; + break; + default: + baudstr = "nobaud"; + } + return (baudstr); } -static int BaudValid(unsigned char b) +static int +BaudValid (unsigned char b) { - int val = 0; - switch(b) { - case 6: val = 1; break; - case 7: val = 1; break; - case 8: val = 1; break; - case 9: val = 1; break; - case 10: val = 1; break; - default: val = 0; break; - } - return(val); + int val = 0; + switch (b) { + case 6: + val = 1; + break; + case 7: + val = 1; + break; + case 8: + val = 1; + break; + case 9: + val = 1; + break; + case 10: + val = 1; + break; + default: + val = 0; + break; + } + return (val); } /* * atomac - converts ASCII string to binary MAC address (array). * Accepts input formatted as 11:22:33:44:55:66 or 11-22-33-44-55-66. */ -void atomac(uchar *array, char *instr) +void +atomac (uchar * array, char *instr) { - int i,j,n; - char *pi; - j = 0; - pi = instr; - n = strlen_(instr); - for (i = 0; i <= n; i++) { - if (instr[i] == ':') { - array[j++] = htoi(pi); - pi = &instr[i+1]; - } else if (instr[i] == '-') { - array[j++] = htoi(pi); - pi = &instr[i+1]; - } else if (instr[i] == 0) { - array[j++] = htoi(pi); - } - if (j >= MAC_LEN) break; /*safety valve*/ - } - if (fdebug) - printf("atomac: %02x %02x %02x %02x %02x %02x\n", - array[0],array[1],array[2],array[3], array[4],array[5]); -} /*end atomac()*/ + int i, j, n; + char *pi; + j = 0; + pi = instr; + n = strlen_ (instr); + for (i = 0; i <= n; i++) { + if (instr[i] == ':') { + array[j++] = htoi (pi); + pi = &instr[i + 1]; + } + else if (instr[i] == '-') { + array[j++] = htoi (pi); + pi = &instr[i + 1]; + } + else if (instr[i] == 0) { + array[j++] = htoi (pi); + } + if (j >= MAC_LEN) + break; /*safety valve */ + } + if (fdebug) + printf ("atomac: %02x %02x %02x %02x %02x %02x\n", + array[0], array[1], array[2], array[3], array[4], array[5]); +} /*end atomac() */ /* extern void atoip(uchar *array,char *instr); *from subs.c*/ -void MacSetInvalid(uchar *mac) +void +MacSetInvalid (uchar * mac) { - int i; - if (mac == NULL) return; - for (i = 0; i < MAC_LEN; i++) { - if (i == 0) mac[i] = 0xFF; - else mac[i] = 0x00; - } + int i; + if (mac == NULL) + return; + for (i = 0; i < MAC_LEN; i++) { + if (i == 0) + mac[i] = 0xFF; + else + mac[i] = 0x00; + } } -int MacIsValid(uchar *mac) +int +MacIsValid (uchar * mac) { - int fvalid = 0; - int i; - /* check for initial invalid value of FF:00:... */ - if (mac[0] == 0xff && mac[1] == 0x00) /* marked as invalid */ - return(fvalid); - /* check for all zeros */ - for (i = 0; i < MAC_LEN; i++) - if (mac[i] != 0) { /* not all zeros */ - fvalid = 1; - break; - } - return(fvalid); + int fvalid = 0; + int i; + /* check for initial invalid value of FF:00:... */ + if (mac[0] == 0xff && mac[1] == 0x00) /* marked as invalid */ + return (fvalid); + /* check for all zeros */ + for (i = 0; i < MAC_LEN; i++) + if (mac[i] != 0) { /* not all zeros */ + fvalid = 1; + break; + } + return (fvalid); } -int IpIsValid(uchar *ipadr) +int +IpIsValid (uchar * ipadr) { - int fvalid = 1; - if (ipadr[0] == 0) fvalid = 0; - return(fvalid); + int fvalid = 1; + if (ipadr[0] == 0) + fvalid = 0; + return (fvalid); } -int SubnetIsValid(uchar *subnet) +int +SubnetIsValid (uchar * subnet) { - int fvalid = 0; - /* if masking off at least one bit, say valid */ - if (subnet[0] != 0) fvalid = 1; - return(fvalid); + int fvalid = 0; + /* if masking off at least one bit, say valid */ + if (subnet[0] != 0) + fvalid = 1; + return (fvalid); } -int SubnetIsSame(uchar *ip1, uchar *ip2, uchar *subnet) +int +SubnetIsSame (uchar * ip1, uchar * ip2, uchar * subnet) { - int i; - uchar c1, c2; - for (i = 0; i < 4; i ++) { - c1 = ip1[i] & subnet[i]; - c2 = ip2[i] & subnet[i]; - if (c1 != c2) return 0; - } - return 1; /*same, return true*/ + int i; + uchar c1, c2; + for (i = 0; i < 4; i++) { + c1 = ip1[i] & subnet[i]; + c2 = ip2[i] & subnet[i]; + if (c1 != c2) + return 0; + } + return 1; /*same, return true */ } #ifdef WIN32 /* * Obtain network adapter information (Windows). */ -PIP_ADAPTER_ADDRESSES GetAdapters() { - PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; - ULONG OutBufferLength = 0; - ULONG RetVal = 0, i; - - // The size of the buffer can be different - // between consecutive API calls. - // In most cases, i < 2 is sufficient; - // One call to get the size and one call to get the actual parameters. - // But if one more interface is added or addresses are added, - // the call again fails with BUFFER_OVERFLOW. - // So the number is picked slightly greater than 2. - // We use i <5 in the example - for (i = 0; i < 5; i++) { - RetVal = GetAdaptersAddresses( - AF_INET, 0, NULL, - AdapterAddresses, - &OutBufferLength); - - if (RetVal != ERROR_BUFFER_OVERFLOW) { - break; - } - - if (AdapterAddresses != NULL) { - free(AdapterAddresses); - } - - AdapterAddresses = (PIP_ADAPTER_ADDRESSES) malloc(OutBufferLength); - if (AdapterAddresses == NULL) { - RetVal = GetLastError(); - break; - } - } - if (RetVal == NO_ERROR) { - // If successful, return pointer to structure - return AdapterAddresses; - } - else { - LPVOID MsgBuf; - - printf("Call to GetAdaptersAddresses failed.\n"); - if (FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - RetVal, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &MsgBuf, - 0, - NULL )) { - printf("\tError: %s", MsgBuf); - } - LocalFree(MsgBuf); - } - return NULL; +PIP_ADAPTER_ADDRESSES +GetAdapters () +{ + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + ULONG OutBufferLength = 0; + ULONG RetVal = 0, i; + + // The size of the buffer can be different + // between consecutive API calls. + // In most cases, i < 2 is sufficient; + // One call to get the size and one call to get the actual parameters. + // But if one more interface is added or addresses are added, + // the call again fails with BUFFER_OVERFLOW. + // So the number is picked slightly greater than 2. + // We use i <5 in the example + for (i = 0; i < 5; i++) { + RetVal = GetAdaptersAddresses (AF_INET, 0, NULL, + AdapterAddresses, &OutBufferLength); + + if (RetVal != ERROR_BUFFER_OVERFLOW) { + break; + } + + if (AdapterAddresses != NULL) { + free (AdapterAddresses); + } + + AdapterAddresses = (PIP_ADAPTER_ADDRESSES) malloc (OutBufferLength); + if (AdapterAddresses == NULL) { + RetVal = GetLastError (); + break; + } + } + if (RetVal == NO_ERROR) { + // If successful, return pointer to structure + return AdapterAddresses; + } + else { + LPVOID MsgBuf; + + printf ("Call to GetAdaptersAddresses failed.\n"); + if (FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, RetVal, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) & MsgBuf, 0, NULL)) { + printf ("\tError: %s", MsgBuf); + } + LocalFree (MsgBuf); + } + return NULL; } /* * Set BMC MAC corresponding to current BMC IP address (Windows). */ -int GetLocalMACByIP() { - PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; - PIP_ADAPTER_ADDRESSES AdapterList; - int result = 0; - - struct sockaddr_in *si; - - AdapterAddresses = GetAdapters(); - AdapterList = AdapterAddresses; - - while (AdapterList) { - PIP_ADAPTER_UNICAST_ADDRESS addr; - addr = AdapterList->FirstUnicastAddress; - if (addr == NULL) si = NULL; - else si = (struct sockaddr_in*)addr->Address.lpSockaddr; - if (si != NULL) { - if(memcmp(&si->sin_addr.s_addr, rgmyip, 4) == 0) { - if (!MacIsValid(rgmymac)) - memcpy(rgmymac, AdapterList->PhysicalAddress, MAC_LEN); - memcpy(osmyip, &si->sin_addr.s_addr, 4); - memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN); - wcstombs(ifname,AdapterList->FriendlyName, sizeof(ifname)); - result = 1; - break; - } - } - AdapterList = AdapterList->Next; - } +int +GetLocalMACByIP () +{ + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + PIP_ADAPTER_ADDRESSES AdapterList; + int result = 0; - if (AdapterAddresses != NULL) { - free(AdapterAddresses); + struct sockaddr_in *si; + + AdapterAddresses = GetAdapters (); + AdapterList = AdapterAddresses; + + while (AdapterList) { + PIP_ADAPTER_UNICAST_ADDRESS addr; + addr = AdapterList->FirstUnicastAddress; + if (addr == NULL) + si = NULL; + else + si = (struct sockaddr_in *) addr->Address.lpSockaddr; + if (si != NULL) { + if (memcmp (&si->sin_addr.s_addr, rgmyip, 4) == 0) { + if (!MacIsValid (rgmymac)) + memcpy (rgmymac, AdapterList->PhysicalAddress, MAC_LEN); + memcpy (osmyip, &si->sin_addr.s_addr, 4); + memcpy (osmymac, AdapterList->PhysicalAddress, MAC_LEN); + wcstombs (ifname, AdapterList->FriendlyName, sizeof (ifname)); + result = 1; + break; + } } - return result; + AdapterList = AdapterList->Next; + } + + if (AdapterAddresses != NULL) { + free (AdapterAddresses); + } + return result; } /* @@ -1675,170 +1845,182 @@ int GetLocalMACByIP() { * ipaddr is 4 bytes, macaddr is 6 bytes, ipname can be 64 bytes. * (called by idiscover.c) */ -int GetFirstIP(uchar *ipaddr, uchar *macadr, char *ipname, char fdbg) +int +GetFirstIP (uchar * ipaddr, uchar * macadr, char *ipname, char fdbg) { - PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; - PIP_ADAPTER_ADDRESSES AdapterList; - struct sockaddr_in *si; - uchar *psaddr; - int result = -1; - - AdapterAddresses = GetAdapters(); - AdapterList = AdapterAddresses; - - while (AdapterList) { - PIP_ADAPTER_UNICAST_ADDRESS addr; - - addr = AdapterList->FirstUnicastAddress; - si = (struct sockaddr_in*)addr->Address.lpSockaddr; - psaddr = (uchar *)&si->sin_addr.s_addr; - if ((psaddr[0] != 0) && (psaddr[0] != 169)) { - if (fdbg) printf("found IP: s_addr=%d.%d.%d.%d\n", - psaddr[0], psaddr[1], psaddr[2], psaddr[3]); - if (ipaddr != NULL) - memcpy(ipaddr, &si->sin_addr.s_addr, 4); - if (macadr != NULL) { - memcpy(macadr, AdapterList->PhysicalAddress, MAC_LEN); - if (fdbg) printf("found MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", - macadr[0], macadr[1], macadr[2], macadr[3], - macadr[4], macadr[5]); - } - if (ipname != NULL) { - wcstombs(ipname,AdapterList->FriendlyName, sizeof(ifname)); - if (fdbg) printf("found Adapter: %d\n",ipname); - } - result = 0; - break; - } - AdapterList = AdapterList->Next; - } - - if (AdapterAddresses != NULL) { - free(AdapterAddresses); + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + PIP_ADAPTER_ADDRESSES AdapterList; + struct sockaddr_in *si; + uchar *psaddr; + int result = -1; + + AdapterAddresses = GetAdapters (); + AdapterList = AdapterAddresses; + + while (AdapterList) { + PIP_ADAPTER_UNICAST_ADDRESS addr; + + addr = AdapterList->FirstUnicastAddress; + si = (struct sockaddr_in *) addr->Address.lpSockaddr; + psaddr = (uchar *) & si->sin_addr.s_addr; + if ((psaddr[0] != 0) && (psaddr[0] != 169)) { + if (fdbg) + printf ("found IP: s_addr=%d.%d.%d.%d\n", + psaddr[0], psaddr[1], psaddr[2], psaddr[3]); + if (ipaddr != NULL) + memcpy (ipaddr, &si->sin_addr.s_addr, 4); + if (macadr != NULL) { + memcpy (macadr, AdapterList->PhysicalAddress, MAC_LEN); + if (fdbg) + printf ("found MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", + macadr[0], macadr[1], macadr[2], macadr[3], + macadr[4], macadr[5]); + } + if (ipname != NULL) { + wcstombs (ipname, AdapterList->FriendlyName, sizeof (ifname)); + if (fdbg) + printf ("found Adapter: %d\n", ipname); + } + result = 0; + break; } - return result; + AdapterList = AdapterList->Next; + } + + if (AdapterAddresses != NULL) { + free (AdapterAddresses); + } + return result; } /* * Set BMC MAC corresponding to current BMC IP address (Windows). */ -int GetLocalIPByMAC(uchar *macadr) { - PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; - PIP_ADAPTER_ADDRESSES AdapterList; - int result = 0; - - struct sockaddr_in *si; - - AdapterAddresses = GetAdapters(); - AdapterList = AdapterAddresses; - - while (AdapterList) { - PIP_ADAPTER_UNICAST_ADDRESS addr; - if(memcmp(AdapterList->PhysicalAddress, macadr, MAC_LEN) == 0) { - addr = AdapterList->FirstUnicastAddress; - - si = (struct sockaddr_in*)addr->Address.lpSockaddr; - if (fdebug) { - uchar *psaddr; - psaddr = (uchar *)&si->sin_addr.s_addr; - printf("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d\n", - rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], - psaddr[0], psaddr[1], psaddr[2], psaddr[3]); - } - if (!IpIsValid(rgmyip) && (fsharedMAC==1)) /*not specified, shared*/ - memcpy(rgmyip, &si->sin_addr.s_addr, 4); - memcpy(osmyip, &si->sin_addr.s_addr, 4); - memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN); - wcstombs(ifname,AdapterList->FriendlyName, sizeof(ifname)); - result = 1; - break; - } - AdapterList = AdapterList->Next; - } - - if (AdapterAddresses != NULL) { - free(AdapterAddresses); +int +GetLocalIPByMAC (uchar * macadr) +{ + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + PIP_ADAPTER_ADDRESSES AdapterList; + int result = 0; + + struct sockaddr_in *si; + + AdapterAddresses = GetAdapters (); + AdapterList = AdapterAddresses; + + while (AdapterList) { + PIP_ADAPTER_UNICAST_ADDRESS addr; + if (memcmp (AdapterList->PhysicalAddress, macadr, MAC_LEN) == 0) { + addr = AdapterList->FirstUnicastAddress; + + si = (struct sockaddr_in *) addr->Address.lpSockaddr; + if (fdebug) { + uchar *psaddr; + psaddr = (uchar *) & si->sin_addr.s_addr; + printf ("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d\n", + rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], + psaddr[0], psaddr[1], psaddr[2], psaddr[3]); + } + if (!IpIsValid (rgmyip) && (fsharedMAC == 1)) /*not specified, shared */ + memcpy (rgmyip, &si->sin_addr.s_addr, 4); + memcpy (osmyip, &si->sin_addr.s_addr, 4); + memcpy (osmymac, AdapterList->PhysicalAddress, MAC_LEN); + wcstombs (ifname, AdapterList->FriendlyName, sizeof (ifname)); + result = 1; + break; } - return result; + AdapterList = AdapterList->Next; + } + + if (AdapterAddresses != NULL) { + free (AdapterAddresses); + } + return result; } + /* * Set MAC and IP address from given interface name (Windows). */ -int GetLocalDataByIface() { - PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; - PIP_ADAPTER_ADDRESSES AdapterList; - int result = 0; - - size_t origsize, newsize, convertedChars; - wchar_t* wcstring; - struct sockaddr_in *si; - - AdapterAddresses = GetAdapters(); - AdapterList = AdapterAddresses; - - origsize = strlen(ifname) + 1; - newsize = origsize; - convertedChars = 0; - wcstring = (wchar_t*) malloc(sizeof(wchar_t) * newsize) ; - if (wcstring == NULL) AdapterList = NULL; /*skip loop, do free*/ - else mbstowcs(wcstring, ifname, origsize ); - - while (AdapterList) { - PIP_ADAPTER_UNICAST_ADDRESS addr; - if(wcsstr(AdapterList->FriendlyName, wcstring)) { - printf("Using interface: %S\n", AdapterList->FriendlyName); - printf("\t%S\n", AdapterList->Description); - addr = AdapterList->FirstUnicastAddress; - - si = (struct sockaddr_in*)addr->Address.lpSockaddr; - if (fdebug) { - uchar *psaddr; - psaddr = (uchar *)&si->sin_addr.s_addr; - printf("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d " - "fsharedMAC=%d\n", - rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], - psaddr[0], psaddr[1], psaddr[2], psaddr[3], - fsharedMAC); - } - if (!IpIsValid(rgmyip)) { /*IP not specified*/ - memcpy(rgmyip, &si->sin_addr.s_addr, 4); - memcpy(rgmymac, AdapterList->PhysicalAddress, MAC_LEN); - } - memcpy(osmyip, &si->sin_addr.s_addr, 4); - memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN); - /* FriendlyName == ifname already */ - result = 1; - break; - } - AdapterList = AdapterList->Next; - } - - if (AdapterAddresses != NULL) { - free(AdapterAddresses); +int +GetLocalDataByIface () +{ + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + PIP_ADAPTER_ADDRESSES AdapterList; + int result = 0; + + size_t origsize, newsize, convertedChars; + wchar_t *wcstring; + struct sockaddr_in *si; + + AdapterAddresses = GetAdapters (); + AdapterList = AdapterAddresses; + + origsize = strlen (ifname) + 1; + newsize = origsize; + convertedChars = 0; + wcstring = (wchar_t *) malloc (sizeof (wchar_t) * newsize); + if (wcstring == NULL) + AdapterList = NULL; /*skip loop, do free */ + else + mbstowcs (wcstring, ifname, origsize); + + while (AdapterList) { + PIP_ADAPTER_UNICAST_ADDRESS addr; + if (wcsstr (AdapterList->FriendlyName, wcstring)) { + printf ("Using interface: %S\n", AdapterList->FriendlyName); + printf ("\t%S\n", AdapterList->Description); + addr = AdapterList->FirstUnicastAddress; + + si = (struct sockaddr_in *) addr->Address.lpSockaddr; + if (fdebug) { + uchar *psaddr; + psaddr = (uchar *) & si->sin_addr.s_addr; + printf ("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d " + "fsharedMAC=%d\n", + rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], + psaddr[0], psaddr[1], psaddr[2], psaddr[3], fsharedMAC); + } + if (!IpIsValid (rgmyip)) { /*IP not specified */ + memcpy (rgmyip, &si->sin_addr.s_addr, 4); + memcpy (rgmymac, AdapterList->PhysicalAddress, MAC_LEN); + } + memcpy (osmyip, &si->sin_addr.s_addr, 4); + memcpy (osmymac, AdapterList->PhysicalAddress, MAC_LEN); + /* FriendlyName == ifname already */ + result = 1; + break; } - return result; + AdapterList = AdapterList->Next; + } + + if (AdapterAddresses != NULL) { + free (AdapterAddresses); + } + return result; } -int FindEthNum(uchar *macadrin) +int +FindEthNum (uchar * macadrin) { - int i; - uchar macadr[MAC_LEN]; - memcpy(macadr,macadrin,MAC_LEN); - if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) { - /* Intel factory assigns them this way, so use that to compare */ - macadr[MAC_LEN-1] -= 2; /*OS MAC = BMC MAC - 2*/ - } - i = GetLocalIPByMAC(macadr); - if (i == 1) fethfound = 1; - if (fdebug) /* show the local OS eth if and MAC */ - printf("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", - ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], - osmymac[0], osmymac[1], osmymac[2], osmymac[3], - osmymac[4], osmymac[5]); - /* The actual Windows ethernet interface is determined - * in Get_IPMac_Addr using ipconfig, so - * init eth interface number as eth0 for Windows. */ - return(0); + int i; + uchar macadr[MAC_LEN]; + memcpy (macadr, macadrin, MAC_LEN); + if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) { + /* Intel factory assigns them this way, so use that to compare */ + macadr[MAC_LEN - 1] -= 2; /*OS MAC = BMC MAC - 2 */ + } + i = GetLocalIPByMAC (macadr); + if (i == 1) + fethfound = 1; + if (fdebug) /* show the local OS eth if and MAC */ + printf + ("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", + ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], osmymac[0], + osmymac[1], osmymac[2], osmymac[3], osmymac[4], osmymac[5]); + /* The actual Windows ethernet interface is determined + * in Get_IPMac_Addr using ipconfig, so + * init eth interface number as eth0 for Windows. */ + return (0); } #elif defined(HPUX) #define INSAP 22 @@ -1864,301 +2046,329 @@ int FindEthNum(uchar *macadrin) #define GOT_ERR 128 static u_long ctl_area[AREA_SZ]; static u_long dat_area[AREA_SZ]; -static struct strbuf ctl = {AREA_SZ, 0, (char *)ctl_area}; -static struct strbuf dat = {AREA_SZ, 0, (char *)dat_area}; -static char *dlpi_dev[] = {"/dev/dlpi", ""}; +static struct strbuf ctl = { AREA_SZ, 0, (char *) ctl_area }; +static struct strbuf dat = { AREA_SZ, 0, (char *) dat_area }; +static char *dlpi_dev[] = { "/dev/dlpi", "" }; /*=* get a message from a stream; return type of message *=*/ -static int get_msg(int fd) +static int +get_msg (int fd) { - int flags = 0; - int res, ret; - ctl_area[0] = 0; - dat_area[0] = 0; - ret = 0; - res = getmsg(fd, &ctl, &dat, &flags); - if(res < 0) { - if(errno == EINTR) { - return(GOT_INTR); - } else { - return(GOT_ERR); - } - } - if(ctl.len > 0) { - ret |= GOT_CTRL; - } - if(dat.len > 0) { - ret |= GOT_DATA; - } - return(ret); + int flags = 0; + int res, ret; + ctl_area[0] = 0; + dat_area[0] = 0; + ret = 0; + res = getmsg (fd, &ctl, &dat, &flags); + if (res < 0) { + if (errno == EINTR) { + return (GOT_INTR); + } + else { + return (GOT_ERR); + } + } + if (ctl.len > 0) { + ret |= GOT_CTRL; + } + if (dat.len > 0) { + ret |= GOT_DATA; + } + return (ret); } /*=* verify that dl_primitive in ctl_area = prim *=*/ -static int check_ctrl(int prim) +static int +check_ctrl (int prim) { - dl_error_ack_t *err_ack = (dl_error_ack_t *)ctl_area; - if(err_ack->dl_primitive != prim) { - return GOT_ERR; - } - return 0; + dl_error_ack_t *err_ack = (dl_error_ack_t *) ctl_area; + if (err_ack->dl_primitive != prim) { + return GOT_ERR; + } + return 0; } /*=* put a control message on a stream *=*/ -static int put_ctrl(int fd, int len, int pri) +static int +put_ctrl (int fd, int len, int pri) { - ctl.len = len; - if(putmsg(fd, &ctl, 0, pri) < 0) { - return GOT_ERR; - } - return 0; + ctl.len = len; + if (putmsg (fd, &ctl, 0, pri) < 0) { + return GOT_ERR; + } + return 0; } /*=* put a control + data message on a stream *=*/ -static int put_both(int fd, int clen, int dlen, int pri) +static int +put_both (int fd, int clen, int dlen, int pri) { - ctl.len = clen; - dat.len = dlen; - if(putmsg(fd, &ctl, &dat, pri) < 0) { - return GOT_ERR; - } - return 0; + ctl.len = clen; + dat.len = dlen; + if (putmsg (fd, &ctl, &dat, pri) < 0) { + return GOT_ERR; + } + return 0; } /*=* open file descriptor and attach *=*/ -static int dl_open(const char *dev, int ppa, int *fd) +static int +dl_open (const char *dev, int ppa, int *fd) { - dl_attach_req_t *attach_req = (dl_attach_req_t *)ctl_area; - if((*fd = open(dev, O_RDWR)) == -1) { - return GOT_ERR; - } - attach_req->dl_primitive = DL_ATTACH_REQ; - attach_req->dl_ppa = ppa; - put_ctrl(*fd, sizeof(dl_attach_req_t), 0); - get_msg(*fd); - return check_ctrl(DL_OK_ACK); + dl_attach_req_t *attach_req = (dl_attach_req_t *) ctl_area; + if ((*fd = open (dev, O_RDWR)) == -1) { + return GOT_ERR; + } + attach_req->dl_primitive = DL_ATTACH_REQ; + attach_req->dl_ppa = ppa; + put_ctrl (*fd, sizeof (dl_attach_req_t), 0); + get_msg (*fd); + return check_ctrl (DL_OK_ACK); } /*=* send DL_BIND_REQ *=*/ -static int dl_bind(int fd, int sap, u_char *addr) +static int +dl_bind (int fd, int sap, u_char * addr) { - dl_bind_req_t *bind_req = (dl_bind_req_t *)ctl_area; - dl_bind_ack_t *bind_ack = (dl_bind_ack_t *)ctl_area; - bind_req->dl_primitive = DL_BIND_REQ; - bind_req->dl_sap = sap; - bind_req->dl_max_conind = 1; - bind_req->dl_service_mode = DL_CLDLS; - bind_req->dl_conn_mgmt = 0; - bind_req->dl_xidtest_flg = 0; - put_ctrl(fd, sizeof(dl_bind_req_t), 0); - get_msg(fd); - if (GOT_ERR == check_ctrl(DL_BIND_ACK)) { - return GOT_ERR; - } - bcopy((u_char *)bind_ack + bind_ack->dl_addr_offset, addr, - bind_ack->dl_addr_length); - return 0; + dl_bind_req_t *bind_req = (dl_bind_req_t *) ctl_area; + dl_bind_ack_t *bind_ack = (dl_bind_ack_t *) ctl_area; + bind_req->dl_primitive = DL_BIND_REQ; + bind_req->dl_sap = sap; + bind_req->dl_max_conind = 1; + bind_req->dl_service_mode = DL_CLDLS; + bind_req->dl_conn_mgmt = 0; + bind_req->dl_xidtest_flg = 0; + put_ctrl (fd, sizeof (dl_bind_req_t), 0); + get_msg (fd); + if (GOT_ERR == check_ctrl (DL_BIND_ACK)) { + return GOT_ERR; + } + bcopy ((u_char *) bind_ack + bind_ack->dl_addr_offset, addr, + bind_ack->dl_addr_length); + return 0; } -int FindEthNum(uchar *addr) -{ /* Need to use DLPI for HPUX */ - /*See http://cplus.kompf.de/artikel/macaddr.html */ - int fd; - int ppa; - u_char mac_addr[25]; - char **dev; - int i = 0; - - for (dev = dlpi_dev; **dev != ''; ++dev) { - for (ppa=0; ppa<10; ++ppa) { - if (GOT_ERR != dl_open(*dev, ppa, &fd)) { - if (GOT_ERR != dl_bind(fd, INSAP, mac_addr)) { - // bcopy( mac_addr, addr, 6); - i = ppa; - if (memcmp(mac_addr,addr,MAC_LEN) == 0) { - memcpy(osmymac, addr, MAC_LEN); - return(ppa); - } - } - } - close(fd); - } - } - return(i); +int +FindEthNum (uchar * addr) +{ /* Need to use DLPI for HPUX */ + /*See http://cplus.kompf.de/artikel/macaddr.html */ + int fd; + int ppa; + u_char mac_addr[25]; + char **dev; + int i = 0; + + for (dev = dlpi_dev; **dev != ''; ++dev) { + for (ppa = 0; ppa < 10; ++ppa) { + if (GOT_ERR != dl_open (*dev, ppa, &fd)) { + if (GOT_ERR != dl_bind (fd, INSAP, mac_addr)) { + // bcopy( mac_addr, addr, 6); + i = ppa; + if (memcmp (mac_addr, addr, MAC_LEN) == 0) { + memcpy (osmymac, addr, MAC_LEN); + return (ppa); + } + } + } + close (fd); + } + } + return (i); } #else -static char *get_ifreq_mac(struct ifreq *ifrq) +static char * +get_ifreq_mac (struct ifreq *ifrq) { - char *ptr; + char *ptr; #ifdef SOLARIS - ptr = (char *)&ifrq->ifr_ifru.ifru_enaddr[0]; + ptr = (char *) &ifrq->ifr_ifru.ifru_enaddr[0]; #elif BSD - ptr = (char *)&ifrq->ifr_ifru.ifru_addr.sa_data[0]; + ptr = (char *) &ifrq->ifr_ifru.ifru_addr.sa_data[0]; #elif MACOS - static uchar mactmp[MAC_LEN]; - ptr = &mactmp[0]; - MacSetInvalid(ptr); + static uchar mactmp[MAC_LEN]; + ptr = &mactmp[0]; + MacSetInvalid (ptr); #else - ptr = (char *)&ifrq->ifr_hwaddr.sa_data[0]; + ptr = (char *) &ifrq->ifr_hwaddr.sa_data[0]; #endif - return (ptr); + return (ptr); } -extern int find_ifname(char *ifname); /*see idiscover.c*/ - -int FindEthNum(uchar *macadrin) -{ /*only used for Linux*/ - struct ifreq ifr; - int skfd; - int nCurDevice; - int devnum = -1; - int devos = 0; - uchar macadr[MAC_LEN]; - uchar macsav[MAC_LEN]; - uchar mactmp[MAC_LEN]; - uchar ipsav[4]; - char szDeviceName[ 16 ]; /* MAX_DEVICE_NAME_LENGTH + 1 */ - uchar fipvalid = 0; - int n; - - memcpy(macadr,macadrin,MAC_LEN); - if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) { - /* Intel factory assigns them this way, so use that to compare */ - macadr[MAC_LEN-1] -= 2; /*OS MAC = BMC MAC - 2*/ - } +extern int find_ifname (char *ifname); /*see idiscover.c */ + +int +FindEthNum (uchar * macadrin) +{ /*only used for Linux */ + struct ifreq ifr; + int skfd; + int nCurDevice; + int devnum = -1; + int devos = 0; + uchar macadr[MAC_LEN]; + uchar macsav[MAC_LEN]; + uchar mactmp[MAC_LEN]; + uchar ipsav[4]; + char szDeviceName[16]; /* MAX_DEVICE_NAME_LENGTH + 1 */ + uchar fipvalid = 0; + int n; + + memcpy (macadr, macadrin, MAC_LEN); + if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) { + /* Intel factory assigns them this way, so use that to compare */ + macadr[MAC_LEN - 1] -= 2; /*OS MAC = BMC MAC - 2 */ + } #ifdef DBG - if (fdebug) { - uchar *pb; - pb = macadrin; - printf("input mac:%02x:%02x:%02x:%02x:%02x:%02x " - "tmp mac:%02x:%02x:%02x:%02x:%02x:%02x\n", - pb[0],pb[1],pb[2],pb[3],pb[4],pb[5], - macadr[0],macadr[1],macadr[2],macadr[3],macadr[4],macadr[5]); - } + if (fdebug) { + uchar *pb; + pb = macadrin; + printf ("input mac:%02x:%02x:%02x:%02x:%02x:%02x " + "tmp mac:%02x:%02x:%02x:%02x:%02x:%02x\n", + pb[0], pb[1], pb[2], pb[3], pb[4], pb[5], + macadr[0], macadr[1], macadr[2], macadr[3], macadr[4], macadr[5]); + } #endif - - n = find_ifname(szDeviceName); - if (n >= 0) { - n = strlen_(szDeviceName); - if (n < sizeof(ifpattn)) { - strcpy(ifpattn,szDeviceName); - ifpattn[n - 1] = 0; /*truncate last digit*/ - } - if (fdebug) - printf("found ifname %s, pattern %s\n",szDeviceName,ifpattn); + + n = find_ifname (szDeviceName); + if (n >= 0) { + n = strlen_ (szDeviceName); + if (n < sizeof (ifpattn)) { + strcpy (ifpattn, szDeviceName); + ifpattn[n - 1] = 0; /*truncate last digit */ } + if (fdebug) + printf ("found ifname %s, pattern %s\n", szDeviceName, ifpattn); + } - if ( ( skfd = socket(AF_INET, SOCK_DGRAM, 0 ) ) < 0) { - if ( fdebug ) { - perror("socket"); - return devnum; - } + if ((skfd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { + if (fdebug) { + perror ("socket"); + return devnum; } - - for( nCurDevice = 0 ; - (nCurDevice < NUM_DEVICES_TO_CHECK) && (devnum == -1); - nCurDevice++ ) - { - sprintf( szDeviceName, "%s%d", ifpattn, nCurDevice ); /*eth%d*/ - memset((char *)&ifr,0,sizeof(ifr)); - strcpy(ifr.ifr_name, szDeviceName ); + } + + for (nCurDevice = 0; + (nCurDevice < NUM_DEVICES_TO_CHECK) && (devnum == -1); nCurDevice++) { + sprintf (szDeviceName, "%s%d", ifpattn, nCurDevice); /*eth%d */ + memset ((char *) &ifr, 0, sizeof (ifr)); + strcpy (ifr.ifr_name, szDeviceName); #ifdef SIOCGIFHWADDR - if (ioctl(skfd, SIOCGIFHWADDR, &ifr) > 0) { - if ( fdebug ) - printf("FindEthNum: Could not get MAC address for %s\n", - szDeviceName); - } else + if (ioctl (skfd, SIOCGIFHWADDR, &ifr) > 0) { + if (fdebug) + printf ("FindEthNum: Could not get MAC address for %s\n", + szDeviceName); + } + else #endif - { - uchar *pb; - pb = (uchar *)get_ifreq_mac(&ifr); + { + uchar *pb; + pb = (uchar *) get_ifreq_mac (&ifr); #ifdef DBG - if (fdebug) { - printf("%s mac: %02x:%02x:%02x:%02x:%02x:%02x\n", - szDeviceName, pb[0],pb[1],pb[2],pb[3],pb[4],pb[5]); - } + if (fdebug) { + printf ("%s mac: %02x:%02x:%02x:%02x:%02x:%02x\n", + szDeviceName, pb[0], pb[1], pb[2], pb[3], pb[4], pb[5]); + } #endif - memcpy(macsav, pb, MAC_LEN); - /* check if this device is configured for IP addr */ - memset((char *)&ifr,0,sizeof(ifr)); - strcpy(ifr.ifr_name, szDeviceName); - ifr.ifr_addr.sa_family = AF_INET; - if (ioctl(skfd, SIOCGIFADDR, &ifr) >= 0) { - fipvalid = 1; - memcpy(ipsav, &ifr.ifr_addr.sa_data[2], 4); - } else fipvalid = 0; - if (memcmp(macsav, macadr, MAC_LEN) == 0) { /*found match*/ - devnum = nCurDevice; - memcpy(osmymac, macsav, MAC_LEN); - if (fipvalid) memcpy(osmyip, ipsav, 4); - break; - } - if (nCurDevice == 0) { /*set a default of eth0*/ - devos = nCurDevice; - memcpy(osmymac,macsav, MAC_LEN); - if (fipvalid) memcpy(osmyip, ipsav, 4); - } else if (fipvalid) { /*check if NIC1 is eth1,2,3,...*/ - memcpy(mactmp,osmymac,MAC_LEN); - mactmp[MAC_LEN-1] -= 1; - if (memcmp(mactmp,macsav,MAC_LEN) == 0) { - devos = nCurDevice; - memcpy(osmymac, macsav, MAC_LEN); - memcpy(osmyip, ipsav, 4); - } - } - } /*end else*/ - } - if (!fsetifn) { - if (devnum == -1) { /*not found, use devos default*/ - devnum = devos; - sprintf( ifname, "%s%d", ifpattn, devnum ); /*eth%d*/ - } else { /* match was found, devnum set */ - fethfound = 1; - strcpy(ifname, szDeviceName ); + memcpy (macsav, pb, MAC_LEN); + /* check if this device is configured for IP addr */ + memset ((char *) &ifr, 0, sizeof (ifr)); + strcpy (ifr.ifr_name, szDeviceName); + ifr.ifr_addr.sa_family = AF_INET; + if (ioctl (skfd, SIOCGIFADDR, &ifr) >= 0) { + fipvalid = 1; + memcpy (ipsav, &ifr.ifr_addr.sa_data[2], 4); + } + else + fipvalid = 0; + if (memcmp (macsav, macadr, MAC_LEN) == 0) { /*found match */ + devnum = nCurDevice; + memcpy (osmymac, macsav, MAC_LEN); + if (fipvalid) + memcpy (osmyip, ipsav, 4); + break; + } + if (nCurDevice == 0) { /*set a default of eth0 */ + devos = nCurDevice; + memcpy (osmymac, macsav, MAC_LEN); + if (fipvalid) + memcpy (osmyip, ipsav, 4); + } + else if (fipvalid) { /*check if NIC1 is eth1,2,3,... */ + memcpy (mactmp, osmymac, MAC_LEN); + mactmp[MAC_LEN - 1] -= 1; + if (memcmp (mactmp, macsav, MAC_LEN) == 0) { + devos = nCurDevice; + memcpy (osmymac, macsav, MAC_LEN); + memcpy (osmyip, ipsav, 4); + } } + } /*end else */ + } + if (!fsetifn) { + if (devnum == -1) { /*not found, use devos default */ + devnum = devos; + sprintf (ifname, "%s%d", ifpattn, devnum); /*eth%d */ } - close(skfd); - if (fdebug) /* show the local OS eth if and MAC */ - printf("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", - ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], - osmymac[0], osmymac[1], osmymac[2], osmymac[3], - osmymac[4], osmymac[5]); - return(devnum); + else { /* match was found, devnum set */ + fethfound = 1; + strcpy (ifname, szDeviceName); + } + } + close (skfd); + if (fdebug) /* show the local OS eth if and MAC */ + printf + ("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", + ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], osmymac[0], + osmymac[1], osmymac[2], osmymac[3], osmymac[4], osmymac[5]); + return (devnum); } #endif -int show_channels(void) +int +show_channels (void) { - int ret, rlen; - uchar iData[2]; - uchar rData[10]; - uchar cc, mtype; - int j; - int rv = -1; - - for (j = 1; j < MAXCHAN; j++) { - rlen = sizeof(rData); - iData[0] = (uchar)j; /*channel #*/ - memset(rData,0,9); /*initialize recv data*/ - ret = ipmi_cmd(GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug); - if (rv != 0) rv = ret; - if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */ - continue; - if (ret != 0) { - if (fdebug) printf("get_chan_info rc = %x\n",ret); - break; - } - mtype = rData[1]; /* channel medium type */ - switch(mtype) { - case 4: printf("channel[%d] type = lan\n",j); break; /*802.3 LAN type*/ - case 5: printf("channel[%d] type = serial\n",j); break; - case 7: printf("channel[%d] type = pci_smbus\n",j); break; - case 12: printf("channel[%d] type = system_interface\n",j); break; - default: printf("channel[%d] type = other %d\n",j,mtype); break; - } - rv = 0; - } /*end for j*/ - return(rv); + int ret, rlen; + uchar iData[2]; + uchar rData[10]; + uchar cc, mtype; + int j; + int rv = -1; + + for (j = 1; j < MAXCHAN; j++) { + rlen = sizeof (rData); + iData[0] = (uchar) j; /*channel # */ + memset (rData, 0, 9); /*initialize recv data */ + ret = ipmi_cmd (GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug); + if (rv != 0) + rv = ret; + if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */ + continue; + if (ret != 0) { + if (fdebug) + printf ("get_chan_info rc = %x\n", ret); + break; + } + mtype = rData[1]; /* channel medium type */ + switch (mtype) { + case 4: + printf ("channel[%d] type = lan\n", j); + break; /*802.3 LAN type */ + case 5: + printf ("channel[%d] type = serial\n", j); + break; + case 7: + printf ("channel[%d] type = pci_smbus\n", j); + break; + case 12: + printf ("channel[%d] type = system_interface\n", j); + break; + default: + printf ("channel[%d] type = other %d\n", j, mtype); + break; + } + rv = 0; + } /*end for j */ + return (rv); } /* @@ -2170,95 +2380,118 @@ int show_channels(void) * if no lan channels found, returns -2. * if other error, returns -1. */ -int GetBmcEthDevice(uchar lan_parm) +int +GetBmcEthDevice (uchar lan_parm, uchar * pchan) { - LAN_RECORD LanRecord; - int devnum = -1; - int ret; - uchar bmcMacAddress[ MAC_LEN ]; /*MAC_LEN = 6*/ - int rlen; - uchar iData[2]; - uchar rData[10]; - uchar cc; - int i = 0; - int j, jstart, jend, jlan; - uchar mtype; - uchar *pb; - int fchgmac; - // int found = 0; - - /* Find the LAN channel(s) via Channel Info */ - if (lan_parm < MAXCHAN) { /* try user-specified channel only */ - lan_ch = lan_parm; - jstart = lan_parm; - jend = lan_parm+1; - } else { - jstart = 1; - jend = MAXCHAN; - } - memset(bmcMacAddress,0xff,sizeof(bmcMacAddress)); /*initialize to invalid*/ - for (j = jstart; j < jend; j++) { - rlen = sizeof(rData); - iData[0] = (uchar)j; /*channel #*/ - memset(rData,0,9); /*initialize recv data*/ - ret = ipmi_cmd(GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug); - if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */ - continue; - if (ret != 0) { - if (fdebug) printf("get_chan_info rc = %x\n",ret); - break; - } - mtype = rData[1]; /* channel medium type */ - if (mtype == 4) { /* 802.3 LAN type*/ - if (fdebug) printf("chan[%d] = lan\n",j); - jlan = lan_ch; /*save prev lan chan */ - /* Get BMC MAC for this LAN channel. */ - /* Note: BMC MAC may not be valid yet. */ - lan_ch = (uchar)j; /*set lan channel for GetLanEntry*/ - ret = GetLanEntry( 5 /*MAC_ADDRESS_LAN_PARAM*/,0, &LanRecord); - if ( ret != 0 ) { - lan_ch = (uchar)jlan; /*restore lan_ch*/ - printf( "GetBmcEthDevice: GetLanEntry failed\n" ); - return devnum; - } else { - pb = &LanRecord.data[0]; - if (fdebug) printf("chan[%d] BMC MAC %x:%x:%x:%x:%x:%x\n",j, - pb[0], pb[1], pb[2], pb[3], pb[4], pb[5] ); - fchgmac = 0; - /* use the lowest valid lan channel MAC address */ - if (!MacIsValid(bmcMacAddress)) /* old MAC not valid*/ - fchgmac = 1; - else if (MacIsValid(pb) && /* new MAC is valid and*/ - (memcmp(bmcMacAddress,pb, sizeof(bmcMacAddress)) > 0)) - fchgmac = 1; /* new MAC lower */ - /* if no -L 3 and this is gcm, do not pick it. */ - if ((j == gcm_ch) && (lan_parm == PARM_INIT)) - fchgmac = 0; - if (fchgmac) { /* pick this channel & MAC */ - memcpy(bmcMacAddress,pb,sizeof(bmcMacAddress)); - lan_ch = (uchar)j; - } else lan_ch = (uchar)jlan; /*restore prev lan chan*/ - } - i++; /* i = num lan channels found */ - } else if (mtype == 5) { /* serial type*/ - if (fdebug) printf("chan[%d] = serial\n",j); - ser_ch = (uchar)j; /* set to last serial channel */ - } else if (mtype == 7) { /* PCI SMBus */ - if (fdebug) printf("chan[%d] = pci_smbus\n",j); - } else if (mtype == 12) { /* system interface */ - if (fdebug) printf("chan[%d] = system_interface\n",j); - } else /* other channel medium types, see IPMI 1.5 Table 6-3 */ - if (fdebug) printf("chan[%d] = %d\n",j,mtype); - } - if (i == 0) return(-2); /* no lan channels found */ - if (fdebug) printf("lan_ch detected = %d\n",lan_ch); - - /* This will work if the BMC MAC is shared with the OS */ - /* Otherwise, wait until we get the eth dev from the gateway below */ - devnum = FindEthNum(bmcMacAddress); - if ( fdebug ) - printf("GetBmcEthDevice: channel %d, %s%d\n",lan_ch,ifpattn,devnum); - return devnum; + LAN_RECORD LanRecord; + int devnum = -1; + int ret; + uchar bmcMacAddress[MAC_LEN]; /*MAC_LEN = 6 */ + int rlen; + uchar iData[2]; + uchar rData[10]; + uchar cc; + int i = 0; + int j, jstart, jend, jlan; + uchar mtype; + uchar *pb; + int fchgmac; + // int found = 0; + + /* Find the LAN channel(s) via Channel Info */ + if (lan_parm < MAXCHAN) { /* try user-specified channel only */ + lan_ch = lan_parm; + jstart = lan_parm; + jend = lan_parm + 1; + } + else { + jstart = 1; + jend = MAXCHAN; + } + memset (bmcMacAddress, 0xff, sizeof (bmcMacAddress)); /*initialize to invalid */ + for (j = jstart; j < jend; j++) { + rlen = sizeof (rData); + iData[0] = (uchar) j; /*channel # */ + memset (rData, 0, 9); /*initialize recv data */ + ret = ipmi_cmd (GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug); + if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */ + continue; + if (ret != 0) { + if (fdebug) + printf ("get_chan_info rc = %x\n", ret); + break; + } + mtype = rData[1]; /* channel medium type */ + if (mtype == 4) { /* 802.3 LAN type */ + if (fdebug) + printf ("chan[%d] = lan\n", j); + jlan = lan_ch; /*save prev lan chan */ + /* Get BMC MAC for this LAN channel. */ + /* Note: BMC MAC may not be valid yet. */ + lan_ch = (uchar) j; /*set lan channel for GetLanEntry */ + ret = GetLanEntry (5 /*MAC_ADDRESS_LAN_PARAM */ , 0, &LanRecord); + if (ret != 0) { + lan_ch = (uchar) jlan; /*restore lan_ch */ + printf ("GetBmcEthDevice: GetLanEntry failed\n"); + return devnum; + } + else { + pb = &LanRecord.data[0]; + if (fdebug) + printf ("chan[%d] BMC MAC %x:%x:%x:%x:%x:%x\n", j, + pb[0], pb[1], pb[2], pb[3], pb[4], pb[5]); + fchgmac = 0; + /* use the lowest valid lan channel MAC address */ + if (!MacIsValid (bmcMacAddress)) /* old MAC not valid */ + fchgmac = 1; + else if (MacIsValid (pb) && /* new MAC is valid and */ + (memcmp (bmcMacAddress, pb, sizeof (bmcMacAddress)) > 0)) + fchgmac = 1; /* new MAC lower */ + /* if no -L 3 and this is gcm, do not pick it. */ + if ((j == gcm_ch) && (lan_parm == PARM_INIT)) + fchgmac = 0; + if (fchgmac) { /* pick this channel & MAC */ + memcpy (bmcMacAddress, pb, sizeof (bmcMacAddress)); + lan_ch = (uchar) j; + } + else + lan_ch = (uchar) jlan; /*restore prev lan chan */ + } + i++; /* i = num lan channels found */ + } + else if (mtype == 5) { /* serial type */ + if (fdebug) + printf ("chan[%d] = serial\n", j); + ser_ch = (uchar) j; /* set to last serial channel */ + } + else if (mtype == 7) { /* PCI SMBus */ + if (fdebug) + printf ("chan[%d] = pci_smbus\n", j); + } + else if (mtype == 12) { /* system interface */ + if (fdebug) + printf ("chan[%d] = system_interface\n", j); + } + else if (mtype == 1) { /* IPMB */ + if (fdebug) + printf ("chan[%d] = IPMB\n", j); + } + else /* other channel medium types, see IPMI 1.5 Table 6-3 */ if (fdebug) + printf ("chan[%d] = %d\n", j, mtype); + } + if (i == 0) + return (-2); /* no lan channels found */ + if (fdebug) + printf ("lan_ch detected = %d\n", lan_ch); + + /* This will work if the BMC MAC is shared with the OS */ + /* Otherwise, wait until we get the eth dev from the gateway below */ + devnum = FindEthNum (bmcMacAddress); + if (fdebug) + printf ("GetBmcEthDevice: channel %d, %s%d\n", lan_ch, ifpattn, devnum); + if (pchan != NULL) + *pchan = lan_ch; + return devnum; } /* file_grep/findmatch - No longer used here, see ievents.c */ @@ -2270,385 +2503,419 @@ int GetBmcEthDevice(uchar lan_parm) * It uses ARP cache to do this. */ #if defined(WIN32) -int Get_Mac(uchar *ipadr,uchar *macadr, char *nodname) +int +Get_Mac (uchar * ipadr, uchar * macadr, char *nodname) { - DWORD dwRetVal; - IPAddr DestIp = 0; - IPAddr SrcIp = 0; /* default for src ip */ - ULONG MacAddr[2]; /* for 6-byte hardware addresses */ - ULONG PhysAddrLen = MAC_LEN; /* default to length of six bytes */ - BYTE *bPhysAddr; - - if (!IpIsValid(ipadr)) { - if (fdebug) printf("Get_Mac: invalid IP addr\n"); - return 1; /*error*/ - } - memcpy(&DestIp, ipadr, 4); - - /* invoke system ARP query */ - dwRetVal = SendARP(DestIp, SrcIp, MacAddr, &PhysAddrLen); - - if (dwRetVal == NO_ERROR) - { /* no error - get the MAC */ - bPhysAddr = (BYTE *) & MacAddr; - if (PhysAddrLen) { - memcpy(macadr, bPhysAddr, MAC_LEN); - } else - printf("Warning: SendArp completed successfully, but returned length=0\n"); - } else if (dwRetVal == ERROR_GEN_FAILURE) - { /* MAC not available in this network - get gateway MAC */ - memcpy(macadr, rggwymac, MAC_LEN); - } else - { /* other errors */ - printf("Error: SendArp failed with error: %d", dwRetVal); - switch (dwRetVal) { - case ERROR_INVALID_PARAMETER: - printf(" (ERROR_INVALID_PARAMETER)\n"); - break; - case ERROR_INVALID_USER_BUFFER: - printf(" (ERROR_INVALID_USER_BUFFER)\n"); - break; - case ERROR_BAD_NET_NAME: - printf(" (ERROR_GEN_FAILURE)\n"); - break; - case ERROR_BUFFER_OVERFLOW: - printf(" (ERROR_BUFFER_OVERFLOW)\n"); - break; - case ERROR_NOT_FOUND: - printf(" (ERROR_NOT_FOUND)\n"); - break; - default: - printf("\n"); - break; - } - return 1; + DWORD dwRetVal; + IPAddr DestIp = 0; + IPAddr SrcIp = 0; /* default for src ip */ + ULONG MacAddr[2]; /* for 6-byte hardware addresses */ + ULONG PhysAddrLen = MAC_LEN; /* default to length of six bytes */ + BYTE *bPhysAddr; + + if (!IpIsValid (ipadr)) { + if (fdebug) + printf ("Get_Mac: invalid IP addr\n"); + return 1; /*error */ + } + memcpy (&DestIp, ipadr, 4); + + /* invoke system ARP query */ + dwRetVal = SendARP (DestIp, SrcIp, MacAddr, &PhysAddrLen); + + if (dwRetVal == NO_ERROR) { /* no error - get the MAC */ + bPhysAddr = (BYTE *) & MacAddr; + if (PhysAddrLen) { + memcpy (macadr, bPhysAddr, MAC_LEN); } - return 0; -} /* end Get_Mac() for WIN32*/ + else + printf + ("Warning: SendArp completed successfully, but returned length=0\n"); + } + else if (dwRetVal == ERROR_GEN_FAILURE) { /* MAC not available in this network - get gateway MAC */ + memcpy (macadr, rggwymac, MAC_LEN); + } + else { /* other errors */ + printf ("Error: SendArp failed with error: %d", dwRetVal); + switch (dwRetVal) { + case ERROR_INVALID_PARAMETER: + printf (" (ERROR_INVALID_PARAMETER)\n"); + break; + case ERROR_INVALID_USER_BUFFER: + printf (" (ERROR_INVALID_USER_BUFFER)\n"); + break; + case ERROR_BAD_NET_NAME: + printf (" (ERROR_GEN_FAILURE)\n"); + break; + case ERROR_BUFFER_OVERFLOW: + printf (" (ERROR_BUFFER_OVERFLOW)\n"); + break; + case ERROR_NOT_FOUND: + printf (" (ERROR_NOT_FOUND)\n"); + break; + default: + printf ("\n"); + break; + } + return 1; + } + return 0; +} /* end Get_Mac() for WIN32 */ #elif defined(SOLARIS) -int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename) +int +Get_Mac (uchar * ipadr, uchar * macadr, char *nodename) { - FILE *fparp; - char buff[1024]; - /* char arpfile[] = "/proc/net/arp"; */ - char alertfile[] = "/tmp/dest.arping"; - char arping_cmd[128]; - char *pb, *pm; - int num, i; - int foundit = 0; - int ret = 0; - - if (IpIsValid(ipadr)) { /* if valid IP address */ - sprintf(arping_cmd, - "ping %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n", - ipadr[0],ipadr[1],ipadr[2],ipadr[3], - ipadr[0],ipadr[1],ipadr[2],ipadr[3], alertfile); - } else if (nodename != NULL) { /*if valid nodename */ - sprintf(arping_cmd, - "ping %s >/dev/null; arp -a |grep %s >%s\n", - nodename,nodename,alertfile); - } else ret = -1; - - if (ret == 0) { /* if valid IP address */ - /* make sure the destination is in the arp cache */ - if (fdebug) printf("%s", arping_cmd); - system(arping_cmd); - - fparp = fopen(alertfile,"r"); - if (fparp == NULL) { - fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n", - alertfile,get_errno()); - ret = -1; - } else { - /* sample output: */ - /* e1000g0 cooper9 255.255.255.255 o 00:07:e9:06:55:c8 */ - while (fgets(buff, 1023, fparp)) { - /* should only run through loop once */ - num = strcspn(buff," \t"); /* skip 1st word ("e1000g0") */ - i = strspn(&buff[num]," \t"); /* skip whitespace */ - pb = &buff[num+i]; - num = strcspn(pb," \t"); /* skip 2nd word (nodename/IP) */ - i = strspn(&pb[num]," \t"); /* skip whitespace */ - pb += (num+i); - pm = &pb[25]; /* Now pb[25] has the MAC address */ - { /*validate new address?*/ - if (fdebug) printf("Get_Mac: mac=%s\n",pm); - foundit = 1; - if (!MacIsValid(macadr)) atomac(macadr,pm); - break; - } - } /*end while*/ - fclose(fparp); - } /*end else file opened*/ - } /*endif valid IP */ - - if (foundit == 0) { /* no errors, but no mac reply */ - if (MacIsValid(rggwymac) && !MacIsValid(macadr)) - /* this is useful if the ipadr is not in the local subnet */ - memcpy(macadr,rggwymac,6); /* get to it from the default gateway */ - } - return(ret); -} /*end Get_Mac for Solaris*/ + FILE *fparp; + char buff[1024]; + /* char arpfile[] = "/proc/net/arp"; */ + char alertfile[] = "/tmp/dest.arping"; + char arping_cmd[128]; + char *pb, *pm; + int num, i; + int foundit = 0; + int ret = 0; + + if (IpIsValid (ipadr)) { /* if valid IP address */ + sprintf (arping_cmd, + "ping %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n", + ipadr[0], ipadr[1], ipadr[2], ipadr[3], + ipadr[0], ipadr[1], ipadr[2], ipadr[3], alertfile); + } + else if (nodename != NULL) { /*if valid nodename */ + sprintf (arping_cmd, + "ping %s >/dev/null; arp -a |grep %s >%s\n", + nodename, nodename, alertfile); + } + else + ret = -1; + + if (ret == 0) { /* if valid IP address */ + /* make sure the destination is in the arp cache */ + if (fdebug) + printf ("%s", arping_cmd); + system (arping_cmd); + + fparp = fopen (alertfile, "r"); + if (fparp == NULL) { + fprintf (stdout, "Get_Mac: Cannot open %s, errno = %d\n", + alertfile, get_errno ()); + ret = -1; + } + else { + /* sample output: */ + /* e1000g0 cooper9 255.255.255.255 o 00:07:e9:06:55:c8 */ + while (fgets (buff, 1023, fparp)) { + /* should only run through loop once */ + num = strcspn (buff, " \t"); /* skip 1st word ("e1000g0") */ + i = strspn (&buff[num], " \t"); /* skip whitespace */ + pb = &buff[num + i]; + num = strcspn (pb, " \t"); /* skip 2nd word (nodename/IP) */ + i = strspn (&pb[num], " \t"); /* skip whitespace */ + pb += (num + i); + pm = &pb[25]; /* Now pb[25] has the MAC address */ + { /*validate new address? */ + if (fdebug) + printf ("Get_Mac: mac=%s\n", pm); + foundit = 1; + if (!MacIsValid (macadr)) + atomac (macadr, pm); + break; + } + } /*end while */ + fclose (fparp); + } /*end else file opened */ + } /*endif valid IP */ + + if (foundit == 0) { /* no errors, but no mac reply */ + if (MacIsValid (rggwymac) && !MacIsValid (macadr)) + /* this is useful if the ipadr is not in the local subnet */ + memcpy (macadr, rggwymac, 6); /* get to it from the default gateway */ + } + return (ret); +} /*end Get_Mac for Solaris */ #elif defined(BSD) -int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename) +int +Get_Mac (uchar * ipadr, uchar * macadr, char *nodename) { - FILE *fparp; - char buff[1024]; - /* char arpfile[] = "/proc/net/arp"; */ - char alertfile[] = "/tmp/dest.arping"; - char arping_cmd[128]; - char *pb, *pm; - int num, i, j; - int foundit = 0; - int ret = 0; - - if (IpIsValid(ipadr)) { /* if valid IP address */ - sprintf(arping_cmd, - "ping -c2 %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n", - ipadr[0],ipadr[1],ipadr[2],ipadr[3], - ipadr[0],ipadr[1],ipadr[2],ipadr[3], alertfile); - } else if (nodename != NULL) { /*if valid nodename */ - sprintf(arping_cmd, - "ping -c2 %s >/dev/null; arp -a |grep %s >%s\n", - nodename,nodename,alertfile); - } else ret = -1; - - if (ret == 0) { /* if valid IP address */ - /* make sure the destination is in the arp cache */ - if (fdebug) printf("%s", arping_cmd); - system(arping_cmd); - - fparp = fopen(alertfile,"r"); - if (fparp == NULL) { - fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n", - alertfile,get_errno()); - ret = -1; - } else { - /* sample output of arp -a -n: */ - /* ? (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */ - /* sample output of arp -a: */ - /* telcoserv (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */ - while (fgets(buff, 1023, fparp)) { - /* should only run through loop once */ - pb = &buff[0]; - for (j = 0; j < 3; j++) { /* skip 3 words */ - num = strcspn(pb," \t"); /* skip jth word */ - i = strspn(&pb[num]," \t"); /* skip whitespace */ - pb += (num+i); - } - pm = &pb[0]; /* Now pb[0] has the MAC address */ - { /* no need to validate new address*/ - if (fdebug) printf("Get_Mac: mac=%s\n",pm); - foundit = 1; - if (!MacIsValid(macadr)) atomac(macadr,pm); - break; - } - } /*end while*/ - fclose(fparp); - } /*end else file opened*/ - } /*endif valid IP */ - - if (foundit == 0) { /* no errors, but no mac reply */ - if (MacIsValid(rggwymac) && !MacIsValid(macadr)) - /* this is useful if the ipadr is not in the local subnet */ - memcpy(macadr,rggwymac,6); /* get to it from the default gateway */ - } - return(ret); -} /*end Get_Mac for BSD */ + FILE *fparp; + char buff[1024]; + /* char arpfile[] = "/proc/net/arp"; */ + char alertfile[] = "/tmp/dest.arping"; + char arping_cmd[128]; + char *pb, *pm; + int num, i, j; + int foundit = 0; + int ret = 0; + + if (IpIsValid (ipadr)) { /* if valid IP address */ + sprintf (arping_cmd, + "ping -c2 %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n", + ipadr[0], ipadr[1], ipadr[2], ipadr[3], + ipadr[0], ipadr[1], ipadr[2], ipadr[3], alertfile); + } + else if (nodename != NULL) { /*if valid nodename */ + sprintf (arping_cmd, + "ping -c2 %s >/dev/null; arp -a |grep %s >%s\n", + nodename, nodename, alertfile); + } + else + ret = -1; + + if (ret == 0) { /* if valid IP address */ + /* make sure the destination is in the arp cache */ + if (fdebug) + printf ("%s", arping_cmd); + system (arping_cmd); + + fparp = fopen (alertfile, "r"); + if (fparp == NULL) { + fprintf (stdout, "Get_Mac: Cannot open %s, errno = %d\n", + alertfile, get_errno ()); + ret = -1; + } + else { + /* sample output of arp -a -n: */ + /* ? (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */ + /* sample output of arp -a: */ + /* telcoserv (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */ + while (fgets (buff, 1023, fparp)) { + /* should only run through loop once */ + pb = &buff[0]; + for (j = 0; j < 3; j++) { /* skip 3 words */ + num = strcspn (pb, " \t"); /* skip jth word */ + i = strspn (&pb[num], " \t"); /* skip whitespace */ + pb += (num + i); + } + pm = &pb[0]; /* Now pb[0] has the MAC address */ + { /* no need to validate new address */ + if (fdebug) + printf ("Get_Mac: mac=%s\n", pm); + foundit = 1; + if (!MacIsValid (macadr)) + atomac (macadr, pm); + break; + } + } /*end while */ + fclose (fparp); + } /*end else file opened */ + } /*endif valid IP */ + + if (foundit == 0) { /* no errors, but no mac reply */ + if (MacIsValid (rggwymac) && !MacIsValid (macadr)) + /* this is useful if the ipadr is not in the local subnet */ + memcpy (macadr, rggwymac, 6); /* get to it from the default gateway */ + } + return (ret); +} /*end Get_Mac for BSD */ #else -int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename) -{ /* Get_Mac for Linux */ - FILE *fparp; - char buff[1024]; - /* char arpfile[] = "/proc/net/arp"; */ - char alertfile[] = "/tmp/dest.arping"; - char arping_cmd[128]; - char *pb, *pm, *px; - int num, i; - int foundit = 0; - int ret = 0; - char *_ifname; - - if (strcmp(ifname,"gcm") == 0) _ifname = ifname0; /*see gcm_ch instead*/ - else _ifname = ifname; - - /* Get a MAC address for a given IP address or nodename */ - if (IpIsValid(ipadr)) { /* if valid IP address */ - sprintf(arping_cmd, - "arping -I %s -c 2 %d.%d.%d.%d |grep reply |tail -n1 >%s\n", - _ifname,ipadr[0],ipadr[1],ipadr[2],ipadr[3],alertfile); - } else if (nodename != NULL) { /*if valid nodename */ - sprintf(arping_cmd, - "arping -I %s -c 2 %s |grep reply |tail -n1 >%s\n", - _ifname,nodename,alertfile); - } else ret = -1; - - if (ret == 0) { /* if valid IP address */ - /* make sure the destination is in the arp cache */ - if (fdebug) printf("%s", arping_cmd); - ret = system(arping_cmd); - - fparp = fopen(alertfile,"r"); - if (fparp == NULL) { - fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n", - alertfile,get_errno()); - ret = -1; - } else { - ret = 0; - while (fgets(buff, 1023, fparp)) { - /* should only run through loop once */ - num = strcspn(buff," \t"); /* skip 1st word ("Unicast") */ - i = strspn(&buff[num]," \t"); - pb = &buff[num+i]; - if (strncmp(pb,"reply",5) == 0) { /* valid output */ - /* Find the ip address */ - pb += 6 + 5; /* skip "reply from " */ - num = strcspn(pb," \t"); - pb[num] = 0; - if (fdebug) printf("Get_Mac: ip=%s\n",pb); - /* IP address should already match input param */ - if (!IpIsValid(ipadr)) /* had nodname only*/ - atoip(ipadr,pb); /* fill in ipadr */ - /* Now find the mac address */ - pm = strchr(&pb[num+1],'['); - if (pm == NULL) pm = &pb[num+2]; /* just in case */ - pm++; - px = strchr(pm,']'); - if (px == NULL) px = pm + 17; /* just in case */ - px[0] = 0; - if (fdebug) printf("Get_Mac: mac=%s\n",pm); - foundit = 1; - if (!MacIsValid(macadr)) atomac(macadr,pm); - break; - } - } /*end while*/ - fclose(fparp); - } /*end else file opened*/ - } /*endif valid IP */ - - if (foundit == 0) { /* no errors, but no mac reply */ - if (MacIsValid(rggwymac) && !MacIsValid(macadr)) - /* this is useful if the ipadr is not in the local subnet */ - memcpy(macadr,rggwymac,6); /* get to it from the default gateway */ - } - return(ret); -} /* end Get_Mac() for Linux*/ +int +Get_Mac (uchar * ipadr, uchar * macadr, char *nodename) +{ /* Get_Mac for Linux */ + FILE *fparp; + char buff[1024]; + /* char arpfile[] = "/proc/net/arp"; */ + char alertfile[] = "/tmp/dest.arping"; + char arping_cmd[128]; + char *pb, *pm, *px; + int num, i; + int foundit = 0; + int ret = 0; + char *_ifname; + + if (strcmp (ifname, "gcm") == 0) + _ifname = ifname0; /*see gcm_ch instead */ + else + _ifname = ifname; + + /* Get a MAC address for a given IP address or nodename */ + if (IpIsValid (ipadr)) { /* if valid IP address */ + sprintf (arping_cmd, + "arping -I %s -c 2 %d.%d.%d.%d |grep reply |tail -n1 >%s\n", + _ifname, ipadr[0], ipadr[1], ipadr[2], ipadr[3], alertfile); + } + else if (nodename != NULL) { /*if valid nodename */ + sprintf (arping_cmd, + "arping -I %s -c 2 %s |grep reply |tail -n1 >%s\n", + _ifname, nodename, alertfile); + } + else + ret = -1; + + if (ret == 0) { /* if valid IP address */ + /* make sure the destination is in the arp cache */ + if (fdebug) + printf ("%s", arping_cmd); + ret = system (arping_cmd); + + fparp = fopen (alertfile, "r"); + if (fparp == NULL) { + fprintf (stdout, "Get_Mac: Cannot open %s, errno = %d\n", + alertfile, get_errno ()); + ret = -1; + } + else { + ret = 0; + while (fgets (buff, 1023, fparp)) { + /* should only run through loop once */ + num = strcspn (buff, " \t"); /* skip 1st word ("Unicast") */ + i = strspn (&buff[num], " \t"); + pb = &buff[num + i]; + if (strncmp (pb, "reply", 5) == 0) { /* valid output */ + /* Find the ip address */ + pb += 6 + 5; /* skip "reply from " */ + num = strcspn (pb, " \t"); + pb[num] = 0; + if (fdebug) + printf ("Get_Mac: ip=%s\n", pb); + /* IP address should already match input param */ + if (!IpIsValid (ipadr)) /* had nodname only */ + atoip (ipadr, pb); /* fill in ipadr */ + /* Now find the mac address */ + pm = strchr (&pb[num + 1], '['); + if (pm == NULL) + pm = &pb[num + 2]; /* just in case */ + pm++; + px = strchr (pm, ']'); + if (px == NULL) + px = pm + 17; /* just in case */ + px[0] = 0; + if (fdebug) + printf ("Get_Mac: mac=%s\n", pm); + foundit = 1; + if (!MacIsValid (macadr)) + atomac (macadr, pm); + break; + } + } /*end while */ + fclose (fparp); + } /*end else file opened */ + } /*endif valid IP */ + + if (foundit == 0) { /* no errors, but no mac reply */ + if (MacIsValid (rggwymac) && !MacIsValid (macadr)) + /* this is useful if the ipadr is not in the local subnet */ + memcpy (macadr, rggwymac, 6); /* get to it from the default gateway */ + } + return (ret); +} /* end Get_Mac() for Linux */ #endif #ifdef WIN32 /* * Set subnet mask based on current IP address (Windows). */ -int SetSubnetMask() { - PMIB_IPADDRTABLE pIPAddrTable; - unsigned int i; - DWORD dwSize = 0, dwRetVal; - LPVOID lpMsgBuf; - - pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof( MIB_IPADDRTABLE) ); - - if ( pIPAddrTable ) { - // Make an initial call to GetIpAddrTable to get the - // necessary size into the dwSize variable - if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { - free( pIPAddrTable ); - pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize ); - } - } else - printf("Memory allocation failed.\n"); - - if ( pIPAddrTable ) { - // Make a second call to GetIpAddrTable to get the - // actual data we want - if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) == NO_ERROR ) { - for(i = 0; i < pIPAddrTable->dwNumEntries; ++i) { - if(memcmp(&(pIPAddrTable->table[i].dwAddr), rgmyip, 4) == 0) { - memcpy(rgsubnet, &(pIPAddrTable->table[i].dwMask), 4); - free( pIPAddrTable ); - return 1; - } - } - } else { - if (FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - dwRetVal, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL )) { - printf("\tError: %s", lpMsgBuf); - } - - printf("Call to GetIpAddrTable failed.\n"); - } - } - - if ( pIPAddrTable ) - free( pIPAddrTable ); +int +SetSubnetMask () +{ + PMIB_IPADDRTABLE pIPAddrTable; + unsigned int i; + DWORD dwSize = 0, dwRetVal; + LPVOID lpMsgBuf; + + pIPAddrTable = (MIB_IPADDRTABLE *) malloc (sizeof (MIB_IPADDRTABLE)); + + if (pIPAddrTable) { + // Make an initial call to GetIpAddrTable to get the + // necessary size into the dwSize variable + if (GetIpAddrTable (pIPAddrTable, &dwSize, 0) == + ERROR_INSUFFICIENT_BUFFER) { + free (pIPAddrTable); + pIPAddrTable = (MIB_IPADDRTABLE *) malloc (dwSize); + } + } + else + printf ("Memory allocation failed.\n"); + + if (pIPAddrTable) { + // Make a second call to GetIpAddrTable to get the + // actual data we want + if ((dwRetVal = GetIpAddrTable (pIPAddrTable, &dwSize, 0)) == NO_ERROR) { + for (i = 0; i < pIPAddrTable->dwNumEntries; ++i) { + if (memcmp (&(pIPAddrTable->table[i].dwAddr), rgmyip, 4) == 0) { + memcpy (rgsubnet, &(pIPAddrTable->table[i].dwMask), 4); + free (pIPAddrTable); + return 1; + } + } + } + else { + if (FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) & lpMsgBuf, 0, NULL)) { + printf ("\tError: %s", lpMsgBuf); + } - return 0; + printf ("Call to GetIpAddrTable failed.\n"); + } + } + + if (pIPAddrTable) + free (pIPAddrTable); + + return 0; } /* * Extract gateway address from routing table (Windows). */ -int SetDefaultGateway() { - PMIB_IPFORWARDTABLE pIpForwardTable; - DWORD dwRetVal, dwSize; +int +SetDefaultGateway () +{ + PMIB_IPFORWARDTABLE pIpForwardTable; + DWORD dwRetVal, dwSize; - unsigned int nord_mask; - unsigned int nord_ip; - unsigned int nord_net; + unsigned int nord_mask; + unsigned int nord_ip; + unsigned int nord_net; - unsigned int i; + unsigned int i; - nord_mask = *((unsigned int *)rgsubnet); - nord_ip = *((unsigned int *)rgmyip); + nord_mask = *((unsigned int *) rgsubnet); + nord_ip = *((unsigned int *) rgmyip); - nord_net = nord_ip & nord_mask; + nord_net = nord_ip & nord_mask; - pIpForwardTable = (MIB_IPFORWARDTABLE*) malloc(sizeof(MIB_IPFORWARDTABLE)); + pIpForwardTable = + (MIB_IPFORWARDTABLE *) malloc (sizeof (MIB_IPFORWARDTABLE)); + if (pIpForwardTable == NULL) { + printf ("Error allocating memory\n"); + return 0; + } + + dwSize = 0; + if (GetIpForwardTable (pIpForwardTable, &dwSize, 0) == + ERROR_INSUFFICIENT_BUFFER) { + free (pIpForwardTable); + pIpForwardTable = (MIB_IPFORWARDTABLE *) malloc (dwSize); if (pIpForwardTable == NULL) { - printf("Error allocating memory\n"); - return 0; - } - - dwSize = 0; - if (GetIpForwardTable(pIpForwardTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { - free(pIpForwardTable); - pIpForwardTable = (MIB_IPFORWARDTABLE*) malloc(dwSize); - if (pIpForwardTable == NULL) { - printf("Error allocating memory\n"); - return 0; - } - } - - /* - * Note that the IPv4 addresses returned in - * GetIpForwardTable entries are in network byte order - */ - if ((dwRetVal = GetIpForwardTable(pIpForwardTable, &dwSize, 0)) == NO_ERROR) { - for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) { - unsigned int gwaddr = pIpForwardTable->table[i].dwForwardNextHop; - if(nord_net == (gwaddr & nord_mask) && nord_ip != gwaddr) - { /* searching for gateways from our network with different address than ours */ - memcpy(rggwyip, &gwaddr, 4); - return 0; - } - } - free(pIpForwardTable); - return 1; + printf ("Error allocating memory\n"); + return 0; } - else { - printf("\tGetIpForwardTable failed.\n"); - free(pIpForwardTable); - return 0; + } + + /* + * Note that the IPv4 addresses returned in + * GetIpForwardTable entries are in network byte order + */ + if ((dwRetVal = + GetIpForwardTable (pIpForwardTable, &dwSize, 0)) == NO_ERROR) { + for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) { + unsigned int gwaddr = pIpForwardTable->table[i].dwForwardNextHop; + if (nord_net == (gwaddr & nord_mask) && nord_ip != gwaddr) { /* searching for gateways from our network with different address than ours */ + memcpy (rggwyip, &gwaddr, 4); + return 0; + } } - + free (pIpForwardTable); + return 1; + } + else { + printf ("\tGetIpForwardTable failed.\n"); + free (pIpForwardTable); + return 0; + } + } + /*endif WIN32*/ #endif @@ -2664,732 +2931,827 @@ int SetDefaultGateway() { * SuSE SLES 9: /etc/snmpd.conf */ #ifdef WIN32 -int Get_IPMac_Addr() -{ /*for Windows*/ - char ipstr[] = "IP Address"; - char macstr[] = "Physical Address"; - char gwystr[] = "Default Gateway"; - char substr[] = "Subnet Mask"; - int found = 0; - char fgetmac; - - if (IpIsValid(rgmyip)) - { /* user-specified ip, get mac */ - if (fdebug) printf("User IP was specified\n"); - if (!MacIsValid(rgmymac)) - { /* no user-specified MAC, get it from IP */ - if (fdebug) printf("No user MAC specified\n"); - if(!GetLocalMACByIP()) - { /* couldn't get MAC from IP, get old one */ - if (fdebug) printf("No MAC from IP, use old\n"); - if(IpIsValid(bmcmyip) && MacIsValid(bmcmymac)) - { - printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - bmcmymac[0], bmcmymac[1], - bmcmymac[2], bmcmymac[3], - bmcmymac[4], bmcmymac[5]); - memcpy(rgmymac,bmcmymac,MAC_LEN); - } else { - printf("Failed to obtain valid MAC\n"); - } - } else { - printf("Using adapter MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - rgmymac[0], rgmymac[1], - rgmymac[2], rgmymac[3], - rgmymac[4], rgmymac[5]); - } - } else { /* user MAC available */ - printf("Using user MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - rgmymac[0], rgmymac[1], - rgmymac[2], rgmymac[3], - rgmymac[4], rgmymac[5]); - } - } else { /* no user-specified IP */ - if (fdebug) printf("No user IP specified\n"); - if (!MacIsValid(rgmymac)) - { /* no user-specified MAC, get it from interface */ - if(!GetLocalDataByIface()) - { /* use existing MAC an IP */ - printf("Using current BMC IP %d.%d.%d.%d\n", - bmcmyip[0], bmcmyip[1], - bmcmyip[2], bmcmyip[3]); - memcpy(rgmyip,bmcmyip,4); - printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - bmcmymac[0], bmcmymac[1], - bmcmymac[2], bmcmymac[3], - bmcmymac[4], bmcmymac[5]); - memcpy(rgmymac,bmcmymac,MAC_LEN); - - } - } else { /* user-specified MAC */ - if(!GetLocalIPByMAC(rgmymac)) - { /* use existing MAC and IP */ - printf("Using current BMC IP %d.%d.%d.%d\n", - bmcmyip[0], bmcmyip[1], - bmcmyip[2], bmcmyip[3]); - memcpy(rgmyip,bmcmyip,4); - printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - bmcmymac[0], bmcmymac[1], - bmcmymac[2], bmcmymac[3], - bmcmymac[4], bmcmymac[5]); - memcpy(rgmymac,bmcmymac,MAC_LEN); - } - } - } - - if (rghostname[0] == 0) { /*hostname not specified*/ - if (!fipmilan) - gethostname(rghostname,sizeof(rghostname)); - } - if (fdebug) /* show the local OS eth if and MAC */ - printf("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n", - ifname, osmyip[0],osmyip[1],osmyip[2],osmyip[3], rghostname, - osmymac[0], osmymac[1], osmymac[2], osmymac[3], - osmymac[4], osmymac[5]); - - if(!SubnetIsValid(rgsubnet)) { - SetSubnetMask(); - } - if (!IpIsValid(rggwyip)) { /* if gwy ip not user-specified */ - SetDefaultGateway(); +int +Get_IPMac_Addr () +{ /*for Windows */ + char ipstr[] = "IP Address"; + char macstr[] = "Physical Address"; + char gwystr[] = "Default Gateway"; + char substr[] = "Subnet Mask"; + int found = 0; + char fgetmac; + + if (IpIsValid (rgmyip)) { /* user-specified ip, get mac */ + if (fdebug) + printf ("User IP was specified\n"); + if (!MacIsValid (rgmymac)) { /* no user-specified MAC, get it from IP */ + if (fdebug) + printf ("No user MAC specified\n"); + if (!GetLocalMACByIP ()) { /* couldn't get MAC from IP, get old one */ + if (fdebug) + printf ("No MAC from IP, use old\n"); + if (IpIsValid (bmcmyip) && MacIsValid (bmcmymac)) { + printf ("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + bmcmymac[0], bmcmymac[1], + bmcmymac[2], bmcmymac[3], bmcmymac[4], bmcmymac[5]); + memcpy (rgmymac, bmcmymac, MAC_LEN); } + else { + printf ("Failed to obtain valid MAC\n"); + } + } + else { + printf ("Using adapter MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + rgmymac[0], rgmymac[1], + rgmymac[2], rgmymac[3], rgmymac[4], rgmymac[5]); + } + } + else { /* user MAC available */ + printf ("Using user MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + rgmymac[0], rgmymac[1], + rgmymac[2], rgmymac[3], rgmymac[4], rgmymac[5]); + } + } + else { /* no user-specified IP */ + if (fdebug) + printf ("No user IP specified\n"); + if (!MacIsValid (rgmymac)) { /* no user-specified MAC, get it from interface */ + if (!GetLocalDataByIface ()) { /* use existing MAC an IP */ + printf ("Using current BMC IP %d.%d.%d.%d\n", + bmcmyip[0], bmcmyip[1], bmcmyip[2], bmcmyip[3]); + memcpy (rgmyip, bmcmyip, 4); + printf ("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + bmcmymac[0], bmcmymac[1], + bmcmymac[2], bmcmymac[3], bmcmymac[4], bmcmymac[5]); + memcpy (rgmymac, bmcmymac, MAC_LEN); - if (lan_ch == gcm_ch) { - if (SubnetIsSame(rgmyip,rggwyip,rgsubnet)) fgetmac = 1; - else fgetmac = 0; - } else fgetmac = 1; + } + } + else { /* user-specified MAC */ + if (!GetLocalIPByMAC (rgmymac)) { /* use existing MAC and IP */ + printf ("Using current BMC IP %d.%d.%d.%d\n", + bmcmyip[0], bmcmyip[1], bmcmyip[2], bmcmyip[3]); + memcpy (rgmyip, bmcmyip, 4); + printf ("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + bmcmymac[0], bmcmymac[1], + bmcmymac[2], bmcmymac[3], bmcmymac[4], bmcmymac[5]); + memcpy (rgmymac, bmcmymac, MAC_LEN); + } + } + } + + if (rghostname[0] == 0) { /*hostname not specified */ + if (!fipmilan) + gethostname (rghostname, sizeof (rghostname)); + } + if (fdebug) /* show the local OS eth if and MAC */ + printf + ("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n", + ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], rghostname, + osmymac[0], osmymac[1], osmymac[2], osmymac[3], osmymac[4], + osmymac[5]); + + if (!SubnetIsValid (rgsubnet)) { + SetSubnetMask (); + } + if (!IpIsValid (rggwyip)) { /* if gwy ip not user-specified */ + SetDefaultGateway (); + } + + if (lan_ch == gcm_ch) { + if (SubnetIsSame (rgmyip, rggwyip, rgsubnet)) + fgetmac = 1; + else + fgetmac = 0; + } + else + fgetmac = 1; - if (fgetmac) { - if (IpIsValid(rggwyip) && !MacIsValid(rggwymac)) /*gwy mac not specified*/ - Get_Mac(rggwyip,rggwymac,NULL); + if (fgetmac) { + if (IpIsValid (rggwyip) && !MacIsValid (rggwymac)) /*gwy mac not specified */ + Get_Mac (rggwyip, rggwymac, NULL); - if (IpIsValid(rggwy2ip) && !MacIsValid(rggwy2mac)) /*gwy2 mac not valid*/ - Get_Mac(rggwy2ip,rggwy2mac,NULL); - } + if (IpIsValid (rggwy2ip) && !MacIsValid (rggwy2mac)) /*gwy2 mac not valid */ + Get_Mac (rggwy2ip, rggwy2mac, NULL); + } - return(0); -} /* end Get_IPMac_Addr for Windows */ + return (0); +} /* end Get_IPMac_Addr for Windows */ #elif defined(HPUX) -int Get_IPMac_Addr() -{ /*for HP-UX*/ - return(-1); +int +Get_IPMac_Addr () +{ /*for HP-UX */ + return (-1); } #else -int Get_IPMac_Addr() -{ /*for Linux*/ -#if defined(SOLARIS) - char rtfile[] = "/tmp/route"; - char snmpfile[] = "/etc/snmp/conf/snmpd.conf"; +int +Get_IPMac_Addr () +{ /*for Linux */ +#if defined(SOLARIS) + char rtfile[] = "/tmp/route"; + char snmpfile[] = "/etc/snmp/conf/snmpd.conf"; #elif defined(BSD) - char rtfile[] = "/tmp/route"; - char snmpfile[] = "/etc/snmpd.config"; + char rtfile[] = "/tmp/route"; + char snmpfile[] = "/etc/snmpd.config"; #else - char rtfile[] = "/proc/net/route"; - char snmpfile[] = "/etc/snmp/snmpd.conf"; + char rtfile[] = "/proc/net/route"; + char snmpfile[] = "/etc/snmp/snmpd.conf"; #endif - // char alertfile[] = "/tmp/alert.arping"; - // FILE *fparp; - FILE *fprt; - int fd = -1; - int skfd; - uchar *pc; - int rc = 0; - int i,j; - uchar bnetadr[4]; - uchar bgateadr[4]; - char gate_addr[128]; - char iface[16]; - char defcommunity[19] = "public"; - char buff[1024]; - char alertname[60]; - int num, nmatch; - struct ifreq ifr; - char *_ifname; - char fgetmac; - - /* Get the IP address and associated MAC address specified. */ - /* Local for ethN; Default Gateway; Alert Destination */ - - /* Get the default gateway IP */ + // char alertfile[] = "/tmp/alert.arping"; + // FILE *fparp; + FILE *fprt; + int fd = -1; + int skfd; + uchar *pc; + int rc = 0; + int i, j; + uchar bnetadr[4]; + uchar bgateadr[4]; + char gate_addr[128]; + char iface[16]; + char defcommunity[19] = "public"; + char buff[1024]; + char alertname[60]; + int num, nmatch; + struct ifreq ifr; + char *_ifname; + char fgetmac; + + /* Get the IP address and associated MAC address specified. */ + /* Local for ethN; Default Gateway; Alert Destination */ + + /* Get the default gateway IP */ #if defined(SOLARIS) || defined(BSD) - char rtcmd[80]; - sprintf(rtcmd,"netstat -r -n |grep default |awk '{ print $2 }' >%s",rtfile); - system(rtcmd); - /* use rtfile output from netstat -r, see also /etc/defaultroute */ - fprt = fopen(rtfile,"r"); - if (fprt == NULL) { - fprintf(stdout,"netstat: Cannot open %s, errno = %d\n",rtfile,get_errno()); - } else { - while (fgets(buff, 1023, fprt)) { - if ((buff[0] > '0') && (buff[0] <= '9')) { /*valid*/ - atoip(bgateadr,buff); - if (fdebug) - printf("default gateway: %s, %d.%d.%d.%d %s\n",buff, - bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3],ifname); - if (!IpIsValid(rggwyip)) /* if not user-specified */ - memcpy(rggwyip,bgateadr,4); - break; - } + char rtcmd[80]; + sprintf (rtcmd, "netstat -r -n |grep default |awk '{ print $2 }' >%s", + rtfile); + system (rtcmd); + /* use rtfile output from netstat -r, see also /etc/defaultroute */ + fprt = fopen (rtfile, "r"); + if (fprt == NULL) { + fprintf (stdout, "netstat: Cannot open %s, errno = %d\n", rtfile, + get_errno ()); + } + else { + while (fgets (buff, 1023, fprt)) { + if ((buff[0] > '0') && (buff[0] <= '9')) { /*valid */ + atoip (bgateadr, buff); + if (fdebug) + printf ("default gateway: %s, %d.%d.%d.%d %s\n", buff, + bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3], ifname); + if (!IpIsValid (rggwyip)) /* if not user-specified */ + memcpy (rggwyip, bgateadr, 4); + break; } - fclose(fprt); - } /*end-else good open */ + } + fclose (fprt); + } /*end-else good open */ #else - /* cat /proc/net/route and save Gwy if Dest == 0 and Gateway != 0 */ - fprt = fopen(rtfile,"r"); - if (fprt == NULL) { - fprintf(stdout,"route: Cannot open %s, errno = %d\n",rtfile,get_errno()); - } else { - char rtfmt[] = "%16s %128s %128s %X %d %d %d %128s %d %d %d\n"; - int iflags, refcnt, use, metric, mss, window, irtt; - char mask_addr[128], net_addr[128]; - uint *pnet; - uint *pgate; - - pnet = (uint *)&bnetadr[0]; - pgate = (uint *)&bgateadr[0]; - while (fgets(buff, 1023, fprt)) { - num = sscanf(buff, rtfmt, - iface, net_addr, gate_addr, - &iflags, &refcnt, &use, &metric, mask_addr, - &mss, &window, &irtt); - if (num < 10 || !(iflags & RTF_UP)) - continue; - - j = 6; - for (i = 0; i < 4; i ++) { - bnetadr[i] = htoi(&net_addr[j]); - bgateadr[i] = htoi(&gate_addr[j]); - j -= 2; - } - if ((*pnet == 0) && (*pgate != 0)) { /* found default gateway */ - if (fdebug) - printf("default gateway: %s, %d.%d.%d.%d %s\n",gate_addr, - bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3],iface); - if (!IpIsValid(rggwyip)) /* if not user-specified */ - memcpy(rggwyip,bgateadr,4); - _ifname = iface; /*use this iface for gwy mac */ - if (!fsetifn) strncpy(ifname,iface,16); - break; - } - } /*end while*/ - fclose(fprt); - } /*end-else good open */ + /* cat /proc/net/route and save Gwy if Dest == 0 and Gateway != 0 */ + fprt = fopen (rtfile, "r"); + if (fprt == NULL) { + fprintf (stdout, "route: Cannot open %s, errno = %d\n", rtfile, + get_errno ()); + } + else { + char rtfmt[] = "%16s %128s %128s %X %d %d %d %128s %d %d %d\n"; + int iflags, refcnt, use, metric, mss, window, irtt; + char mask_addr[128], net_addr[128]; + uint *pnet; + uint *pgate; + + pnet = (uint *) & bnetadr[0]; + pgate = (uint *) & bgateadr[0]; + while (fgets (buff, 1023, fprt)) { + num = sscanf (buff, rtfmt, + iface, net_addr, gate_addr, + &iflags, &refcnt, &use, &metric, mask_addr, + &mss, &window, &irtt); + if (num < 10 || !(iflags & RTF_UP)) + continue; + + j = 6; + for (i = 0; i < 4; i++) { + bnetadr[i] = htoi (&net_addr[j]); + bgateadr[i] = htoi (&gate_addr[j]); + j -= 2; + } + if ((*pnet == 0) && (*pgate != 0)) { /* found default gateway */ + if (fdebug) + printf ("default gateway: %s, %d.%d.%d.%d %s\n", gate_addr, + bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3], iface); + if (!IpIsValid (rggwyip)) /* if not user-specified */ + memcpy (rggwyip, bgateadr, 4); + _ifname = iface; /*use this iface for gwy mac */ + if (!fsetifn) + strncpy (ifname, iface, 16); + break; + } + } /*end while */ + fclose (fprt); + } /*end-else good open */ #endif - /* Create a channel to the NET kernel. */ - if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - perror("socket"); - return(-3); - } - - /* Find a valid local BMC MAC Address */ - if (lan_ch == gcm_ch) { - /* GCM has its own unique mac address */ - if (!MacIsValid(rgmymac)) { - if (MacIsValid(bmcmymac)) { - memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/ - } else { /*error*/ - printf("invalid MAC address for gcm\n"); - } - } /*else use rgmymac if specified*/ - _ifname = iface; /*use the iface from gwy (e.g. eth0) */ - fsharedMAC = 0; /*gcm has separate NIC, separate MAC*/ - - // fd = -1; - fd = skfd; // get_socket_for_af(AF_INET) below; - } else { /*else not gcm*/ - if (!fsetifn && !fethfound) { /*do not have ifname yet*/ - i = FindEthNum(bmcmymac); - if (i >= 0) sprintf(ifname,"%s%d",ifpattn,i); - } - ifr.ifr_addr.sa_family = AF_INET; - if (fdebug) printf("getipmac: ifname=%s\n",ifname); - _ifname = ifname; - strcpy(ifr.ifr_name, _ifname); + /* Create a channel to the NET kernel. */ + if ((skfd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { + perror ("socket"); + return (-3); + } + + /* Find a valid local BMC MAC Address */ + if (lan_ch == gcm_ch) { + /* GCM has its own unique mac address */ + if (!MacIsValid (rgmymac)) { + if (MacIsValid (bmcmymac)) { + memcpy (rgmymac, bmcmymac, MAC_LEN); /*use existing */ + } + else { /*error */ + printf ("invalid MAC address for gcm\n"); + } + } /*else use rgmymac if specified */ + _ifname = iface; /*use the iface from gwy (e.g. eth0) */ + fsharedMAC = 0; /*gcm has separate NIC, separate MAC */ + + // fd = -1; + fd = skfd; // get_socket_for_af(AF_INET) below; + } + else { /*else not gcm */ + if (!fsetifn && !fethfound) { /*do not have ifname yet */ + i = FindEthNum (bmcmymac); + if (i >= 0) + sprintf (ifname, "%s%d", ifpattn, i); + } + ifr.ifr_addr.sa_family = AF_INET; + if (fdebug) + printf ("getipmac: ifname=%s\n", ifname); + _ifname = ifname; + strcpy (ifr.ifr_name, _ifname); #ifdef SIOCGIFHWADDR - /* Get the local if HWADDR (MAC Address) from OS */ - if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) { - if (fdebug) - printf("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n",_ifname,get_errno()); - } else memcpy(osmymac,get_ifreq_mac(&ifr),MAC_LEN); /*OS mac*/ + /* Get the local if HWADDR (MAC Address) from OS */ + if (ioctl (skfd, SIOCGIFHWADDR, &ifr) < 0) { + if (fdebug) + printf ("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n", _ifname, + get_errno ()); + } + else + memcpy (osmymac, get_ifreq_mac (&ifr), MAC_LEN); /*OS mac */ #endif - - if (memcmp(bmcmymac,osmymac,MAC_LEN) == 0) { - /* osmymac and ifname were set above by FindEthNum */ - printf("\tBMC shares IP/MAC with OS NIC %s\n",_ifname); - fsharedMAC = 1; - } /* else fsharedMAC = 0; */ - - if (fsharedMAC == 0) { /* then BMC has separate MAC */ - if (!MacIsValid(rgmymac) && MacIsValid(bmcmymac)) - memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/ - } else { /* else OS & BMC share a MAC */ - /* Use the local if HWADDR (MAC Address) from OS */ - if (!MacIsValid(rgmymac)) { /* if not user-specified */ - if (MacIsValid(bmcmymac)) - memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/ - else memcpy(rgmymac,osmymac,MAC_LEN); /*use OS mac*/ - } - } - fd = skfd; // get_socket_for_af(AF_INET) below; - } - - if (fd >= 0) { /* if valid fd, find OS IP */ - strcpy(ifr.ifr_name, _ifname); - ifr.ifr_addr.sa_family = AF_INET; - /* Get the IFADDR (IP Address) from OS */ - if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { - int err; - err = get_errno(); - /* errno 99 here means that eth0 is not enabled/up/defined. */ - if (err == 99) - printf("ioctl(SIOCGIFADDR) error, %s not enabled\n",_ifname); - else if (fdebug) - printf("ioctl(SIOCGIFADDR,%s) error, errno=%d\n",_ifname,err); - } else { /* got the local OS IP successfully */ - pc = (uchar *)&ifr.ifr_addr.sa_data[2]; - if (fdebug) - printf("%s addr = %d.%d.%d.%d\n",_ifname,pc[0],pc[1],pc[2],pc[3]); - memcpy(osmyip, pc, 4); - if (!IpIsValid(rgmyip) && (fsharedMAC==1)) /*not specified, shared*/ - memcpy(rgmyip, osmyip, 4); - - /* get the local OS netmask */ - strcpy(ifr.ifr_name, _ifname); - if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { - if (fdebug) - printf("ioctl(SIOCGIFNETMASK) error, errno=%d\n",get_errno()); - /* if leave invalid, will use default rgsubnet */ - } else { // sizeof(struct sockaddr) - pc = (uchar *)&ifr.ifr_netmask.sa_data[2]; - if (fdebug) - printf("subnet = %d.%d.%d.%d \n", pc[0],pc[1],pc[2],pc[3]); - memcpy(ossubnet, pc, 4); - if (!SubnetIsValid(rgsubnet) && fsharedMAC) /*not specified*/ - memcpy(rgsubnet, pc, 4); - } + + if (memcmp (bmcmymac, osmymac, MAC_LEN) == 0) { + /* osmymac and ifname were set above by FindEthNum */ + printf ("\tBMC shares IP/MAC with OS NIC %s\n", _ifname); + fsharedMAC = 1; + } /* else fsharedMAC = 0; */ + + if (fsharedMAC == 0) { /* then BMC has separate MAC */ + if (!MacIsValid (rgmymac) && MacIsValid (bmcmymac)) + memcpy (rgmymac, bmcmymac, MAC_LEN); /*use existing */ + } + else { /* else OS & BMC share a MAC */ + /* Use the local if HWADDR (MAC Address) from OS */ + if (!MacIsValid (rgmymac)) { /* if not user-specified */ + if (MacIsValid (bmcmymac)) + memcpy (rgmymac, bmcmymac, MAC_LEN); /*use existing */ + else + memcpy (rgmymac, osmymac, MAC_LEN); /*use OS mac */ + } + } + fd = skfd; // get_socket_for_af(AF_INET) below; + } + + if (fd >= 0) { /* if valid fd, find OS IP */ + strcpy (ifr.ifr_name, _ifname); + ifr.ifr_addr.sa_family = AF_INET; + /* Get the IFADDR (IP Address) from OS */ + if (ioctl (fd, SIOCGIFADDR, &ifr) < 0) { + int err; + err = get_errno (); + /* errno 99 here means that eth0 is not enabled/up/defined. */ + if (err == 99) + printf ("ioctl(SIOCGIFADDR) error, %s not enabled\n", _ifname); + else if (fdebug) + printf ("ioctl(SIOCGIFADDR,%s) error, errno=%d\n", _ifname, err); + } + else { /* got the local OS IP successfully */ + pc = (uchar *) & ifr.ifr_addr.sa_data[2]; + if (fdebug) + printf ("%s addr = %d.%d.%d.%d\n", _ifname, pc[0], pc[1], pc[2], + pc[3]); + memcpy (osmyip, pc, 4); + if (!IpIsValid (rgmyip) && (fsharedMAC == 1)) /*not specified, shared */ + memcpy (rgmyip, osmyip, 4); + + /* get the local OS netmask */ + strcpy (ifr.ifr_name, _ifname); + if (ioctl (fd, SIOCGIFNETMASK, &ifr) < 0) { + if (fdebug) + printf ("ioctl(SIOCGIFNETMASK) error, errno=%d\n", get_errno ()); + /* if leave invalid, will use default rgsubnet */ + } + else { // sizeof(struct sockaddr) + pc = (uchar *) & ifr.ifr_netmask.sa_data[2]; + if (fdebug) + printf ("subnet = %d.%d.%d.%d \n", pc[0], pc[1], pc[2], pc[3]); + memcpy (ossubnet, pc, 4); + if (!SubnetIsValid (rgsubnet) && fsharedMAC) /*not specified */ + memcpy (rgsubnet, pc, 4); + } #ifdef SIOCGIFHWADDR - /* Get the localhost OS HWADDR (MAC Address) */ - if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { - if (fdebug) - printf("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n", - _ifname,get_errno()); - } else memcpy(osmymac,get_ifreq_mac(&ifr),MAC_LEN); /*OS mac*/ + /* Get the localhost OS HWADDR (MAC Address) */ + if (ioctl (fd, SIOCGIFHWADDR, &ifr) < 0) { + if (fdebug) + printf ("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n", + _ifname, get_errno ()); + } + else + memcpy (osmymac, get_ifreq_mac (&ifr), MAC_LEN); /*OS mac */ #endif + } + } + close (skfd); /* done, close the socket */ + + if (rghostname[0] == 0) { /*hostname not specified */ + if (!fipmilan) + gethostname (rghostname, sizeof (rghostname)); + } + if (fdebug) /* show the local OS eth if and MAC */ + printf + ("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n", + _ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], rghostname, + osmymac[0], osmymac[1], osmymac[2], osmymac[3], osmymac[4], + osmymac[5]); + + if (!IpIsValid (rgmyip) && IpIsValid (bmcmyip)) { + /* If no user-specified IP and there is a valid IP already in the + * BMC LAN configuration, use the existing BMC LAN IP. */ + memcpy (rgmyip, bmcmyip, 4); + if (fdebug) + printf ("Using current IP %d.%d.%d.%d\n", + bmcmyip[0], bmcmyip[1], bmcmyip[2], bmcmyip[3]); + } + + /* Get the default gateway MAC */ + if (lan_ch == gcm_ch) { + if (SubnetIsSame (osmyip, rggwyip, ossubnet)) + fgetmac = 1; + else { /* gateway is not on the same subnet as RMM/GCM */ + fgetmac = 0; /*don't try to get mac if not the same subnet */ + if ((fset_ip & GWYIP) == 0) + memset (rggwyip, 0, 4); + } + } + else + fgetmac = 1; + if (fgetmac && IpIsValid (rggwyip) && !MacIsValid (rggwymac)) + Get_Mac (rggwyip, rggwymac, NULL); /*gwy mac not specified, so get mac */ + + /* Get the Alert Destination IP */ + /* By default, attempt to obtain this from /etc/snmp/snmpd.conf. */ + /* cat /etc/snmp/snmpd.conf | grep trapsink |tail -n1 | cut -f2 -d' ' */ + alertname[0] = 0; /* default to null string */ + fprt = fopen (snmpfile, "r"); + if (fprt == NULL) { + printf ("snmp: Cannot open %s, errno = %d\n", snmpfile, get_errno ()); + } + else { + // char snmpfmt[] = "%20s %60s\n"; + // char *keywd, *value; + while (fgets (buff, 1023, fprt)) { + /* parse each line */ + if (buff[0] == '#') + continue; /*skip comment lines */ + /* skip leading whitespace here */ + j = strspn (&buff[0], " \t"); + if (strncmp (&buff[j], "com2sec", 7) == 0) { /* found community line */ + /* usu like this: "com2sec demouser default public" */ + i = j + 7; + for (j = 0; j < 3; j++) { + num = strspn (&buff[i], " \t"); + i += num; + num = strcspn (&buff[i], " \t\r\n"); + if (j < 2) + i += num; } - } - close(skfd); /* done, close the socket */ - - if (rghostname[0] == 0) { /*hostname not specified*/ - if (!fipmilan) - gethostname(rghostname,sizeof(rghostname)); - } - if (fdebug) /* show the local OS eth if and MAC */ - printf("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n", - _ifname, osmyip[0],osmyip[1],osmyip[2],osmyip[3], rghostname, - osmymac[0], osmymac[1], osmymac[2], osmymac[3], - osmymac[4], osmymac[5]); - - if (!IpIsValid(rgmyip) && IpIsValid(bmcmyip)) { - /* If no user-specified IP and there is a valid IP already in the - * BMC LAN configuration, use the existing BMC LAN IP. */ - memcpy(rgmyip,bmcmyip,4); - if (fdebug) printf("Using current IP %d.%d.%d.%d\n", - bmcmyip[0], bmcmyip[1], - bmcmyip[2], bmcmyip[3]); - } - - /* Get the default gateway MAC */ - if (lan_ch == gcm_ch) { - if (SubnetIsSame(osmyip,rggwyip,ossubnet)) fgetmac = 1; - else { /* gateway is not on the same subnet as RMM/GCM */ - fgetmac = 0; /*don't try to get mac if not the same subnet*/ - if ((fset_ip & GWYIP) == 0) memset(rggwyip,0,4); - } - } else fgetmac = 1; - if (fgetmac && IpIsValid(rggwyip) && !MacIsValid(rggwymac)) - Get_Mac(rggwyip,rggwymac,NULL); /*gwy mac not specified, so get mac*/ - - /* Get the Alert Destination IP */ - /* By default, attempt to obtain this from /etc/snmp/snmpd.conf. */ - /* cat /etc/snmp/snmpd.conf | grep trapsink |tail -n1 | cut -f2 -d' ' */ - alertname[0] = 0; /* default to null string */ - fprt = fopen(snmpfile,"r"); - if (fprt == NULL) { - printf("snmp: Cannot open %s, errno = %d\n",snmpfile,get_errno()); - } else { - // char snmpfmt[] = "%20s %60s\n"; - // char *keywd, *value; - while (fgets(buff, 1023, fprt)) { - /* parse each line */ - if (buff[0] == '#') continue; /*skip comment lines*/ - /* skip leading whitespace here */ - j = strspn(&buff[0]," \t"); - if (strncmp(&buff[j],"com2sec",7) == 0) { /* found community line */ - /* usu like this: "com2sec demouser default public" */ - i = j + 7; - for (j = 0; j < 3; j++) { - num = strspn(&buff[i]," \t"); - i += num; - num = strcspn(&buff[i]," \t\r\n"); - if (j < 2) i += num; - } - buff[i+num] = 0; - if (fsetcommunity == 0) { /* if not user-specified */ - strcpy(rgcommunity,&buff[i]); - strcpy(defcommunity,&buff[i]); - } + buff[i + num] = 0; + if (fsetcommunity == 0) { /* if not user-specified */ + strcpy (rgcommunity, &buff[i]); + strcpy (defcommunity, &buff[i]); } + } #ifdef BSD - if (strncmp(&buff[j],"traphost :=",11) == 0) nmatch = 11; - else nmatch = 0; + if (strncmp (&buff[j], "traphost :=", 11) == 0) + nmatch = 11; + else + nmatch = 0; #else - if (strncmp(&buff[j],"trapsink",8) == 0) nmatch = 8; - else if (strncmp(&buff[j],"trap2sink",9) == 0) nmatch = 9; - else nmatch = 0; + if (strncmp (&buff[j], "trapsink", 8) == 0) + nmatch = 8; + else if (strncmp (&buff[j], "trap2sink", 9) == 0) + nmatch = 9; + else + nmatch = 0; #endif - if (nmatch > 0) { /* found trapsink line match */ - if (fdebug) printf("%s: %s",snmpfile,&buff[j]); - num = strspn(&buff[j+nmatch]," \t"); - i = j + nmatch + num; - if (buff[i] == '`') continue; - num = strcspn(&buff[i]," \t\r\n"); - strncpy(alertname,&buff[i],num); /* save alert destination */ - alertname[num] = 0; - i += num; - num = strspn(&buff[i]," \t"); /*skip whitespace*/ - i += num; - num = strcspn(&buff[i]," \t\r\n"); /*span next word*/ - if (num != 0) { /* there is another word, that is community */ - if (fsetcommunity == 0) { /* if not user-specified */ - strncpy(rgcommunity,&buff[i],num); /* save community */ - rgcommunity[num] = 0; - } - } else { /*have trapsink node with no community*/ - /* use previously discovered default community from above */ - strcpy(rgcommunity,defcommunity); - } - /* dont break, keep looking, use the last one */ + if (nmatch > 0) { /* found trapsink line match */ + if (fdebug) + printf ("%s: %s", snmpfile, &buff[j]); + num = strspn (&buff[j + nmatch], " \t"); + i = j + nmatch + num; + if (buff[i] == '`') + continue; + num = strcspn (&buff[i], " \t\r\n"); + strncpy (alertname, &buff[i], num); /* save alert destination */ + alertname[num] = 0; + i += num; + num = strspn (&buff[i], " \t"); /*skip whitespace */ + i += num; + num = strcspn (&buff[i], " \t\r\n"); /*span next word */ + if (num != 0) { /* there is another word, that is community */ + if (fsetcommunity == 0) { /* if not user-specified */ + strncpy (rgcommunity, &buff[i], num); /* save community */ + rgcommunity[num] = 0; + } + } + else { /*have trapsink node with no community */ + /* use previously discovered default community from above */ + strcpy (rgcommunity, defcommunity); } - } /*end while*/ - fclose(fprt); - if (fdebug) - printf("snmp alertname=%s community=%s\n",alertname,rgcommunity); - } /*end else snmpfile*/ - - /* Get the Alert Destination MAC from the alertname. */ - if (alertname[0] != 0) { + /* dont break, keep looking, use the last one */ + } + } /*end while */ + fclose (fprt); + if (fdebug) + printf ("snmp alertname=%s community=%s\n", alertname, rgcommunity); + } /*end else snmpfile */ + + /* Get the Alert Destination MAC from the alertname. */ + if (alertname[0] != 0) { #ifdef TEST - char arping_cmd[128]; - char *pb, *pm, *px; - int num, i; - if (fdebug) printf("alert %s ip=%d.%d.%d.%d osip=%d.%d.%d.%d " - "mac=%02x:%02x:%02x:%02x:%02x:%02x " - "osmac=%02x:%02x:%02x:%02x:%02x:%02x\n", - alertname, - rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3], - osmyip[0], osmyip[1], osmyip[2], osmyip[3], - rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3], - rgdestmac[4], rgdestmac[5], - osmymac[0], osmymac[1], osmymac[2], osmymac[3], - osmymac[4], osmymac[5]); + char arping_cmd[128]; + char *pb, *pm, *px; + int num, i; + if (fdebug) + printf ("alert %s ip=%d.%d.%d.%d osip=%d.%d.%d.%d " + "mac=%02x:%02x:%02x:%02x:%02x:%02x " + "osmac=%02x:%02x:%02x:%02x:%02x:%02x\n", + alertname, + rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3], + osmyip[0], osmyip[1], osmyip[2], osmyip[3], + rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3], + rgdestmac[4], rgdestmac[5], + osmymac[0], osmymac[1], osmymac[2], osmymac[3], + osmymac[4], osmymac[5]); #endif - if (!IpIsValid(rgdestip)) { /* if not user-specified with -A */ - if (IpIsValid(bmcdestip)) { /* use existing if valid */ - memcpy(rgdestip,bmcdestip,4); - if (MacIsValid(bmcdestmac)) - memcpy(rgdestmac,bmcdestmac,MAC_LEN); - } - else if ((strncmp(alertname,"localhost",9) == 0) ) - { /* snmpd.conf = localhost (self) is the SNMP alert destination */ - if (IpIsValid(osmyip)) - memcpy(rgdestip,osmyip,4); - if (!MacIsValid(rgdestmac)) { /* if not user-specified */ - // Get_Mac(rgdestip,rgdestmac,alertname); (wont work for local) - memcpy(rgdestmac,osmymac,MAC_LEN); - } - } /*endif local */ + if (!IpIsValid (rgdestip)) { /* if not user-specified with -A */ + if (IpIsValid (bmcdestip)) { /* use existing if valid */ + memcpy (rgdestip, bmcdestip, 4); + if (MacIsValid (bmcdestmac)) + memcpy (rgdestmac, bmcdestmac, MAC_LEN); } - if (!MacIsValid(rgdestmac)) /* if MAC not vaild or user-specified */ - { - /* Use arping to get MAC from alertname or IP */ - Get_Mac(rgdestip,rgdestmac,alertname); - } - } /*endif have alertname*/ - - return(rc); -} /* end Get_IPMac_Addr */ + else if ((strncmp (alertname, "localhost", 9) == 0)) { /* snmpd.conf = localhost (self) is the SNMP alert destination */ + if (IpIsValid (osmyip)) + memcpy (rgdestip, osmyip, 4); + if (!MacIsValid (rgdestmac)) { /* if not user-specified */ + // Get_Mac(rgdestip,rgdestmac,alertname); (wont work for local) + memcpy (rgdestmac, osmymac, MAC_LEN); + } + } /*endif local */ + } + if (!MacIsValid (rgdestmac)) { /* if MAC not vaild or user-specified */ + /* Use arping to get MAC from alertname or IP */ + Get_Mac (rgdestip, rgdestmac, alertname); + } + } /*endif have alertname */ + + return (rc); +} /* end Get_IPMac_Addr */ #endif -int ShowChanAcc(uchar bchan) +int +ShowChanAcc (uchar bchan) { - LAN_RECORD LanRecord; - int ret = 0; - uchar access; - char *pstr; - uchar pb0, pb1; - - if (bchan == lan_ch) pstr = "lan"; - else if (bchan == ser_ch) pstr = "ser"; - else pstr = "?"; - ret = GetChanAcc(bchan, 0x40, &LanRecord); - if (fdebug) - printf(" GetChanAcc(%d), ret = %d, data = %02x %02x\n", - bchan,ret, LanRecord.data[0], LanRecord.data[1]); - pb0 = LanRecord.data[0]; - pb1 = LanRecord.data[1]; - if (fcanonical) - printf("Channel %d Access Mode %s%c ",bchan,pspace3,bdelim); - else - printf("Channel(%d=%s) Access Mode: %02x %02x : ",bchan,pstr,pb0,pb1); - access = pb0; - switch (access & 0x03) { - case 0: printf("Disabled, "); break; - case 1: printf("Pre-Boot, "); break; - case 2: printf("Always Avail, "); break; - case 3: printf("Shared, "); break; - } - if (access & 0x20) printf("PEF Alerts Disabled\n"); /*0*/ - else printf("PEF Alerts Enabled\n"); /*1*/ - return(ret); + LAN_RECORD LanRecord; + int ret = 0; + uchar access; + char *pstr; + uchar pb0, pb1; + + if (bchan == lan_ch) + pstr = "lan"; + else if (bchan == ser_ch) + pstr = "ser"; + else + pstr = "?"; + ret = GetChanAcc (bchan, 0x40, &LanRecord); + if (fdebug) + printf (" GetChanAcc(%d), ret = %d, data = %02x %02x\n", + bchan, ret, LanRecord.data[0], LanRecord.data[1]); + pb0 = LanRecord.data[0]; + pb1 = LanRecord.data[1]; + if (fcanonical) + printf ("Channel %d Access Mode %s%c ", bchan, pspace3, bdelim); + else + printf ("Channel(%d=%s) Access Mode: %02x %02x : ", bchan, pstr, pb0, + pb1); + access = pb0; + switch (access & 0x03) { + case 0: + printf ("Disabled, "); + break; + case 1: + printf ("Pre-Boot, "); + break; + case 2: + printf ("Always Avail, "); + break; + case 3: + printf ("Shared, "); + break; + } + if (access & 0x20) + printf ("PEF Alerts Disabled\n"); /*0 */ + else + printf ("PEF Alerts Enabled\n"); /*1 */ + return (ret); } -static int GetSessionInfo(uchar *rData, int sz) +static int +GetSessionInfo (uchar * rData, int sz) { - int rv, rlen; - uchar ccode; - uchar iData[5]; - - iData[0] = 0x00; /*get data for this session*/ - rlen = sz; - rv = ipmi_cmdraw(CMD_GET_SESSION_INFO,NETFN_APP, BMC_SA,PUBLIC_BUS,BMC_LUN, - iData,1,rData, &rlen, &ccode, fdebug); - if ((rv == 0) && (ccode != 0)) rv = ccode; - return(rv); + int rv, rlen; + uchar ccode; + uchar iData[5]; + + iData[0] = 0x00; /*get data for this session */ + rlen = sz; + rv = + ipmi_cmdraw (CMD_GET_SESSION_INFO, NETFN_APP, BMC_SA, PUBLIC_BUS, BMC_LUN, + iData, 1, rData, &rlen, &ccode, fdebug); + if ((rv == 0) && (ccode != 0)) + rv = ccode; + return (rv); } -static int GetPefCapabilities(uchar *bmax) +static int +GetPefCapabilities (uchar * bmax) { - int rv, rlen; - uchar ccode; - uchar rData[MAX_BUFFER_SIZE]; - - rlen = sizeof(rData); - rv = ipmi_cmdraw(0x10, NETFN_SEVT, BMC_SA,PUBLIC_BUS,BMC_LUN, - NULL,0,rData, &rlen, &ccode, fdebug); - if ((rv == 0) && (ccode != 0)) rv = ccode; - if ((rv == 0) && (bmax != NULL)) - *bmax = rData[2]; /*max num PEF table entries*/ - return(rv); + int rv, rlen; + uchar ccode; + uchar rData[MAX_BUFFER_SIZE]; + + rlen = sizeof (rData); + rv = ipmi_cmdraw (0x10, NETFN_SEVT, BMC_SA, PUBLIC_BUS, BMC_LUN, + NULL, 0, rData, &rlen, &ccode, fdebug); + if ((rv == 0) && (ccode != 0)) + rv = ccode; + if ((rv == 0) && (bmax != NULL)) + *bmax = rData[2]; /*max num PEF table entries */ + return (rv); } -int GetSerialOverLan( uchar chan, uchar bset, uchar block ) +int +GetSerialOverLan (uchar chan, uchar bset, uchar block) { - uchar requestData[24]; - uchar rData[MAX_BUFFER_SIZE]; - int rlen; - int status, i; - uchar ccode; - uchar enable_parm, auth_parm, baud_parm; - ushort getsolcmd; - uchar user; - - if (fIPMI20 && fSOL20) { - getsolcmd = GET_SOL_CONFIG2; - enable_parm = SOL_ENABLE_PARAM; - auth_parm = SOL_AUTHENTICATION_PARAM; - baud_parm = SOL_BAUD_RATE_PARAM; - } else { - getsolcmd = GET_SOL_CONFIG; - enable_parm = SOL_ENABLE_PARAM; - auth_parm = SOL_AUTHENTICATION_PARAM; - baud_parm = SOL_BAUD_RATE_PARAM; - chan = 0; /*override chan for IPMI 1.5*/ + uchar requestData[24]; + uchar rData[MAX_BUFFER_SIZE]; + int rlen; + int status, i; + uchar ccode; + uchar enable_parm, auth_parm, baud_parm; + ushort getsolcmd; + uchar user; + + if (fIPMI20 && fSOL20) { + getsolcmd = GET_SOL_CONFIG2; + enable_parm = SOL_ENABLE_PARAM; + auth_parm = SOL_AUTHENTICATION_PARAM; + baud_parm = SOL_BAUD_RATE_PARAM; + } + else { + getsolcmd = GET_SOL_CONFIG; + enable_parm = SOL_ENABLE_PARAM; + auth_parm = SOL_AUTHENTICATION_PARAM; + baud_parm = SOL_BAUD_RATE_PARAM; + chan = 0; /*override chan for IPMI 1.5 */ + } + if (!fcanonical) + printf ("%s, GetSOL for channel %d ...\n", progname, chan); + + requestData[0] = chan; /*channel */ + requestData[1] = enable_parm; + requestData[2] = bset; /*set */ + requestData[3] = block; /*block */ + rlen = sizeof (rData); + status = ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug); + if (status != 0) + return (status); + if (ccode) { + if (ccode == 0xC1) { /* unsupported command */ + printf ("Serial-Over-Lan not available on this platform\n"); + return (status); + } + else { + printf ("SOL Enable ccode = %x\n", ccode); + status = ccode; + } + } + else { /*success */ + if (fcanonical) { + printf ("Channel %d SOL Enable %s", chan, pspace3); + } + else { + printf ("SOL Enable: "); + for (i = 1; i < rlen; i++) + printf ("%02x ", rData[i]); + } + if (rData[1] == 0x01) + printf ("%c enabled\n", bdelim); + else + printf ("%c disabled\n", bdelim); + } + + if (!fcanonical) { + requestData[0] = chan; + requestData[1] = auth_parm; + requestData[2] = bset; // selector + requestData[3] = block; // block + rlen = sizeof (rData); + status = + ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug); + if (status != 0) + return (status); + if (ccode) { + printf ("SOL Auth ccode = %x\n", ccode); + status = ccode; + } + else { /*success */ + printf ("SOL Auth: "); + for (i = 1; i < rlen; i++) + printf ("%02x ", rData[i]); + printf (": "); + show_priv (rData[1]); /* priv level = User,Admin,... */ + printf ("\n"); + } + + requestData[0] = chan; + requestData[1] = SOL_ACC_INTERVAL_PARAM; + requestData[2] = bset; + requestData[3] = block; + rlen = sizeof (rData); + status = + ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug); + if (status != 0) + return (status); + if (ccode) { + printf ("SOL Accum Interval ccode = %x\n", ccode); + status = ccode; + } + else { /*success */ + printf ("SOL Accum Interval: "); + for (i = 1; i < rlen; i++) + printf ("%02x ", rData[i]); + printf (": %d msec\n", (rData[1] * 5)); + } + + requestData[0] = chan; + requestData[1] = SOL_RETRY_PARAM; + requestData[2] = bset; + requestData[3] = block; + rlen = sizeof (rData); + status = + ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug); + if (status != 0) + return (status); + if (ccode) { + printf ("SOL Retry ccode = %x\n", ccode); + status = ccode; + } + else { /*success */ + printf ("SOL Retry Interval: "); + for (i = 1; i < rlen; i++) + printf ("%02x ", rData[i]); + printf (": %d msec\n", (rData[2] * 10)); + } + } + + if (!fRomley) { + requestData[0] = chan; + requestData[1] = baud_parm; + requestData[2] = bset; + requestData[3] = block; + rlen = sizeof (rData); + status = + ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug); + if (status != 0) + return (status); + if (ccode) { + printf ("SOL nvol Baud ccode = %x\n", ccode); + status = ccode; + } + else { /*success */ + uchar b; + if (fcanonical) { + printf ("Channel %d SOL Baud Rate%s", chan, pspace3); + } + else { + printf ("SOL nvol Baud Rate: "); + for (i = 1; i < rlen; i++) + printf ("%02x ", rData[i]); + } + /* if not user-specified and previously enabled, use existing */ + b = (rData[1] & 0x0f); + if ((fnewbaud == 0) && BaudValid (b)) { + sol_baud = b; + sol_bvalid = 1; + } + printf ("%c %s\n", bdelim, Baud2Str (b)); + } + + if (!fcanonical) { + requestData[0] = chan; + requestData[1] = SOL_VOL_BAUD_RATE_PARAM; /*0x06 */ + requestData[2] = bset; + requestData[3] = block; + rlen = sizeof (rData); + status = + ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug); + if (status != 0) + return (status); + if (ccode) { + printf ("SOL vol Baud ccode = %x\n", ccode); + status = ccode; + } + else { /*success */ + printf ("SOL vol Baud Rate: "); + for (i = 1; i < rlen; i++) + printf ("%02x ", rData[i]); + printf ("%c %s\n", bdelim, Baud2Str (rData[1])); + } + } + } + if (fIPMI20) { + if (vend_id != VENDOR_IBM) { + /* IBM 0x00DC returns invalid cmd for SOL Payload commands. */ + if (!fcanonical) { + requestData[0] = chan; + rlen = sizeof (rData); + status = ipmi_cmdraw (GET_PAYLOAD_SUPPORT, NETFN_APP, + BMC_SA, PUBLIC_BUS, BMC_LUN, + requestData, 1, rData, &rlen, &ccode, fdebug); + if ((status != 0) || (ccode != 0)) { + printf ("SOL Payload Support error %d, ccode = %x\n", status, + ccode); + if (status == 0) + status = ccode; } - if (!fcanonical) - printf("%s, GetSOL for channel %d ...\n",progname,chan); - - requestData[0] = chan; /*channel*/ - requestData[1] = enable_parm; - requestData[2] = bset; /*set*/ - requestData[3] = block; /*block*/ - rlen = sizeof(rData); - status = ipmi_cmd(getsolcmd, requestData,4, rData, &rlen,&ccode,fdebug); - if (status != 0) return(status); - if (ccode) { - if (ccode == 0xC1) { /* unsupported command */ - printf("Serial-Over-Lan not available on this platform\n"); - return(status); - } else { - printf("SOL Enable ccode = %x\n",ccode); - status = ccode; - } - } else { /*success*/ - if (fcanonical) { - printf("Channel %d SOL Enable %s",chan,pspace3); - } else { - printf("SOL Enable: "); - for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); - } - if (rData[1] == 0x01) printf("%c enabled\n",bdelim); - else printf("%c disabled\n",bdelim); + else { /*success */ + printf ("SOL Payload Support(%d): ", chan); + for (i = 0; i < rlen; i++) + printf ("%02x ", rData[i]); + printf ("\n"); } - - if (!fcanonical) - { - requestData[0] = chan; - requestData[1] = auth_parm; - requestData[2] = bset; // selector - requestData[3] = block; // block - rlen = sizeof(rData); - status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug); - if (status != 0) return(status); - if (ccode) { - printf("SOL Auth ccode = %x\n",ccode); - status = ccode; - } else { /*success*/ - printf("SOL Auth: "); - for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); - printf(": "); - show_priv(rData[1]); /* priv level = User,Admin,... */ - printf("\n"); + } /*endif not canonical */ + /* get Payload Access for 4 users, not just lan_user */ + for (user = 1; user <= show_users; user++) { + /* mBMC doesn't support more than 1 user */ + if (fmBMC && (user > 1)) + break; + /* IPMI 2.0 has >= 4 users */ + requestData[0] = chan; + requestData[1] = user; + rlen = sizeof (rData); + status = ipmi_cmdraw (GET_PAYLOAD_ACCESS, NETFN_APP, + BMC_SA, PUBLIC_BUS, BMC_LUN, + requestData, 2, rData, &rlen, &ccode, fdebug); + if ((status != 0) || (ccode != 0)) { + printf ("SOL Payload Access(%d,%d) error %d, ccode = %x\n", + chan, user, status, ccode); + if (status == 0) + status = ccode; + } + else { /*success */ + if (fcanonical) { + printf ("Channel %d SOL Payload Access(user%d)%s", chan, user, + pspace1); } - - requestData[0] = chan; - requestData[1] = SOL_ACC_INTERVAL_PARAM; - requestData[2] = bset; - requestData[3] = block; - rlen = sizeof(rData); - status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug); - if (status != 0) return(status); - if (ccode) { - printf("SOL Accum Interval ccode = %x\n",ccode); - status = ccode; - } else { /*success*/ - printf("SOL Accum Interval: "); - for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); - printf(": %d msec\n",(rData[1] * 5)); - } - - requestData[0] = chan; - requestData[1] = SOL_RETRY_PARAM; - requestData[2] = bset; - requestData[3] = block; - rlen = sizeof(rData); - status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug); - if (status != 0) return(status); - if (ccode) { - printf("SOL Retry ccode = %x\n",ccode); - status = ccode; - } else { /*success*/ - printf("SOL Retry Interval: "); - for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); - printf(": %d msec\n",(rData[2] * 10)); - } - } - - if (!fRomley) - { - requestData[0] = chan; - requestData[1] = baud_parm; - requestData[2] = bset; - requestData[3] = block; - rlen = sizeof(rData); - status = ipmi_cmd(getsolcmd,requestData,4,rData, &rlen,&ccode,fdebug); - if (status != 0) return(status); - if (ccode) { - printf("SOL nvol Baud ccode = %x\n",ccode); - status = ccode; - } else { /*success*/ - uchar b; - if (fcanonical) { - printf("Channel %d SOL Baud Rate%s",chan,pspace3); - } else { - printf("SOL nvol Baud Rate: "); - for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); - } - /* if not user-specified and previously enabled, use existing */ - b = (rData[1] & 0x0f); - if ((fnewbaud == 0) && BaudValid(b)) { - sol_baud = b; - sol_bvalid = 1; - } - printf("%c %s\n",bdelim,Baud2Str(b)); - } - - if (!fcanonical) - { - requestData[0] = chan; - requestData[1] = SOL_VOL_BAUD_RATE_PARAM; /*0x06*/ - requestData[2] = bset; - requestData[3] = block; - rlen = sizeof(rData); - status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug); - if (status != 0) return(status); - if (ccode) { - printf("SOL vol Baud ccode = %x\n",ccode); - status = ccode; - } else { /*success*/ - printf("SOL vol Baud Rate: "); - for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); - printf("%c %s\n",bdelim,Baud2Str(rData[1])); - } + else { + printf ("SOL Payload Access(%d,%d): ", chan, user); + for (i = 0; i < rlen; i++) + printf ("%02x ", rData[i]); } + if ((rData[0] & 0x02) != 0) + printf ("%c enabled\n", bdelim); + else + printf ("%c disabled\n", bdelim); } - if (fIPMI20) { - if (vend_id != VENDOR_IBM) { - /* IBM 0x00DC returns invalid cmd for SOL Payload commands. */ - if (!fcanonical) { - requestData[0] = chan; - rlen = sizeof(rData); - status = ipmi_cmdraw(GET_PAYLOAD_SUPPORT, NETFN_APP, - BMC_SA,PUBLIC_BUS,BMC_LUN, - requestData,1,rData, &rlen, &ccode, fdebug); - if ((status != 0) || (ccode != 0)) { - printf("SOL Payload Support error %d, ccode = %x\n",status,ccode); - if (status == 0) status = ccode; - } else { /*success*/ - printf("SOL Payload Support(%d): ",chan); - for (i = 0; i < rlen; i++) printf("%02x ",rData[i]); - printf("\n"); - } - } /*endif not canonical*/ - /* get Payload Access for 4 users, not just lan_user */ - for (user = 1; user <= show_users; user++) - { - /* mBMC doesn't support more than 1 user */ - if (fmBMC && (user > 1)) break; - /* IPMI 2.0 has >= 4 users */ - requestData[0] = chan; - requestData[1] = user; - rlen = sizeof(rData); - status = ipmi_cmdraw(GET_PAYLOAD_ACCESS, NETFN_APP, - BMC_SA,PUBLIC_BUS,BMC_LUN, - requestData,2,rData, &rlen, &ccode, fdebug); - if ((status != 0) || (ccode != 0)) { - printf("SOL Payload Access(%d,%d) error %d, ccode = %x\n", - chan,user,status,ccode); - if (status == 0) status = ccode; - } else { /*success*/ - if (fcanonical) { - printf("Channel %d SOL Payload Access(user%d)%s",chan,user, - pspace1); - } else { - printf("SOL Payload Access(%d,%d): ",chan,user); - for (i = 0; i < rlen; i++) printf("%02x ",rData[i]); - } - if ((rData[0] & 0x02) != 0) printf("%c enabled\n",bdelim); - else printf("%c disabled\n",bdelim); - } - } /*end user loop*/ - } /*endif not IBM*/ - } - - return(status); -} /*end GetSerialOverLan */ + } /*end user loop */ + } /*endif not IBM */ + } + + return (status); +} /*end GetSerialOverLan */ /* ECHO SOL Config Enable @@ -3413,1784 +3775,2277 @@ CMDTOOL 20 30 21 %1 06 07 ECHO Set user Payload Access for user 1 CMDTOOL 20 18 4c %1 01 02 00 00 00 */ -int SetupSerialOverLan( int benable ) +int +SetupSerialOverLan (int benable) { - uchar requestData[24]; - uchar responseData[MAX_BUFFER_SIZE]; - int responseLength = MAX_BUFFER_SIZE; - int status; - uchar completionCode; - uchar enable_parm, auth_parm, baud_parm; - ushort setsolcmd; - ushort getsolcmd; - uchar bchan, b; - - if (fIPMI20 && fSOL20) { - setsolcmd = SET_SOL_CONFIG2; - getsolcmd = GET_SOL_CONFIG2; - enable_parm = SOL_ENABLE_PARAM; - auth_parm = SOL_AUTHENTICATION_PARAM; - baud_parm = SOL_BAUD_RATE_PARAM; - bchan = lan_ch; - } else { - setsolcmd = SET_SOL_CONFIG; - getsolcmd = GET_SOL_CONFIG; - enable_parm = SOL_ENABLE_PARAM; - auth_parm = SOL_AUTHENTICATION_PARAM; - baud_parm = SOL_BAUD_RATE_PARAM; - bchan = 0x00; /*override chan for IPMI 1.5*/ + uchar requestData[24]; + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar completionCode; + uchar enable_parm, auth_parm, baud_parm; + ushort setsolcmd; + ushort getsolcmd; + uchar bchan, b; + + if (fIPMI20 && fSOL20) { + setsolcmd = SET_SOL_CONFIG2; + getsolcmd = GET_SOL_CONFIG2; + enable_parm = SOL_ENABLE_PARAM; + auth_parm = SOL_AUTHENTICATION_PARAM; + baud_parm = SOL_BAUD_RATE_PARAM; + bchan = lan_ch; + } + else { + setsolcmd = SET_SOL_CONFIG; + getsolcmd = GET_SOL_CONFIG; + enable_parm = SOL_ENABLE_PARAM; + auth_parm = SOL_AUTHENTICATION_PARAM; + baud_parm = SOL_BAUD_RATE_PARAM; + bchan = 0x00; /*override chan for IPMI 1.5 */ + } + memset (requestData, 0, sizeof (requestData)); /* zero-fill */ + requestData[0] = bchan; + requestData[1] = enable_parm; + if (benable == 0) + requestData[2] = SOL_DISABLE_FLAG; + else + requestData[2] = SOL_ENABLE_FLAG; + responseLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (setsolcmd, requestData, 3, responseData, + &responseLength, &completionCode, fdebug); + if (status == ACCESS_OK) { + switch (completionCode) { + case 0x00: /* success */ + break; + case 0xC1: /* unsupported command */ + SELprintf ("SetupSerialOverLan: SOL not available on this platform\n"); + return 0; + default: /* other error */ + SELprintf ("SetupSerialOverLan: SOL_ENABLE_PARAM ccode=%x\n", + completionCode); + return -1; + break; + } + } + else { + SELprintf ("SET_SOL_CONFIG, enable SOL failed\n"); + return -1; + } + if (benable == 0) + return 0; + + requestData[0] = bchan; /* channel */ + requestData[1] = auth_parm; + requestData[2] = 0x00; /* set selector */ + requestData[3] = 0x00; /* block selector */ + responseLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (getsolcmd, requestData, 4, responseData, + &responseLength, &completionCode, fdebug); + if (status == ACCESS_OK) { + if (completionCode) { + SELprintf ("SetupSerialOverLan: GET_SOL_AUTHENTICATION_PARAM code=%x\n", + completionCode); + + return -1; + } + } + else { + SELprintf ("SOL_CONFIG, get SOL authentication failed\n"); + return -1; + } + + if ((vend_id == VENDOR_SUPERMICROX) || (vend_id == VENDOR_SUPERMICRO)) + b = SOL_PRIVILEGE_LEVEL_OPERATOR; + else + b = SOL_PRIVILEGE_LEVEL_USER; + requestData[0] = bchan; + requestData[1] = auth_parm; + requestData[2] = b | (responseData[1] & 0x80); /* priv | enable */ + responseLength = MAX_BUFFER_SIZE; + status = ipmi_cmd (setsolcmd, requestData, 3, responseData, + &responseLength, &completionCode, fdebug); + if (status == ACCESS_OK) { + if (completionCode) { + SELprintf ("SET_SOL_AUTHENTICATION_PARAM code=%x\n", completionCode); + + return -1; + } + } + else { + SELprintf ("SET_SOL_CONFIG, set SOL authentication failed\n"); + return -1; + } + + requestData[0] = bchan; + requestData[1] = SOL_ACC_INTERVAL_PARAM; + requestData[2] = sol_accum[0]; //0x04; + requestData[3] = sol_accum[1]; //0x32; + responseLength = MAX_BUFFER_SIZE; + if (fdebug) + SELprintf ("Setting SOL AccumInterval\n"); + status = ipmi_cmd (setsolcmd, requestData, 4, responseData, + &responseLength, &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + SELprintf ("SET SOL AccumInterval ret=%d ccode=%x\n", + status, completionCode); + return -1; + } + + /* Some BMCs return sporadic errors for SOL params (e.g. Kontron) */ + // if (vend_id == VENDOR_KONTRON) ; + // else + { + requestData[0] = bchan; + requestData[1] = SOL_RETRY_PARAM; + requestData[2] = sol_retry[0]; //0x06; + requestData[3] = sol_retry[1]; //0x14; + responseLength = MAX_BUFFER_SIZE; + if (fdebug) + SELprintf ("Setting SOL RetryInterval\n"); + status = ipmi_cmd (setsolcmd, requestData, 4, responseData, + &responseLength, &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + SELprintf ("SET SOL RetryInterval ret=%d ccode=%x\n", + status, completionCode); + return -1; + } + } + + if (fRomley); /* skip SOL BAUD */ + else { /* else SOL BAUD is used, so set it. */ + if (fnewbaud == 0) { /* no user-specified SOL baud */ + /* if sol_bvalid, sol_baud was set to existing value above */ + if (!sol_bvalid) { + status = GetSerEntry (7, (LAN_RECORD *) & responseData); + if (status == 0) { /* use Serial baud for SOL */ + sol_baud = responseData[1]; + if (fdebug) + SELprintf ("Serial Baud is %s\n", Baud2Str (sol_baud)); } - memset(requestData, 0, sizeof(requestData)); /* zero-fill */ - requestData[0] = bchan; - requestData[1] = enable_parm; - if (benable == 0) - requestData[2] = SOL_DISABLE_FLAG; - else - requestData[2] = SOL_ENABLE_FLAG; - responseLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(setsolcmd, requestData,3,responseData, - &responseLength, &completionCode, fdebug); - if (status == ACCESS_OK) { - switch( completionCode ) { - case 0x00: /* success */ - break; - case 0xC1: /* unsupported command */ - SELprintf("SetupSerialOverLan: SOL not available on this platform\n"); - return 0; - default: /* other error */ - SELprintf("SetupSerialOverLan: SOL_ENABLE_PARAM ccode=%x\n", - completionCode); - return -1; - break; - } - } else { - SELprintf( "SET_SOL_CONFIG, enable SOL failed\n" ); - return -1; - } - if (benable == 0) return 0; - - requestData[0] = bchan; /* channel */ - requestData[1] = auth_parm; - requestData[2] = 0x00; /* set selector */ - requestData[3] = 0x00; /* block selector */ - responseLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(getsolcmd, requestData,4,responseData, - &responseLength, &completionCode, fdebug); - if (status == ACCESS_OK) { - if( completionCode ) { - SELprintf("SetupSerialOverLan: GET_SOL_AUTHENTICATION_PARAM code=%x\n", - completionCode); - - return -1; - } - } else { - SELprintf( "SOL_CONFIG, get SOL authentication failed\n" ); - return -1; - } - - if ((vend_id == VENDOR_SUPERMICROX) || - (vend_id == VENDOR_SUPERMICRO)) b = SOL_PRIVILEGE_LEVEL_OPERATOR; - else b = SOL_PRIVILEGE_LEVEL_USER; - requestData[0] = bchan; - requestData[1] = auth_parm; - requestData[2] = b | ( responseData[1] & 0x80 ); /* priv | enable */ - responseLength = MAX_BUFFER_SIZE; - status = ipmi_cmd(setsolcmd, requestData,3,responseData, - &responseLength, &completionCode, fdebug); - if (status == ACCESS_OK) { - if( completionCode ) { - SELprintf("SET_SOL_AUTHENTICATION_PARAM code=%x\n", - completionCode); - - return -1; - } - } else { - SELprintf( "SET_SOL_CONFIG, set SOL authentication failed\n" ); - return -1; - } - - requestData[0] = bchan; - requestData[1] = SOL_ACC_INTERVAL_PARAM; - requestData[2] = sol_accum[0]; //0x04; - requestData[3] = sol_accum[1]; //0x32; - responseLength = MAX_BUFFER_SIZE; - if (fdebug) SELprintf("Setting SOL AccumInterval\n"); - status = ipmi_cmd(setsolcmd, requestData,4,responseData, - &responseLength, &completionCode, fdebug); - if (status != ACCESS_OK || completionCode) { - SELprintf("SET SOL AccumInterval ret=%d ccode=%x\n", - status,completionCode); - return -1; - } - - /* Some BMCs return sporadic errors for SOL params (e.g. Kontron)*/ - // if (vend_id == VENDOR_KONTRON) ; - // else - { - requestData[0] = bchan; - requestData[1] = SOL_RETRY_PARAM; - requestData[2] = sol_retry[0]; //0x06; - requestData[3] = sol_retry[1]; //0x14; - responseLength = MAX_BUFFER_SIZE; - if (fdebug) SELprintf("Setting SOL RetryInterval\n"); - status = ipmi_cmd(setsolcmd, requestData,4,responseData, - &responseLength, &completionCode, fdebug); - if (status != ACCESS_OK || completionCode) { - SELprintf("SET SOL RetryInterval ret=%d ccode=%x\n", - status,completionCode); - return -1; - } - } - - if (fRomley) ; /* skip SOL BAUD */ - else { /* else SOL BAUD is used, so set it. */ - if (fnewbaud == 0) { /* no user-specified SOL baud */ - /* if sol_bvalid, sol_baud was set to existing value above */ - if (!sol_bvalid) { - status = GetSerEntry(7, (LAN_RECORD *)&responseData); - if (status == 0) { /* use Serial baud for SOL */ - sol_baud = responseData[1]; - if (fdebug) SELprintf("Serial Baud is %s\n",Baud2Str(sol_baud)); - } - } - } - requestData[0] = bchan; - requestData[1] = baud_parm; - requestData[2] = sol_baud; - responseLength = MAX_BUFFER_SIZE; - if (fdebug) SELprintf("Setting SOL BAUD to %s\n",Baud2Str(sol_baud)); - status = ipmi_cmd(setsolcmd, requestData,3,responseData, - &responseLength, &completionCode, fdebug); - if (status != ACCESS_OK || completionCode) { - SELprintf("SET SOL BAUD ret=%d ccode=%x\n", status,completionCode); - return -1; - } - - requestData[0] = bchan; - requestData[1] = SOL_VOL_BAUD_RATE_PARAM; - requestData[2] = sol_baud; - responseLength = MAX_BUFFER_SIZE; - if (fdebug) - printf("Setting SOL vol BAUD to %s\n",Baud2Str(sol_baud)); - status = ipmi_cmd(setsolcmd, requestData,3,responseData, - &responseLength, &completionCode, fdebug); - if (status != ACCESS_OK || completionCode) { - printf("SET SOL vol BAUD ret=%d ccode=%x\n",status,completionCode); - return -1; - } - } - - if (fIPMI20 && fSOL20) { - if (vend_id == VENDOR_KONTRON && lan_user == 1) { - if (fdebug) SELprintf("Skipping SOL Payload Access for user %d\n", - lan_user); - } else if (vend_id == VENDOR_IBM) { /*non-conformance*/ - if (fdebug) SELprintf("Skipping SOL Payload Access for user %d\n", - lan_user); - } else { - if (fdebug) SELprintf("Setting SOL Payload Access for user %d\n", - lan_user); - requestData[0] = bchan; - requestData[1] = lan_user; /*enable this user*/ - requestData[2] = 0x02; /*enable std 2.0 SOL*/ - requestData[3] = 0; - requestData[4] = 0; - requestData[5] = 0; - responseLength = MAX_BUFFER_SIZE; - status = ipmi_cmdraw(SET_PAYLOAD_ACCESS, NETFN_APP, - BMC_SA,PUBLIC_BUS,BMC_LUN, - requestData,6,responseData, &responseLength, - &completionCode, fdebug); - if (status != ACCESS_OK || completionCode) { - SELprintf("SET SOL Payload Access ret=%d ccode=%x\n", - status,completionCode); - return -1; - } - } - } - return 0; -} /*end SetupSerialOverLan */ + } + } + requestData[0] = bchan; + requestData[1] = baud_parm; + requestData[2] = sol_baud; + responseLength = MAX_BUFFER_SIZE; + if (fdebug) + SELprintf ("Setting SOL BAUD to %s\n", Baud2Str (sol_baud)); + status = ipmi_cmd (setsolcmd, requestData, 3, responseData, + &responseLength, &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + SELprintf ("SET SOL BAUD ret=%d ccode=%x\n", status, completionCode); + return -1; + } + + requestData[0] = bchan; + requestData[1] = SOL_VOL_BAUD_RATE_PARAM; + requestData[2] = sol_baud; + responseLength = MAX_BUFFER_SIZE; + if (fdebug) + printf ("Setting SOL vol BAUD to %s\n", Baud2Str (sol_baud)); + status = ipmi_cmd (setsolcmd, requestData, 3, responseData, + &responseLength, &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + printf ("SET SOL vol BAUD ret=%d ccode=%x\n", status, completionCode); + return -1; + } + } + + if (fIPMI20 && fSOL20) { + if (vend_id == VENDOR_KONTRON && lan_user == 1) { + if (fdebug) + SELprintf ("Skipping SOL Payload Access for user %d\n", lan_user); + } + else if (vend_id == VENDOR_IBM) { /*non-conformance */ + if (fdebug) + SELprintf ("Skipping SOL Payload Access for user %d\n", lan_user); + } + else { + if (fdebug) + SELprintf ("Setting SOL Payload Access for user %d\n", lan_user); + requestData[0] = bchan; + requestData[1] = lan_user; /*enable this user */ + requestData[2] = 0x02; /*enable std 2.0 SOL */ + requestData[3] = 0; + requestData[4] = 0; + requestData[5] = 0; + responseLength = MAX_BUFFER_SIZE; + status = ipmi_cmdraw (SET_PAYLOAD_ACCESS, NETFN_APP, + BMC_SA, PUBLIC_BUS, BMC_LUN, + requestData, 6, responseData, &responseLength, + &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + SELprintf ("SET SOL Payload Access ret=%d ccode=%x\n", + status, completionCode); + return -1; + } + } + } + return 0; +} /*end SetupSerialOverLan */ -static char *PefDesc(int idx, uchar stype) +static char * +PefDesc (int idx, uchar stype) { - char *pdesc, *p; - static char mystr[60]; - int mylen = sizeof(mystr); - pdesc = &mystr[0]; - if (pefdesc != NULL) strcpy(pdesc,pefdesc[idx]); /* if Intel, pre-defined */ - else strcpy(pdesc,"reserved"); /* else set default to detect */ - if ((stype != 0) && (strcmp(pdesc,"reserved") == 0)) { - /* Dynamically set the pef desc string from the sensor type */ - switch(stype) { - case 0x01: strcpy(pdesc,"Temperature"); break; - case 0x02: strcpy(pdesc,"Voltage"); break; - case 0x04: strcpy(pdesc,"Fan"); break; - case 0x05: strcpy(pdesc,"Chassis"); break; - case 0x07: strcpy(pdesc,"BIOS"); break; - case 0x08: strcpy(pdesc,"Power Supply"); break; - case 0x09: strcpy(pdesc,"Power Unit"); break; - case 0x0c: strcpy(pdesc,"Memory"); break; - case 0x0f: strcpy(pdesc,"Boot"); break; - case 0x12: strcpy(pdesc,"System Restart"); break; - case 0x13: strcpy(pdesc,"NMI"); break; - case 0x23: strcpy(pdesc,"Watchdog"); break; - case 0x20: strcpy(pdesc,"OS Critical Stop"); break; - default: + char *pdesc, *p; + static char mystr[60]; + int mylen = sizeof (mystr); + pdesc = &mystr[0]; + if (pefdesc != NULL) + strcpy (pdesc, pefdesc[idx]); /* if Intel, pre-defined */ + else + strcpy (pdesc, "reserved"); /* else set default to detect */ + if ((stype != 0) && (strcmp (pdesc, "reserved") == 0)) { + /* Dynamically set the pef desc string from the sensor type */ + switch (stype) { + case 0x01: + strcpy (pdesc, "Temperature"); + break; + case 0x02: + strcpy (pdesc, "Voltage"); + break; + case 0x04: + strcpy (pdesc, "Fan"); + break; + case 0x05: + strcpy (pdesc, "Chassis"); + break; + case 0x07: + strcpy (pdesc, "BIOS"); + break; + case 0x08: + strcpy (pdesc, "Power Supply"); + break; + case 0x09: + strcpy (pdesc, "Power Unit"); + break; + case 0x0c: + strcpy (pdesc, "Memory"); + break; + case 0x0f: + strcpy (pdesc, "Boot"); + break; + case 0x12: + strcpy (pdesc, "System Restart"); + break; + case 0x13: + strcpy (pdesc, "NMI"); + break; + case 0x23: + strcpy (pdesc, "Watchdog"); + break; + case 0x20: + strcpy (pdesc, "OS Critical Stop"); + break; + default: #ifdef METACOMMAND - p = get_sensor_type_desc(stype); - if (p != NULL) { - strncpy(pdesc,p,mylen); - mystr[mylen-1] = 0; /*stringify*/ - } + p = get_sensor_type_desc (stype); + if (p != NULL) { + strncpy (pdesc, p, mylen); + mystr[mylen - 1] = 0; /*stringify */ + } #else - sprintf(pdesc,"Other[%02x]",stype); + sprintf (pdesc, "Other[%02x]", stype); #endif - break; - } - if (pef_array[idx-1][4] == PEF_SEV_OK) strcat(pdesc," OK"); - } - return(pdesc); + break; + } + if (pef_array[idx - 1][4] == PEF_SEV_OK) + strcat (pdesc, " OK"); + } + return (pdesc); } #ifdef METACOMMAND -int i_lan(int argc, char **argv) +int +i_lan (int argc, char **argv) #else #ifdef WIN32 int __cdecl #else int #endif -main(int argc, char **argv) +main (int argc, char **argv) #endif { - int ret; - PEF_RECORD PefRecord; - LAN_RECORD LanRecord; - int i, idx, j; - int c; - char *pstr; - uchar bset; - int ndest = 4; - int idest; - char mystr[80]; - char fpefok = 1; - uchar * pc; int sz; - char *pa; - char *pb; - - // progname = argv[0]; - printf("%s ver %s \n",progname,progver); - j = 0; freadonly = FLAG_INIT; - idx = argc; /*getopt loop counter*/ - /* available opt chars: y O Q + = ~ _ */ - while ((c = getopt(argc, argv,"a:b:cdef:gh:i:j:klm:n:op:q:rstu:v:w:xy:z#::A:B:C:DEF:G:H:I:J:K:L:M:N:OP:Q:R:S:T:U:V:X:YZ:?")) != EOF) { - switch(c) { - case 'a': /* alert dest number (usu 1 thru 4) */ - alertnum = atob(optarg); - if (alertnum > alertmax) alertnum = 1; - j++; - break; - case 'b': bAuth = htoi(optarg); j++; break; /*undocumented*/ - case 'c': fcanonical = 1; bdelim = BDELIM; break; - case 'd': fenable = 0; fdisable = 1; freadonly = 0; break; - case 'e': fenable = 1; fdisable = 0; freadonly = 0; break; - case 'f': i = atoi(optarg); /*set arp_ctl*/ - if (i < 0 || i > 3) printf("Invalid ARP control %d\n",i); - else { - arp_ctl = i; - fsetarp = 1; - j++; - } - break; - case 'l': fpefenable = 0; fenable = 2; - fdisable = 0; freadonly = 0; break; - case 'h': /* VLAN ID */ - i = atoi(optarg); - if (i > 4095) vlan_enable = 0; - else { - vlan_enable = 1; - vlan_id = (ushort)i; - } - j++; - break; - case 'y': /* OEM LAN Failover enable/disable */ - i = atoi(optarg); - if (i < 0) printf("Failover(-y) parameter is negative\n"); - else failover_enable = i; - j++; - break; - case 'Q': /* VLAN Priority */ - i = atoi(optarg); - if (i > 7 || i < 0) vlan_enable = 0; - else { - vlan_enable = 1; - vlan_prio = (uchar)i; - } - j++; - break; - case 'i': /* eth interface (ifname) */ - fsetifn = 1; - i = sizeof(ifname); - if (strlen(optarg) > (uint)i) optarg[i] = 0; - strcpy(ifname,optarg); - if (fdebug) printf("ifname = %s\n",ifname); - j++; - break; - case 'j': fCustomPEF = 1; /*custom 10 PEF bytes */ - fpefenable = 1; /* PEF is implied here */ - freadonly = 0; - memset(custPEF,0,sizeof(custPEF)); - custPEF[0] = htoi(&optarg[0]); /*action */ - custPEF[1] = htoi(&optarg[2]); /*policy */ - custPEF[2] = htoi(&optarg[4]); /*severity*/ - custPEF[3] = htoi(&optarg[6]); /*genid1 */ - custPEF[4] = htoi(&optarg[8]); /*genid2 */ - custPEF[5] = htoi(&optarg[10]); /*sensor_type*/ - custPEF[6] = htoi(&optarg[12]); /*sensor_num */ - custPEF[7] = htoi(&optarg[14]); /*evt_trigger*/ - custPEF[8] = htoi(&optarg[16]); /*data1offset*/ - custPEF[9] = htoi(&optarg[18]); /*data1mask */ - if (optarg[20] != 0) { - /* optionally get 8 extra PEF entry bytes */ - custPEF[10] = htoi(&optarg[20]); /*data1cmp1 */ - custPEF[11] = htoi(&optarg[22]); /*data1cmp2 */ - custPEF[12] = htoi(&optarg[24]); /*data2mask */ - custPEF[13] = htoi(&optarg[26]); /*data2cmp1 */ - custPEF[14] = htoi(&optarg[28]); /*data2cmp2 */ - custPEF[15] = htoi(&optarg[30]); /*data3mask */ - custPEF[16] = htoi(&optarg[32]); /*data3cmp1 */ - custPEF[17] = htoi(&optarg[34]); /*data3cmp2 */ - } - j++; - break; - case 'k': fSetPEFOks = 1; j++; break; /*configure PEF OK rules */ - case 'm': set_max_kcs_loops(atoi(optarg)); break; - case 'n': /* number/index in PEF table to insert new entry */ - fpefenable = 1; - pefnum = atob(optarg); - if (pefnum >= MAXPEF) { - pefnum = MAXPEF - 1; - fAdjustPefNum = 1; - } else fUserPefNum = 1; - j++; - break; - case 'o': fdisableSOL = 1; /*disable SOL only*/ - fpefenable = 0; /*no change to PEF*/ - freadonly = 0; - break; - case 'r': freadonly = 1; fenable = 0; break; - case 's': fgetser = 1; break; - case 't': ftestonly = 1; freadonly = 1; break; - case 'v': /* user access privilege level */ - i = atoi(optarg); - if (valid_priv(i)) lan_access = i & 0x0f; - else printf("Invalid privilege -v %d, using Admin\n",i); - j++; - break; - case 'w': i = atoi(optarg); /*set grat arp interval, in #sec*/ - if (i >= 0 && i < 256) arp_interval = i * 2; - else printf("Invalid arp interval -w %d, skipping\n",i); - break; - case 'x': fdebug = 1; break; - case 'z': flanstats = 1; break; - case 'D': lan_dhcp = 1; j++; break; - case 'O': flansecure = 1; j++; break; - case 'I': /* My BMC IP Address */ - fset_ip |= MYIP; - atoip(rgmyip,optarg); - j++; - break; - case 'M': /* My BMC MAC Address */ - atomac(rgmymac,optarg); - if (!MacIsValid(rgmymac)) printf("Invalid MAC for -M\n"); - j++; - break; - case 'S': /* Subnet IP Address */ - atoip(rgsubnet,optarg); - j++; - break; - case 'G': /* Gateway IP Address */ - fset_ip |= GWYIP; - atoip(rggwyip,optarg); - j++; - break; - case 'g': /* Secondary Gateway IP Address */ - fset_ip |= GWYIP; - atoip(rggwy2ip,optarg); - j++; - break; - case 'H': /* Gateway MAC Address */ - atomac(rggwymac,optarg); - if (!MacIsValid(rggwymac)) printf("Invalid MAC for -H\n"); - j++; - break; - case 'B': /* SOL Baud rate */ - fnewbaud = 1; - sol_baud = Str2Baud(optarg); - j++; - break; - case 'A': /* Alert Dest IP Address */ - fset_ip |= DESTIP; - /* allow name or ip here via Get_Mac() ? */ - atoip(rgdestip,optarg); - fpefenable = 1; /* PEF is implied here */ - j++; - break; - case 'X': /* Alert Dest MAC Address */ - atomac(rgdestmac,optarg); - if (!MacIsValid(rgdestmac)) printf("Invalid MAC for -X\n"); - fpefenable = 1; /* PEF is implied here */ - j++; - break; - case 'K': /* Kontron IPMI hostname */ - i = sizeof(rghostname); /*usu 18*/ - if (strlen(optarg) > (uint)i) optarg[i] = 0; - strcpy(rghostname,optarg); - j++; - break; - case 'C': /* Community String */ - fsetcommunity = 1; - i = sizeof(rgcommunity); /*usu 18*/ - if (strlen(optarg) > (uint)i) optarg[i] = 0; - strcpy(rgcommunity,optarg); - fpefenable = 1; /* PEF is implied here */ - j++; - break; - case 'u': /* username to set */ - myuser = strdup_(optarg); /*remote username */ - j++; - break; - case 'p': /* password to set */ - fpassword = 1; - if (strlen(optarg) > PSW_MAX) optarg[PSW_MAX] = 0; - strcpy(passwordData,optarg); - if (fdebug) printf("Password = %s\n",passwordData); - /* Hide password from 'ps' */ - memset(optarg, ' ', strlen(optarg)); - j++; - break; - case 'q': - case '#': - usernum = atob(optarg); - if (usernum > 15) usernum = 0; /*MAX_IPMI_USERS = 15*/ - j++; - break; - case 'L': - if (strcmp(optarg,"list") == 0) fshowchan = 1; - lan_ch_parm = atob(optarg); - if (lan_ch_parm > MAXCHAN) lan_ch_parm = PARM_INIT; /*invalid*/ - break; - case 'V': /* priv level */ - fprivset = 1; - case 'N': /* nodename */ - case 'U': /* remote username */ - case 'P': /* remote password */ - case 'R': /* remote password */ - case 'E': /* get password from IPMI_PASSWORD environment var */ - case 'F': /* force driver type */ - case 'T': /* auth type */ - case 'J': /* cipher suite */ - case 'Y': /* prompt for remote password */ - case 'Z': /* set local MC address */ - parse_lan_options(c,optarg,fdebug); - break; - default: - printf("Usage: %s [-abcdefghijklmnopq#rstuvwxyzBDQK]\n",progname); - printf(" \t [-a alertnum -i eth1 -n pefnum ]\n"); - printf(" \t [-I ipadr -M macadr -S subnet ]\n"); - printf(" \t [-G gwyip -H gwymac -L lan_channel_num]\n"); - printf(" \t [-A alertip -X alertmac -C community ]\n"); - printf(" \t [-g 2nd_gwyip -v priv -B sol_baud ]\n"); - printf(" \t [-j 10_bytes_custom_pef -b authmask ]\n"); - printf("where -c shows Canonical, simpler output format\n"); - printf(" -d Disables BMC LAN & PEF\n"); - printf(" -e Enables BMC LAN & PEF\n"); - printf(" -f set ARP Control to 1=grat, 2=resp, 3=both\n"); - printf(" -g secondary Gateway IP (-G=primary_gwy_ip)\n"); - printf(" -h VLAN ID (>=4096 to disable)\n"); - printf(" -j specify custom PEF rule (10 or 18 hex bytes)\n"); - printf(" -k add PEF oK rules, if PEF enable\n"); - printf(" -l Enables BMC LAN only, not PEF\n"); - printf(" -o disable Only SOL\n"); - printf(" -p password to set \n"); - printf(" -q/-# User number of LAN username_to_set\n"); - printf(" -r Read-only BMC LAN & PEF settings\n"); - printf(" -s Show some Serial settings also \n"); - printf(" -t Test if BMC LAN is already configured\n"); - printf(" -u username to set \n"); - printf(" -v access priVilege: 4=Admin,3=Operator,2=User\n"); - printf(" -w set Grat ARP Interval to specified # seconds\n"); - printf(" -x Show eXtra debug messages\n"); - printf(" -y OEM LAN Failover (1=enable,0=disable if Intel)\n"); - printf(" -z Show IPMI LAN statistics\n"); - printf(" -B Baud for SerialOverLan (19.2K,115.2K,...)\n"); - printf(" -D Use DHCP instead of static IP (-I for server)\n"); - printf(" -K (Kontron) IPMI hostname to set\n"); - printf(" -Q VLAN Priority (default =0)\n"); - printf(" -O Force LAN security: no null user, cipher 0 off\n"); - print_lan_opt_usage(0); - ret = ERR_USAGE; - goto do_exit; - } /*end switch*/ - nopts++; - } /*end while*/ - - if ((freadonly == FLAG_INIT) && (j > 0)) { - /* got some options implying set, but no -e -l -d option specified. */ - foptmsg = 1; /*show warning message later*/ - freadonly = 1; /*assume read only*/ - } - fipmilan = is_remote(); - if (fipmilan && !fprivset) - parse_lan_options('V',"4",0); /*even if freadonly request admin*/ - if ((fsetarp == 0) && ostype == OS_WINDOWS) - arp_ctl = 0x03; /*grat arp & arp resp enabled */ - - ret = GetDeviceID( &LanRecord); - if (ret != 0) { - goto do_exit; - } else { /* success */ - uchar ipmi_maj, ipmi_min; - ipmi_maj = LanRecord.data[4] & 0x0f; - ipmi_min = LanRecord.data[4] >> 4; - show_devid( LanRecord.data[2], LanRecord.data[3], ipmi_maj, ipmi_min); - if (ipmi_maj == 0) fIPMI10 = 1; - else if (ipmi_maj == 1 && ipmi_min < 5) fIPMI10 = 1; - else fIPMI10 = 0; /* >= IPMI 1.5 is ok */ - if (ipmi_maj >= 2) fIPMI20 = 1; - if (fIPMI20) show_users = 5; - else show_users = 3; - if (fIPMI10) { - printf("This IPMI v%d.%d system does not support PEF records.\n", - ipmi_maj,ipmi_min); - /* Wont handle PEF, but continue and look for BMC LAN anyway */ - // fIPMI10 = 1; - // ipmi_close_(); - // exit(1); - } - prod_id = LanRecord.data[9] + (LanRecord.data[10] << 8); - vend_id = LanRecord.data[6] + (LanRecord.data[7] << 8) - + (LanRecord.data[8] << 16); - /* check Device ID response for Manufacturer ID = 0x0322 (NSC) */ - if (vend_id == VENDOR_NSC) { /* NSC = 0x000322 */ - fmBMC = 1; /*NSC miniBMC*/ - if (pefnum == 12) pefnum = 10; /* change CritStop pefnum to 0x0a */ - pefdesc = &pefdesc2[0]; /*mini-BMC PEF*/ - pefmax = 30; - fsharedMAC = 1; /* shared MAC with OS */ - } else if (vend_id == VENDOR_LMC) { /* LMC (on SuperMicro) = 0x000878 */ - pefdesc = NULL; /* unknown, see PefDesc() */ - if (pefnum == 12) pefnum = 15; /* change CritStop pefnum */ - pefmax = 16; - fsharedMAC = 0; /* not-shared BMC LAN port */ - } else if (vend_id == VENDOR_INTEL) { /* Intel = 0x000157 */ - pefdesc = &pefdesc1[0]; /*default Intel PEF*/ - pefmax = 20; /*default Intel PEF*/ - switch(prod_id) { - case 0x4311: /* Intel NSI2U w SE7520JR23 */ - fmBMC = 1; /* Intel miniBMC*/ - if (pefnum == 12) pefnum = 14; /* change CritStop pefnum */ - pefdesc = &pefdesc2[0]; /*mini-BMC PEF*/ - pefmax = 30; - fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ - break; - case 0x0022: /* Intel TIGI2U w SE7520JR23 +IMM*/ - fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ - gcm_ch = 3; /* IMM GCM port, dedicated MAC */ - show_users = 4; - break; - case 0x000C: /*TSRLT2*/ - case 0x001B: /*TIGPR2U*/ - /* fmBMC=0; Intel Sahalee BMC*/ - fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ - break; - case 0x0026: /*S5000 Bridgeport*/ - case 0x0028: /*S5000PAL Alcolu*/ - case 0x0029: /*S5000PSL StarLake*/ - case 0x0811: /*S5000PHB TIGW1U */ - /* fmBMC=0; Intel Sahalee ESB2 BMC*/ - fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ - gcm_ch = 3; - parm7 = &iparm7[0]; /*TTL=30*/ - break; - case 0x003E: /*NSN2U or CG2100 Urbanna*/ - fiBMC = 1; /* Intel iBMC */ - fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ - // gcm_ch = 3; - parm7 = &iparm7[0]; /*TTL=30*/ - if (fsetarp == 0) - arp_ctl = 0x02; /*grat arp disabled, arp resp enabled */ - arp_interval = 0x00; /*0 sec, since grat arp disabled */ - sol_accum[0] = 0x0c; /*Intel defaults*/ - sol_accum[1] = 0x60; /*Intel defaults*/ - sol_retry[0] = 0x07; /*Intel defaults*/ - sol_retry[1] = 0x32; /*Intel defaults*/ - set_max_kcs_loops(URNLOOPS); /*longer for SetLan cmds (default 300)*/ - break; - case 0x0107: /* Intel Caneland*/ - fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ - gcm_ch = 3; - break; - case 0x0100: /*Tiger2 ia64*/ - /* for ia64 set chan_pefon, chan_pefoff accordingly*/ - chan_pefon = CHAN_ACC_PEFON64; - chan_pefoff = CHAN_ACC_PEFOFF64; - /* fall through */ - default: /* else other Intel */ - /* fmBMC = 0; * Intel Sahalee BMC*/ - if (fIPMI20) fsharedMAC = 0; /* recent, not-shared BMC MAC */ - else fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */ - break; - } /*end switch*/ - if (is_romley(vend_id,prod_id)) fRomley = 1; - if (is_grantley(vend_id,prod_id)) fGrantley = 1; - if (fRomley) { - fiBMC = 1; /* Intel iBMC */ - fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ - set_max_kcs_loops(URNLOOPS); /*longer for SetLan (default 300)*/ - fipv6 = 1; - if (fsetarp == 0) arp_ctl = 0x03; /*default to both for Romley*/ - } - } else { /* else other vendors */ - if (fIPMI20) fsharedMAC = 0; /* recent, not-shared BMC MAC */ - else fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */ - pefdesc = NULL; /* unknown, see PefDesc() */ - if (pefnum == 12) pefnum = 15; /* change CritStop pefnum to 15? */ - pefmax = 20; - if (!fUserPefNum) fAdjustPefNum = 1; + int ret; + PEF_RECORD PefRecord; + LAN_RECORD LanRecord; + int i, idx, j; + int c; + char *pstr; + uchar bset; + int ndest = 4; + int idest; + char mystr[80]; + char fpefok = 1; + uchar *pc; + int sz; + char *pa; + char *pb; + + // progname = argv[0]; + printf ("%s ver %s \n", progname, progver); + j = 0; + freadonly = FLAG_INIT; + idx = argc; /*getopt loop counter */ + /* available opt chars: y O Q + = ~ _ */ + while ((c = + getopt (argc, argv, + "a:b:cdef:gh:i:j:klm:n:op:q:rstu:v:w:xy:z#::A:B:C:DEF:G:H:I:J:K:L:M:N:OP:Q:R:S:T:U:V:X:YZ:?")) + != EOF) { + switch (c) { + case 'a': /* alert dest number (usu 1 thru 4) */ + alertnum = atob (optarg); + if (alertnum > alertmax) + alertnum = 1; + j++; + break; + case 'b': + bAuth = htoi (optarg); + j++; + break; /*undocumented */ + case 'c': + fcanonical = 1; + bdelim = BDELIM; + break; + case 'd': + fenable = 0; + fdisable = 1; + freadonly = 0; + break; + case 'e': + fenable = 1; + fdisable = 0; + freadonly = 0; + break; + case 'f': + i = atoi (optarg); /*set arp_ctl */ + if (i < 0 || i > 3) + printf ("Invalid ARP control %d\n", i); + else { + arp_ctl = i; + fsetarp = 1; + j++; } - if (fmBMC) show_users = 1; /* mBMC doesn't support more than 1 user */ - } - - if (fshowchan) { - ret = show_channels(); - exit(ret); - } - - ret = GetPefCapabilities(&bset); - if ((ret == 0) && (bset <= MAXPEF)) pefmax = bset; - - /* Get the BMC LAN channel & match it to an OS eth if. */ - i = GetBmcEthDevice(lan_ch_parm); - if (i == -2) { /* no lan channels found (see lan_ch) */ - if (lan_ch_parm == PARM_INIT) - printf("This system does not support IPMI LAN channels.\n"); - else /*specified a LAN channel*/ - printf("BMC channel %d does not support IPMI LAN.\n",lan_ch_parm); - ret = LAN_ERR_NOTSUPPORT; - goto do_exit; - } else if (i < 0) { /* mac not found, use platform defaults */ - i = 0; /* default to eth0, lan_ch set already. */ - if (vend_id == VENDOR_INTEL) { - if ((prod_id == 0x001B) || (prod_id == 0x000c)) { - /* Intel TIGPR2U or TSRLT2 defaults are special */ - if (lan_ch_parm == 6) - { i = 0; lan_ch = 6; } - else { i = 1; lan_ch = 7; } - ser_ch = 1; - } - } - } - if ((i == gcm_ch) && (gcm_ch != PARM_INIT) && (lan_ch_parm == PARM_INIT)) { - /* Has a GCM, defaulted to it, and user didn't specify -L */ - /* Need this to avoid picking channel 3, the IMM/RMM GCM channel. */ - lan_ch = 1; /*default BMC LAN channel*/ - // i = 0; /*default eth0 (was eth1) */ - } - if (fsetifn == 0) { /*not user specified, use the detected one*/ - // if (lan_ch == gcm_ch) strcpy(ifname,"gcm"); - sprintf(ifname,"%s%d",ifpattn,i); /*eth%d*/ - } - if (fdebug) printf("lan_ch = %d, ifname = %s\n",lan_ch,ifname); - - /* set the lan_user appropriately */ - if (myuser == NULL) { /* if no -u param */ - if (ipmi_reserved_user(vend_id, 1)) lan_user = 2; - else if (flansecure) lan_user = 2; - else lan_user = 1; /*use default null user */ - } else if (usernum != 0) lan_user = usernum; /*use -q specified usernum*/ - /* else use default lan_user (=2) if -u and not -q */ - - if (ftestonly) { /*test only if BMC LAN is configured or not */ - /* TODO: test gcm also, if present */ - ret = GetLanEntry(4, 0, &LanRecord); /*ip addr src*/ - if (ret == 0) { - if ((LanRecord.data[0] == SRC_BIOS) || - (LanRecord.data[0] == SRC_DHCP)) ret = 0; /* DHCP, so ok */ - else { /*static IP*/ - ret = GetLanEntry(3, 0, &LanRecord); /* ip address */ - if (ret == 0) { - if (!IpIsValid(LanRecord.data)) { - printf("invalid BMC IP address\n"); - ret = 1; /* invalid ip */ - } else ret = GetLanEntry(12, 0, &LanRecord); /*gateway ip*/ - if (ret == 0) { - if (!IpIsValid(LanRecord.data)) { - printf("invalid gateway ip\n"); - ret = 2; /*invalid gwy ip*/ - } else ret = GetLanEntry(13, 0, &LanRecord); - if (ret == 0) { - if (!MacIsValid(&LanRecord.data[0])) { - printf("invalid gateway mac\n"); - ret = 3; /*invalid gwy mac */ - } - } - } + break; + case 'l': + fpefenable = 0; + fenable = 2; + fdisable = 0; + freadonly = 0; + break; + case 'h': /* VLAN ID */ + i = atoi (optarg); + if (i > 4095) + vlan_enable = 0; + else { + vlan_enable = 1; + vlan_id = (ushort) i; + } + j++; + break; + case 'y': /* OEM LAN Failover enable/disable */ + i = atoi (optarg); + if (i < 0) + printf ("Failover(-y) parameter is negative\n"); + else + failover_enable = i; + j++; + break; + case 'Q': /* VLAN Priority */ + i = atoi (optarg); + if (i > 7 || i < 0) + vlan_enable = 0; + else { + vlan_enable = 1; + vlan_prio = (uchar) i; + } + j++; + break; + case 'i': /* eth interface (ifname) */ + fsetifn = 1; + i = sizeof (ifname); + if (strlen (optarg) > (uint) i) + optarg[i] = 0; + strcpy (ifname, optarg); + if (fdebug) + printf ("ifname = %s\n", ifname); + j++; + break; + case 'j': + fCustomPEF = 1; /*custom 10 PEF bytes */ + fpefenable = 1; /* PEF is implied here */ + freadonly = 0; + memset (custPEF, 0, sizeof (custPEF)); + custPEF[0] = htoi (&optarg[0]); /*action */ + custPEF[1] = htoi (&optarg[2]); /*policy */ + custPEF[2] = htoi (&optarg[4]); /*severity */ + custPEF[3] = htoi (&optarg[6]); /*genid1 */ + custPEF[4] = htoi (&optarg[8]); /*genid2 */ + custPEF[5] = htoi (&optarg[10]); /*sensor_type */ + custPEF[6] = htoi (&optarg[12]); /*sensor_num */ + custPEF[7] = htoi (&optarg[14]); /*evt_trigger */ + custPEF[8] = htoi (&optarg[16]); /*data1offset */ + custPEF[9] = htoi (&optarg[18]); /*data1mask */ + if (optarg[20] != 0) { + /* optionally get 8 extra PEF entry bytes */ + custPEF[10] = htoi (&optarg[20]); /*data1cmp1 */ + custPEF[11] = htoi (&optarg[22]); /*data1cmp2 */ + custPEF[12] = htoi (&optarg[24]); /*data2mask */ + custPEF[13] = htoi (&optarg[26]); /*data2cmp1 */ + custPEF[14] = htoi (&optarg[28]); /*data2cmp2 */ + custPEF[15] = htoi (&optarg[30]); /*data3mask */ + custPEF[16] = htoi (&optarg[32]); /*data3cmp1 */ + custPEF[17] = htoi (&optarg[34]); /*data3cmp2 */ + } + j++; + break; + case 'k': + fSetPEFOks = 1; + j++; + break; /*configure PEF OK rules */ + case 'm': + set_max_kcs_loops (atoi (optarg)); + break; + case 'n': /* number/index in PEF table to insert new entry */ + fpefenable = 1; + pefnum = atob (optarg); + if (pefnum >= MAXPEF) { + pefnum = MAXPEF - 1; + fAdjustPefNum = 1; + } + else + fUserPefNum = 1; + j++; + break; + case 'o': + fdisableSOL = 1; /*disable SOL only */ + fpefenable = 0; /*no change to PEF */ + freadonly = 0; + break; + case 'r': + freadonly = 1; + fenable = 0; + break; + case 's': + fgetser = 1; + break; + case 't': + ftestonly = 1; + freadonly = 1; + break; + case 'v': /* user access privilege level */ + i = atoi (optarg); + if (valid_priv (i)) + lan_access = i & 0x0f; + else + printf ("Invalid privilege -v %d, using Admin\n", i); + j++; + break; + case 'w': + i = atoi (optarg); /*set grat arp interval, in #sec */ + if (i >= 0 && i < 256) + arp_interval = i * 2; + else + printf ("Invalid arp interval -w %d, skipping\n", i); + break; + case 'x': + fdebug = 1; + break; + case 'z': + flanstats = 1; + break; + case 'D': + lan_dhcp = 1; + j++; + break; + case 'O': + flansecure = 1; + j++; + break; + case 'I': /* My BMC IP Address */ + fset_ip |= MYIP; + atoip (rgmyip, optarg); + j++; + break; + case 'M': /* My BMC MAC Address */ + atomac (rgmymac, optarg); + if (!MacIsValid (rgmymac)) + printf ("Invalid MAC for -M\n"); + j++; + break; + case 'S': /* Subnet IP Address */ + atoip (rgsubnet, optarg); + j++; + break; + case 'G': /* Gateway IP Address */ + fset_ip |= GWYIP; + atoip (rggwyip, optarg); + j++; + break; + case 'g': /* Secondary Gateway IP Address */ + fset_ip |= GWYIP; + atoip (rggwy2ip, optarg); + j++; + break; + case 'H': /* Gateway MAC Address */ + atomac (rggwymac, optarg); + if (!MacIsValid (rggwymac)) + printf ("Invalid MAC for -H\n"); + j++; + break; + case 'B': /* SOL Baud rate */ + fnewbaud = 1; + sol_baud = Str2Baud (optarg); + j++; + break; + case 'A': /* Alert Dest IP Address */ + fset_ip |= DESTIP; + /* allow name or ip here via Get_Mac() ? */ + atoip (rgdestip, optarg); + fpefenable = 1; /* PEF is implied here */ + j++; + break; + case 'X': /* Alert Dest MAC Address */ + atomac (rgdestmac, optarg); + if (!MacIsValid (rgdestmac)) + printf ("Invalid MAC for -X\n"); + fpefenable = 1; /* PEF is implied here */ + j++; + break; + case 'K': /* Kontron IPMI hostname */ + i = sizeof (rghostname); /*usu 18 */ + if (strlen (optarg) > (uint) i) + optarg[i] = 0; + strcpy (rghostname, optarg); + j++; + break; + case 'C': /* Community String */ + fsetcommunity = 1; + i = sizeof (rgcommunity); /*usu 18 */ + if (strlen (optarg) > (uint) i) + optarg[i] = 0; + strcpy (rgcommunity, optarg); + fpefenable = 1; /* PEF is implied here */ + j++; + break; + case 'u': /* username to set */ + myuser = strdup_ (optarg); /*remote username */ + j++; + break; + case 'p': /* password to set */ + fpassword = 1; + if (strlen (optarg) > PSW_MAX) + optarg[PSW_MAX] = 0; + strcpy (passwordData, optarg); + if (fdebug) + printf ("Password = %s\n", passwordData); + /* Hide password from 'ps' */ + memset (optarg, ' ', strlen (optarg)); + j++; + break; + case 'q': + case '#': + usernum = atob (optarg); + if (usernum > 15) + usernum = 0; /*MAX_IPMI_USERS = 15 */ + j++; + break; + case 'L': + if (strcmp (optarg, "list") == 0) + fshowchan = 1; + lan_ch_parm = atob (optarg); + if (lan_ch_parm > MAXCHAN) + lan_ch_parm = PARM_INIT; /*invalid */ + break; + case 'V': /* priv level */ + fprivset = 1; + case 'N': /* nodename */ + case 'U': /* remote username */ + case 'P': /* remote password */ + case 'R': /* remote password */ + case 'E': /* get password from IPMI_PASSWORD environment var */ + case 'F': /* force driver type */ + case 'T': /* auth type */ + case 'J': /* cipher suite */ + case 'Y': /* prompt for remote password */ + case 'Z': /* set local MC address */ + parse_lan_options (c, optarg, fdebug); + break; + default: + printf ("Usage: %s [-abcdefghijklmnopq#rstuvwxyzBDQK]\n", progname); + printf (" \t [-a alertnum -i eth1 -n pefnum ]\n"); + printf (" \t [-I ipadr -M macadr -S subnet ]\n"); + printf (" \t [-G gwyip -H gwymac -L lan_channel_num]\n"); + printf (" \t [-A alertip -X alertmac -C community ]\n"); + printf (" \t [-g 2nd_gwyip -v priv -B sol_baud ]\n"); + printf (" \t [-j 10_bytes_custom_pef -b authmask ]\n"); + printf ("where -c shows Canonical, simpler output format\n"); + printf (" -d Disables BMC LAN & PEF\n"); + printf (" -e Enables BMC LAN & PEF\n"); + printf (" -f set ARP Control to 1=grat, 2=resp, 3=both\n"); + printf (" -g secondary Gateway IP (-G=primary_gwy_ip)\n"); + printf (" -h VLAN ID (>=4096 to disable)\n"); + printf (" -j specify custom PEF rule (10 or 18 hex bytes)\n"); + printf (" -k add PEF oK rules, if PEF enable\n"); + printf (" -l Enables BMC LAN only, not PEF\n"); + printf (" -o disable Only SOL\n"); + printf (" -p password to set \n"); + printf (" -q/-# User number of LAN username_to_set\n"); + printf (" -r Read-only BMC LAN & PEF settings\n"); + printf (" -s Show some Serial settings also \n"); + printf (" -t Test if BMC LAN is already configured\n"); + printf (" -u username to set \n"); + printf (" -v access priVilege: 4=Admin,3=Operator,2=User\n"); + printf (" -w set Grat ARP Interval to specified # seconds\n"); + printf (" -x Show eXtra debug messages\n"); + printf (" -y OEM LAN Failover (1=enable,0=disable if Intel)\n"); + printf (" -z Show IPMI LAN statistics\n"); + printf (" -B Baud for SerialOverLan (19.2K,115.2K,...)\n"); + printf (" -D Use DHCP instead of static IP (-I for server)\n"); + printf (" -K (Kontron) IPMI hostname to set\n"); + printf (" -Q VLAN Priority (default =0)\n"); + printf (" -O Force LAN security: no null user, cipher 0 off\n"); + print_lan_opt_usage (0); + ret = ERR_USAGE; + goto do_exit; + } /*end switch */ + nopts++; + } /*end while */ + + if ((freadonly == FLAG_INIT) && (j > 0)) { + /* got some options implying set, but no -e -l -d option specified. */ + foptmsg = 1; /*show warning message later */ + freadonly = 1; /*assume read only */ + } + fipmilan = is_remote (); + if (fipmilan && !fprivset) + parse_lan_options ('V', "4", 0); /*even if freadonly request admin */ + if ((fsetarp == 0) && ostype == OS_WINDOWS) + arp_ctl = 0x03; /*grat arp & arp resp enabled */ + + ret = GetDeviceID (&LanRecord); + if (ret != 0) { + goto do_exit; + } + else { /* success */ + uchar ipmi_maj, ipmi_min; + ipmi_maj = LanRecord.data[4] & 0x0f; + ipmi_min = LanRecord.data[4] >> 4; + show_devid (LanRecord.data[2], LanRecord.data[3], ipmi_maj, ipmi_min); + if (ipmi_maj == 0) + fIPMI10 = 1; + else if (ipmi_maj == 1 && ipmi_min < 5) + fIPMI10 = 1; + else + fIPMI10 = 0; /* >= IPMI 1.5 is ok */ + if (ipmi_maj >= 2) + fIPMI20 = 1; + if (fIPMI20) + show_users = 5; + else + show_users = 3; + if (fIPMI10) { + printf ("This IPMI v%d.%d system does not support PEF records.\n", + ipmi_maj, ipmi_min); + /* Wont handle PEF, but continue and look for BMC LAN anyway */ + // fIPMI10 = 1; + // ipmi_close_(); + // exit(1); + } + prod_id = LanRecord.data[9] + (LanRecord.data[10] << 8); + vend_id = LanRecord.data[6] + (LanRecord.data[7] << 8) + + (LanRecord.data[8] << 16); + /* check Device ID response for Manufacturer ID = 0x0322 (NSC) */ + if (vend_id == VENDOR_NSC) { /* NSC = 0x000322 */ + fmBMC = 1; /*NSC miniBMC */ + if (pefnum == 12) + pefnum = 10; /* change CritStop pefnum to 0x0a */ + pefdesc = &pefdesc2[0]; /*mini-BMC PEF */ + pefmax = 30; + fsharedMAC = 1; /* shared MAC with OS */ + } + else if (vend_id == VENDOR_LMC) { /* LMC (on SuperMicro) = 0x000878 */ + pefdesc = NULL; /* unknown, see PefDesc() */ + if (pefnum == 12) + pefnum = 15; /* change CritStop pefnum */ + pefmax = 16; + fsharedMAC = 0; /* not-shared BMC LAN port */ + } + else if (vend_id == VENDOR_INTEL) { /* Intel = 0x000157 */ + pefdesc = &pefdesc1[0]; /*default Intel PEF */ + pefmax = 20; /*default Intel PEF */ + switch (prod_id) { + case 0x4311: /* Intel NSI2U w SE7520JR23 */ + fmBMC = 1; /* Intel miniBMC */ + if (pefnum == 12) + pefnum = 14; /* change CritStop pefnum */ + pefdesc = &pefdesc2[0]; /*mini-BMC PEF */ + pefmax = 30; + fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ + break; + case 0x0022: /* Intel TIGI2U w SE7520JR23 +IMM */ + fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ + gcm_ch = 3; /* IMM GCM port, dedicated MAC */ + show_users = 4; + break; + case 0x000C: /*TSRLT2 */ + case 0x001B: /*TIGPR2U */ + /* fmBMC=0; Intel Sahalee BMC */ + fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ + break; + case 0x0026: /*S5000 Bridgeport */ + case 0x0028: /*S5000PAL Alcolu */ + case 0x0029: /*S5000PSL StarLake */ + case 0x0811: /*S5000PHB TIGW1U */ + /* fmBMC=0; Intel Sahalee ESB2 BMC */ + fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ + gcm_ch = 3; + parm7 = &iparm7[0]; /*TTL=30 */ + break; + case 0x003E: /*NSN2U or CG2100 Urbanna */ + fiBMC = 1; /* Intel iBMC */ + fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ + // gcm_ch = 3; + parm7 = &iparm7[0]; /*TTL=30 */ + if (fsetarp == 0) + arp_ctl = 0x02; /*grat arp disabled, arp resp enabled */ + arp_interval = 0x00; /*0 sec, since grat arp disabled */ + sol_accum[0] = 0x0c; /*Intel defaults */ + sol_accum[1] = 0x60; /*Intel defaults */ + sol_retry[0] = 0x07; /*Intel defaults */ + sol_retry[1] = 0x32; /*Intel defaults */ + set_max_kcs_loops (URNLOOPS); /*longer for SetLan cmds (default 300) */ + break; + case 0x0107: /* Intel Caneland */ + fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ + gcm_ch = 3; + break; + case 0x0100: /*Tiger2 ia64 */ + /* for ia64 set chan_pefon, chan_pefoff accordingly */ + chan_pefon = CHAN_ACC_PEFON64; + chan_pefoff = CHAN_ACC_PEFOFF64; + /* fall through */ + default: /* else other Intel */ + /* fmBMC = 0; * Intel Sahalee BMC */ + if (fIPMI20) + fsharedMAC = 0; /* recent, not-shared BMC MAC */ + else + fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */ + break; + } /*end switch */ + if (is_romley (vend_id, prod_id)) + fRomley = 1; + if (is_grantley (vend_id, prod_id)) + fGrantley = 1; + if (fRomley) { + fiBMC = 1; /* Intel iBMC */ + fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ + set_max_kcs_loops (URNLOOPS); /*longer for SetLan (default 300) */ + fipv6 = 1; + if (fsetarp == 0) + arp_ctl = 0x03; /*default to both for Romley */ + } + } + else { /* else other vendors */ + if (fIPMI20) + fsharedMAC = 0; /* recent, not-shared BMC MAC */ + else + fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */ + pefdesc = NULL; /* unknown, see PefDesc() */ + if (pefnum == 12) + pefnum = 15; /* change CritStop pefnum to 15? */ + pefmax = 20; + if (!fUserPefNum) + fAdjustPefNum = 1; + } + if (fmBMC) + show_users = 1; /* mBMC doesn't support more than 1 user */ + } + + if (fshowchan) { + ret = show_channels (); + exit (ret); + } + + ret = GetPefCapabilities (&bset); + if ((ret == 0) && (bset <= MAXPEF)) + pefmax = bset; + + /* Get the BMC LAN channel & match it to an OS eth if. */ + i = GetBmcEthDevice (lan_ch_parm, &lan_ch); + if (i == -2) { /* no lan channels found (see lan_ch) */ + if (lan_ch_parm == PARM_INIT) + printf ("This system does not support IPMI LAN channels.\n"); + else /*specified a LAN channel */ + printf ("BMC channel %d does not support IPMI LAN.\n", lan_ch_parm); + ret = LAN_ERR_NOTSUPPORT; + goto do_exit; + } + else if (i < 0) { /* mac not found, use platform defaults */ + i = 0; /* default to eth0, lan_ch set already. */ + if (vend_id == VENDOR_INTEL) { + if ((prod_id == 0x001B) || (prod_id == 0x000c)) { + /* Intel TIGPR2U or TSRLT2 defaults are special */ + if (lan_ch_parm == 6) { + i = 0; + lan_ch = 6; + } + else { + i = 1; + lan_ch = 7; + } + ser_ch = 1; + } + } + } + if ((i == gcm_ch) && (gcm_ch != PARM_INIT) && (lan_ch_parm == PARM_INIT)) { + /* Has a GCM, defaulted to it, and user didn't specify -L */ + /* Need this to avoid picking channel 3, the IMM/RMM GCM channel. */ + lan_ch = 1; /*default BMC LAN channel */ + // i = 0; /*default eth0 (was eth1) */ + } + if (fsetifn == 0) { /*not user specified, use the detected one */ + // if (lan_ch == gcm_ch) strcpy(ifname,"gcm"); + sprintf (ifname, "%s%d", ifpattn, i); /*eth%d */ + } + if (fdebug) + printf ("lan_ch = %d, ifname = %s\n", lan_ch, ifname); + + /* set the lan_user appropriately */ + if (myuser == NULL) { /* if no -u param */ + if (ipmi_reserved_user (vend_id, 1)) + lan_user = 2; + else if (flansecure) + lan_user = 2; + else + lan_user = 1; /*use default null user */ + } + else if (usernum != 0) + lan_user = usernum; /*use -q specified usernum */ + /* else use default lan_user (=2) if -u and not -q */ + + if (ftestonly) { /*test only if BMC LAN is configured or not */ + /* TODO: test gcm also, if present */ + ret = GetLanEntry (4, 0, &LanRecord); /*ip addr src */ + if (ret == 0) { + if ((LanRecord.data[0] == SRC_BIOS) || (LanRecord.data[0] == SRC_DHCP)) + ret = 0; /* DHCP, so ok */ + else { /*static IP */ + ret = GetLanEntry (3, 0, &LanRecord); /* ip address */ + if (ret == 0) { + if (!IpIsValid (LanRecord.data)) { + printf ("invalid BMC IP address\n"); + ret = 1; /* invalid ip */ + } + else + ret = GetLanEntry (12, 0, &LanRecord); /*gateway ip */ + if (ret == 0) { + if (!IpIsValid (LanRecord.data)) { + printf ("invalid gateway ip\n"); + ret = 2; /*invalid gwy ip */ + } + else + ret = GetLanEntry (13, 0, &LanRecord); + if (ret == 0) { + if (!MacIsValid (&LanRecord.data[0])) { + printf ("invalid gateway mac\n"); + ret = 3; /*invalid gwy mac */ + } } - } - } /*endif GetLanEntry ok*/ - if (ret == 0) printf("BMC LAN already configured\n"); - else printf("BMC LAN not configured\n"); + } + } + } + } /*endif GetLanEntry ok */ + if (ret == 0) + printf ("BMC LAN already configured\n"); + else + printf ("BMC LAN not configured\n"); + goto do_exit; + } /*endif ftestonly */ + + memset (SessInfo, 0, sizeof (SessInfo)); + ret = GetSessionInfo (SessInfo, sizeof (SessInfo)); + // rlen = sizeof(SessInfo)); ret = get_session_info(0,0,SessInfo,&rlen); + if (fdebug) + printf ("GetSessionInfo ret=%d, data: %02x %02x %02x %02x \n", + ret, SessInfo[0], SessInfo[1], SessInfo[2], SessInfo[3]); + if (!freadonly && fipmilan) { /* setting LAN params, and using IPMI LAN */ + if (SessInfo[2] > 1) { /* another session is active also */ + printf + ("Another session is also active, cannot change IPMI LAN settings now.\n"); + ret = ERR_NOT_ALLOWED; goto do_exit; - } /*endif ftestonly*/ - - memset(SessInfo,0,sizeof(SessInfo)); - ret = GetSessionInfo(SessInfo,sizeof(SessInfo)); - // rlen = sizeof(SessInfo)); ret = get_session_info(0,0,SessInfo,&rlen); - if (fdebug) printf("GetSessionInfo ret=%d, data: %02x %02x %02x %02x \n", - ret,SessInfo[0],SessInfo[1],SessInfo[2],SessInfo[3]); - if (!freadonly && fipmilan) { /* setting LAN params, and using IPMI LAN */ - if (SessInfo[2] > 1) { /* another session is active also */ - printf("Another session is also active, cannot change IPMI LAN settings now.\n"); - ret = ERR_NOT_ALLOWED; - goto do_exit; + } + } + + if (!fIPMI10) { + if (fcanonical) { /* canonical/simple output */ + ret = GetPefEntry (0x01, 0, (PEF_RECORD *) & LanRecord); + if (ret != 0) + ndest = 0; + else { /*success */ + j = LanRecord.data[0]; + mystr[0] = 0; + if (j == 0) + strcat (mystr, "none "); + else { + if (j & 0x01) + strcat (mystr, "PEFenable "); + if (j & 0x02) + strcat (mystr, "DoEventMsgs "); + if (j & 0x04) + strcat (mystr, "Delay "); + if (j & 0x08) + strcat (mystr, "AlertDelay "); + } + printf ("PEF Control %s%c %s\n", pspace4, bdelim, mystr); + } + } + else { /* normal/full output */ + ret = GetPefEntry (0x01, 0, (PEF_RECORD *) & LanRecord); + if (ret == 0 && (LanRecord.data[0] != 0)) { + fpefok = 1; + bmcpefctl = LanRecord.data[0]; } - } - - if (!fIPMI10) { - if (fcanonical) - { /* canonical/simple output */ - ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord); - if (ret != 0) ndest = 0; - else { /*success*/ - j = LanRecord.data[0]; - mystr[0] = 0; - if (j == 0) strcat(mystr,"none "); - else { - if (j & 0x01) strcat(mystr,"PEFenable "); - if (j & 0x02) strcat(mystr,"DoEventMsgs "); - if (j & 0x04) strcat(mystr,"Delay "); - if (j & 0x08) strcat(mystr,"AlertDelay "); - } - printf("PEF Control %s%c %s\n",pspace4,bdelim,mystr); - } - } else { /* normal/full output */ - ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord); - if (ret == 0 && (LanRecord.data[0] != 0)) { - fpefok = 1; - bmcpefctl = LanRecord.data[0]; - } else { /* skip PEF rules/params if disabled */ - printf("PEF Control %s%c %s\n",pspace4,bdelim,"none "); - ndest = 0; - fpefok = 0; - } - - if (fpefok) { - printf("%s, GetPefEntry ...\n",progname); - for (idx = 1; idx <= pefmax; idx++) - { - ret = GetPefEntry( 0x06, (ushort)idx, &PefRecord); - if (ret == 0) { // Show the PEF record - pc = (uchar *)&PefRecord; - sz = 21; // sizeof(PEF_RECORD) = 21 + else { /* skip PEF rules/params if disabled */ + printf ("PEF Control %s%c %s\n", pspace4, bdelim, "none "); + ndest = 0; + fpefok = 0; + } + + if (fpefok) { + printf ("%s, GetPefEntry ...\n", progname); + for (idx = 1; idx <= pefmax; idx++) { + ret = GetPefEntry (0x06, (ushort) idx, &PefRecord); + if (ret == 0) { // Show the PEF record + pc = (uchar *) & PefRecord; + sz = 21; // sizeof(PEF_RECORD) = 21 if (PefRecord.sensor_type == 0) { - if (idx <= pefnum) - printf("PEFilter(%02d): empty\n",idx); - memcpy(pef_array[idx-1], &PefRecord, sz); - if (fAdjustPefNum) pefnum = (char)idx; - } else { - memcpy(pef_array[idx-1], &PefRecord, sz); - if (PefRecord.fconfig & 0x80) pb = "enabled"; - else pb = "disabled"; + if (idx <= pefnum) + printf ("PEFilter(%02d): empty\n", idx); + memcpy (pef_array[idx - 1], &PefRecord, sz); + if (fAdjustPefNum) + pefnum = (char) idx; + } + else { + memcpy (pef_array[idx - 1], &PefRecord, sz); + if (PefRecord.fconfig & 0x80) + pb = "enabled"; + else + pb = "disabled"; i = PefRecord.rec_id; - switch(PefRecord.action) { - case 0x01: pa = "alert"; break; - case 0x02: pa = "poweroff"; break; - case 0x04: pa = "reset"; break; - case 0x08: pa = "powercycle"; break; - case 0x10: pa = "OEMaction"; break; - case 0x20: pa = "NMI"; break; - default: pa = "no action"; - } - printf("PEFilter(%02d): %02x %s event - %s for %s\n", - idx, PefRecord.sensor_type, - PefDesc(i,PefRecord.sensor_type), pb,pa); + switch (PefRecord.action) { + case 0x01: + pa = "alert"; + break; + case 0x02: + pa = "poweroff"; + break; + case 0x04: + pa = "reset"; + break; + case 0x08: + pa = "powercycle"; + break; + case 0x10: + pa = "OEMaction"; + break; + case 0x20: + pa = "NMI"; + break; + default: + pa = "no action"; + } + printf ("PEFilter(%02d): %02x %s event - %s for %s\n", + idx, PefRecord.sensor_type, + PefDesc (i, PefRecord.sensor_type), pb, pa); } - if (fdebug) { /* show raw PEFilter record */ - pc = &PefRecord.rec_id; - printf("raw PEF(%.2d): ",pc[0]); - for (i = 0; i < sz; i++) printf("%02x ",pc[i]); - printf("\n"); + if (fdebug) { /* show raw PEFilter record */ + pc = &PefRecord.rec_id; + printf ("raw PEF(%.2d): ", pc[0]); + for (i = 0; i < sz; i++) + printf ("%02x ", pc[i]); + printf ("\n"); } - } else { - printf("GetPefEntry(%d), ret = %d\n",idx,ret); - if (ret == 0xC1) { /*PEF is not supported, so skip the rest. */ - fpefok = 0; - ndest = 0; /* if no PEF, no alerts & no alert dest */ - break; + } + else { + printf ("GetPefEntry(%d), ret = %d\n", idx, ret); + if (ret == 0xC1) { /*PEF is not supported, so skip the rest. */ + fpefok = 0; + ndest = 0; /* if no PEF, no alerts & no alert dest */ + break; } - } - } - } /*endif fpefok*/ - if (fpefok) { - if (fdebug) ShowPef(); - ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord); - if (ret == 0) { - j = LanRecord.data[0]; - mystr[0] = 0; - if (j & 0x01) strcat(mystr,"PEFenable "); - if (j & 0x02) strcat(mystr,"DoEventMsgs "); - if (j & 0x04) strcat(mystr,"Delay "); - if (j & 0x08) strcat(mystr,"AlertDelay "); - printf("PEF Control: %02x : %s\n",j, mystr); - } - ret = GetPefEntry(0x02, 0,(PEF_RECORD *)&LanRecord); - if (ret == 0) { - j = LanRecord.data[0]; - mystr[0] = 0; - if (j & 0x01) strcat(mystr,"Alert "); - if (j & 0x02) strcat(mystr,"PwrDn "); - if (j & 0x04) strcat(mystr,"Reset "); - if (j & 0x08) strcat(mystr,"PwrCyc "); - if (j & 0x10) strcat(mystr,"OEM "); - if (j & 0x20) strcat(mystr,"DiagInt "); - printf("PEF Actions: %02x : %s\n",j, mystr); - } - ret = GetPefEntry(0x03, 0,(PEF_RECORD *)&LanRecord); - if (ret == 0) printf("PEF Startup Delay: %02x : %d sec\n", - LanRecord.data[0],LanRecord.data[0]); - if (!fmBMC) { - ret = GetPefEntry(0x04, 0,(PEF_RECORD *)&LanRecord); - if (ret == 0) printf("PEF Alert Startup Delay: %02x: %d sec\n", - LanRecord.data[0],LanRecord.data[0]); - /* fmBMC gets cc=0x80 here */ - } - /* note that ndest should be read from lan param 17 below. */ - for (i = 1; i <= ndest; i++) - { - ret = GetPefEntry(0x09, (ushort)i,(PEF_RECORD *)&LanRecord); - if (ret == 0) { + } + } + } /*endif fpefok */ + if (fpefok) { + if (fdebug) + ShowPef (); + ret = GetPefEntry (0x01, 0, (PEF_RECORD *) & LanRecord); + if (ret == 0) { + j = LanRecord.data[0]; + mystr[0] = 0; + if (j & 0x01) + strcat (mystr, "PEFenable "); + if (j & 0x02) + strcat (mystr, "DoEventMsgs "); + if (j & 0x04) + strcat (mystr, "Delay "); + if (j & 0x08) + strcat (mystr, "AlertDelay "); + printf ("PEF Control: %02x : %s\n", j, mystr); + } + ret = GetPefEntry (0x02, 0, (PEF_RECORD *) & LanRecord); + if (ret == 0) { + j = LanRecord.data[0]; + mystr[0] = 0; + if (j & 0x01) + strcat (mystr, "Alert "); + if (j & 0x02) + strcat (mystr, "PwrDn "); + if (j & 0x04) + strcat (mystr, "Reset "); + if (j & 0x08) + strcat (mystr, "PwrCyc "); + if (j & 0x10) + strcat (mystr, "OEM "); + if (j & 0x20) + strcat (mystr, "DiagInt "); + printf ("PEF Actions: %02x : %s\n", j, mystr); + } + ret = GetPefEntry (0x03, 0, (PEF_RECORD *) & LanRecord); + if (ret == 0) + printf ("PEF Startup Delay: %02x : %d sec\n", + LanRecord.data[0], LanRecord.data[0]); + if (!fmBMC) { + ret = GetPefEntry (0x04, 0, (PEF_RECORD *) & LanRecord); + if (ret == 0) + printf ("PEF Alert Startup Delay: %02x: %d sec\n", + LanRecord.data[0], LanRecord.data[0]); + /* fmBMC gets cc=0x80 here */ + } + /* note that ndest should be read from lan param 17 below. */ + for (i = 1; i <= ndest; i++) { + ret = GetPefEntry (0x09, (ushort) i, (PEF_RECORD *) & LanRecord); + if (ret == 0) { mystr[0] = 0; - j = LanRecord.data[2]; - if (LanRecord.data[1] & 0x08) { - sprintf(mystr,"Chan[%d] Dest[%d] ",((j & 0xf0) >> 4),(j & 0x0f)); - strcat(mystr,"Enabled "); - } else strcpy(mystr,"Disabled "); - printf("PEF Alert Policy[%d]: %02x %02x %02x %02x : %s\n",i, - LanRecord.data[0], LanRecord.data[1], - LanRecord.data[2], LanRecord.data[3],mystr); - } - } /*endfor ndest*/ - } /*endif fpefok*/ - } /*endif not canonical*/ - - if (fpefenable && !freadonly) { /* fenable or fdisable */ - if (fSetPEFOks) pefadd = 5; - else pefadd = 2; - sz = (pefnum - 1) + pefadd + fCustomPEF; - printf("\n%s, SetPefEntry(1-%d) ...\n",progname,sz); - if (fdebug) printf("pefnum = %d, pefmax = %d\n",pefnum,pefmax); - for (idx = 1; idx <= pefmax; idx++) - { - // Set & Enable all PEF records - memset(&PefRecord.rec_id,0,sizeof(PEF_RECORD)); - PefRecord.rec_id = (uchar)idx; /* next record, or user-specified */ - if (idx < pefnum) { /* pefnum defaults to 12.(0x0c) */ - if (pef_array[idx-1][7] == 0) /*empty pef record, set to default*/ - memcpy(&PefRecord.rec_id,pef_defaults[idx-1],sizeof(PEF_RECORD)); - else { /* set config however it was previously */ - memcpy(&PefRecord.rec_id,pef_array[idx-1],sizeof(PEF_RECORD)); - if (PefRecord.severity == 0) - PefRecord.severity = pef_defaults[idx-1][4]; - } - } else if ((idx == pefnum) && /* new OS Crit Stop entry */ - (PefRecord.sensor_type == 0)) { - // Set PEF values for 0x20, OS Critical Stop event - PefRecord.severity = PEF_SEV_CRIT; - PefRecord.genid1 = 0xff; - PefRecord.genid2 = 0xff; - PefRecord.sensor_type = 0x20; /* OS Critical Stop */ - PefRecord.sensor_no = 0xff; - PefRecord.event_trigger = 0x6f; - PefRecord.data1 = 0xff; - PefRecord.mask1 = 0x00; - } else if ((idx == pefnum+1) && /* new Power Redundancy entry */ - (PefRecord.sensor_type == 0)) { - // Set PEF values for 0x09/0x02/0x0b/0x41, Power Redundancy Lost - PefRecord.severity = PEF_SEV_WARN; - PefRecord.genid1 = 0xff; - PefRecord.genid2 = 0xff; - PefRecord.sensor_type = 0x09; /* Power Unit */ - PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ - PefRecord.event_trigger = 0x0b; /* event trigger */ - PefRecord.data1 = 0x02; /* 02 -> 41=Redundancy Lost */ - PefRecord.mask1 = 0x00; - } else if (fSetPEFOks && idx == (pefnum+2)) { - PefRecord.severity = PEF_SEV_OK; - PefRecord.genid1 = 0xff; - PefRecord.genid2 = 0xff; - PefRecord.sensor_type = 0x09; /* Power Unit, Redund OK */ - PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ - PefRecord.event_trigger = 0x0b; /* event trigger */ - PefRecord.data1 = 0x01; /* 01 -> 40=Redundancy OK */ - PefRecord.mask1 = 0x00; - } else if (fSetPEFOks && idx == (pefnum+3)) { - PefRecord.severity = PEF_SEV_OK; - PefRecord.genid1 = 0xff; - PefRecord.genid2 = 0xff; - PefRecord.sensor_type = 0x01; /* Temp OK */ - PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ - PefRecord.event_trigger = 0x81; /* event trigger */ - PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */ - PefRecord.mask1 = 0x0a; - } else if (fSetPEFOks && idx == (pefnum+4)) { - PefRecord.severity = PEF_SEV_OK; - PefRecord.genid1 = 0xff; - PefRecord.genid2 = 0xff; - PefRecord.sensor_type = 0x02; /* Voltage OK */ - PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ - PefRecord.event_trigger = 0x81; /* event trigger */ - PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */ - PefRecord.mask1 = 0x0a; - } else if (fCustomPEF && idx == (pefnum+pefadd)) { - /* user entered 10 or 18 PEF entry bytes */ - PefRecord.action = custPEF[0]; - PefRecord.policy = custPEF[1]; - PefRecord.severity = custPEF[2]; - PefRecord.genid1 = custPEF[3]; - PefRecord.genid2 = custPEF[4]; - PefRecord.sensor_type = custPEF[5]; - PefRecord.sensor_no = custPEF[6]; - PefRecord.event_trigger = custPEF[7]; - PefRecord.data1 = custPEF[8]; - PefRecord.mask1 = custPEF[9]; - memcpy(&PefRecord.action,custPEF,18); - } else { - memcpy(&PefRecord.rec_id,pef_array[idx-1],sizeof(PEF_RECORD)); - if (PefRecord.sensor_type == 0) continue; /* if reserved, skip it */ - } - if (fdebug && (PefRecord.rec_id != idx)) { - /* memcpy from pef_defaults or pef_array clobbered rec_id */ - printf("Warning: SetPef idx=%d, rec_id=%d\n",idx,PefRecord.rec_id); - PefRecord.rec_id = (uchar)idx; /*fix it*/ - } - if (fdisable) { - /* Disable all PEF rules */ - if (idx >= pefnum) PefRecord.fconfig = 0x00; /*disabled, software*/ - else PefRecord.fconfig = 0x40; /*disabled, preset */ - PefRecord.action = 0x00; - PefRecord.policy = 0x00; - } else { /*fenable*/ - if (PefRecord.sensor_type != 0) { /* not an empty PEF entry */ - /* Enable all non-empty PEF rules */ - if (fCustomPEF && (idx == (pefnum+pefadd))) { - PefRecord.action = custPEF[0]; - PefRecord.policy = custPEF[1]; - } else { - PefRecord.action = 0x01; /*Alert*/ - PefRecord.policy = 0x01; /*see Alert Policy #1*/ - } - if (idx < pefnum) { /* special handling for presets, 1 thru 11 */ - PefRecord.fconfig = 0x80; /* enabled, software */ - ret = SetPefEntry(&PefRecord); - if (fdebug) - printf("SetPefEntry(%d/80) ret=%d\n",PefRecord.rec_id,ret); - // if (ret != 0) { nerrs++; lasterr = ret; } - // else ngood++; - PefRecord.fconfig = 0xC0; /* enabled, preset */ - } else { - PefRecord.fconfig = 0x80; /* enabled, software */ - } - } /*endif not empty*/ - } - { // Show the new PEF record before setting it. - pc = (uchar *)&PefRecord; - sz = 21; - printf("PEFilter(%d): ",PefRecord.rec_id); - for (i = 0; i < sz; i++) printf("%02x ",pc[i]); - printf("\n"); - } - ret = SetPefEntry(&PefRecord); - if (fdebug) - printf("SetPefEntry(%d) ret = %d\n", PefRecord.rec_id,ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } /*end for*/ - } - } /*end if not fIPMI10*/ - - if (!fcanonical) - printf("\n%s, GetLanEntry for channel %d ...\n",progname,lan_ch); - idest = 1; - for (idx = 0; idx < NLAN; idx++) - { - int ival; - if (fcanonical && (canon_param[idx] == 0)) continue; - if (idx == 8 || idx == 9) continue; /* not implemented */ - ival = lanparams[idx].cmd; - if (ival >= 96 && ival <= 98) continue; /* not implemented */ - if (ival >= 102 && ival <= 108) { /*custom IPv6 parameters*/ - if (fipv6 == 0) continue; /*skip these*/ - } - if (ival == 194 && vend_id == VENDOR_KONTRON) { /*oem hostname parm*/ - lanparams[idx].sz = 36; - strcpy(lanparams[idx].desc,"IPMI Hostname"); - } else if (ival >= 192 && ival <= 194) { /*custom DHCP parameters*/ - if (vend_id != VENDOR_INTEL) continue; - if (fmBMC || fiBMC || fcanonical) continue; /*skip these*/ - } - if (ival >= 20 && ival <= 25) { - if (!fIPMI20) continue; /*VLAN params 20-25, fIPMI20 only/opt*/ - } - if ((ndest == 0) && (ival >= 18 && ival <= 19)) continue; /*skip dest*/ - if (ival == 11) { /*grat arp interval*/ - if (vend_id == VENDOR_SUPERMICROX) continue; - if (vend_id == VENDOR_SUPERMICRO) continue; - } - if (ival == 14 || ival == 15) { /*secondary gateway is optional*/ - if (vend_id == VENDOR_KONTRON) continue; - } - if (ival == 201) { /*Get Channel Access*/ - ret = ShowChanAcc(lan_ch); - } else { - if (ival == 18 || ival == 19) { /*dest params*/ - if (ndest == 0) continue; /*skip if ndest==0 */ - bset = (uchar)idest; /* dest id = 1 thru n */ - } else bset = 0; - ret = GetLanEntry((uchar)ival, bset, &LanRecord); - } - if (ret == 0) { // Show the LAN record - pc = (uchar *)&LanRecord; - sz = lanparams[idx].sz; - if (ival == 18) { /*skip if invalid dest type param*/ - if ((idest > 1) && (pc[2] == 0)) { idest = 1; continue; } - } else if (ival == 19) { /*skip if invalid dest addr param*/ - if ((idest > 1) && !IpIsValid(&pc[3])) { idest = 1; continue; } + j = LanRecord.data[2]; + if (LanRecord.data[1] & 0x08) { + sprintf (mystr, "Chan[%d] Dest[%d] ", ((j & 0xf0) >> 4), + (j & 0x0f)); + strcat (mystr, "Enabled "); } - if (ival == 201) ; /* did it above */ - else { - if (fcanonical) { - if ((ival == 19) && (idest > 1)) ; /*skip it*/ - else { - j = strlen_(lanparams[idx].desc); - // (ival < 7) || (ival == 19) || ival == 102) - if (j <= 12) pstr = pspace3; - else pstr = pspace2; - printf("Channel %d %s %s%c ",lan_ch, - lanparams[idx].desc,pstr,bdelim); - } - } else - printf("Lan Param(%d) %s: ",ival,lanparams[idx].desc); + else + strcpy (mystr, "Disabled "); + printf ("PEF Alert Policy[%d]: %02x %02x %02x %02x : %s\n", i, + LanRecord.data[0], LanRecord.data[1], + LanRecord.data[2], LanRecord.data[3], mystr); + } + } /*endfor ndest */ + } /*endif fpefok */ + } /*endif not canonical */ + + if (fpefenable && !freadonly) { /* fenable or fdisable */ + if (fSetPEFOks) + pefadd = 5; + else + pefadd = 2; + sz = (pefnum - 1) + pefadd + fCustomPEF; + printf ("\n%s, SetPefEntry(1-%d) ...\n", progname, sz); + if (fdebug) + printf ("pefnum = %d, pefmax = %d\n", pefnum, pefmax); + for (idx = 1; idx <= pefmax; idx++) { + // Set & Enable all PEF records + memset (&PefRecord.rec_id, 0, sizeof (PEF_RECORD)); + PefRecord.rec_id = (uchar) idx; /* next record, or user-specified */ + if (idx < pefnum) { /* pefnum defaults to 12.(0x0c) */ + if (pef_array[idx - 1][7] == 0) /*empty pef record, set to default */ + memcpy (&PefRecord.rec_id, pef_defaults[idx - 1], + sizeof (PEF_RECORD)); + else { /* set config however it was previously */ + memcpy (&PefRecord.rec_id, pef_array[idx - 1], + sizeof (PEF_RECORD)); + if (PefRecord.severity == 0) + PefRecord.severity = pef_defaults[idx - 1][4]; + } + } + else if ((idx == pefnum) && /* new OS Crit Stop entry */ + (PefRecord.sensor_type == 0)) { + // Set PEF values for 0x20, OS Critical Stop event + PefRecord.severity = PEF_SEV_CRIT; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x20; /* OS Critical Stop */ + PefRecord.sensor_no = 0xff; + PefRecord.event_trigger = 0x6f; + PefRecord.data1 = 0xff; + PefRecord.mask1 = 0x00; + } + else if ((idx == pefnum + 1) && /* new Power Redundancy entry */ + (PefRecord.sensor_type == 0)) { + // Set PEF values for 0x09/0x02/0x0b/0x41, Power Redundancy Lost + PefRecord.severity = PEF_SEV_WARN; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x09; /* Power Unit */ + PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ + PefRecord.event_trigger = 0x0b; /* event trigger */ + PefRecord.data1 = 0x02; /* 02 -> 41=Redundancy Lost */ + PefRecord.mask1 = 0x00; + } + else if (fSetPEFOks && idx == (pefnum + 2)) { + PefRecord.severity = PEF_SEV_OK; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x09; /* Power Unit, Redund OK */ + PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ + PefRecord.event_trigger = 0x0b; /* event trigger */ + PefRecord.data1 = 0x01; /* 01 -> 40=Redundancy OK */ + PefRecord.mask1 = 0x00; + } + else if (fSetPEFOks && idx == (pefnum + 3)) { + PefRecord.severity = PEF_SEV_OK; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x01; /* Temp OK */ + PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ + PefRecord.event_trigger = 0x81; /* event trigger */ + PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */ + PefRecord.mask1 = 0x0a; + } + else if (fSetPEFOks && idx == (pefnum + 4)) { + PefRecord.severity = PEF_SEV_OK; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x02; /* Voltage OK */ + PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ + PefRecord.event_trigger = 0x81; /* event trigger */ + PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */ + PefRecord.mask1 = 0x0a; + } + else if (fCustomPEF && idx == (pefnum + pefadd)) { + /* user entered 10 or 18 PEF entry bytes */ + PefRecord.action = custPEF[0]; + PefRecord.policy = custPEF[1]; + PefRecord.severity = custPEF[2]; + PefRecord.genid1 = custPEF[3]; + PefRecord.genid2 = custPEF[4]; + PefRecord.sensor_type = custPEF[5]; + PefRecord.sensor_no = custPEF[6]; + PefRecord.event_trigger = custPEF[7]; + PefRecord.data1 = custPEF[8]; + PefRecord.mask1 = custPEF[9]; + memcpy (&PefRecord.action, custPEF, 18); + } + else { + memcpy (&PefRecord.rec_id, pef_array[idx - 1], sizeof (PEF_RECORD)); + if (PefRecord.sensor_type == 0) + continue; /* if reserved, skip it */ + } + if (fdebug && (PefRecord.rec_id != idx)) { + /* memcpy from pef_defaults or pef_array clobbered rec_id */ + printf ("Warning: SetPef idx=%d, rec_id=%d\n", idx, + PefRecord.rec_id); + PefRecord.rec_id = (uchar) idx; /*fix it */ + } + if (fdisable) { + /* Disable all PEF rules */ + if (idx >= pefnum) + PefRecord.fconfig = 0x00; /*disabled, software */ + else + PefRecord.fconfig = 0x40; /*disabled, preset */ + PefRecord.action = 0x00; + PefRecord.policy = 0x00; + } + else { /*fenable */ + if (PefRecord.sensor_type != 0) { /* not an empty PEF entry */ + /* Enable all non-empty PEF rules */ + if (fCustomPEF && (idx == (pefnum + pefadd))) { + PefRecord.action = custPEF[0]; + PefRecord.policy = custPEF[1]; } - if (ival == 1) { - authmask = pc[0]; /* auth type support mask */ - /* if (fmBMC) authmask is usually 0x15, else 0x14 */ - } else if (ival == 3) { - if (IpIsValid(pc)) memcpy(bmcmyip,pc,4); - } else if (ival == 5) { - if (MacIsValid(pc)) memcpy(bmcmymac,pc,MAC_LEN); - } else if (ival == 6) { - if (SubnetIsValid(pc)) memcpy(bmcsubnet,pc,4); - /* else if invalid, leave default as 255.255.255.0 */ - //} else if (ival == 7) { - // if (pc[0] >= 30) memcpy(bparm7,pc,3); - } else if (ival == 17) { /* num dest */ - ndest = pc[0]; /* save the number of destinations */ - } else if (ival == 12) { /* gateway addr */ - if (IpIsValid(pc)) memcpy(bmcgwyip,pc,4); - } else if (ival == 13) { /* gateway mac */ - if (MacIsValid(pc)) memcpy(bmcgwymac,pc,MAC_LEN); - } else if (ival == 19) { /* dest addr */ - if (IpIsValid(&pc[3])) memcpy(bmcdestip,&pc[3],4); - if (MacIsValid(&pc[7])) memcpy(bmcdestmac,&pc[7],MAC_LEN); - } else if (ival == 22) { /*Cipher Suite Support*/ - nciphers = pc[0]; + else { + PefRecord.action = 0x01; /*Alert */ + PefRecord.policy = 0x01; /*see Alert Policy #1 */ } - /* now start to display data */ - if (ival == 16) { printf("%s \n",pc); /* string */ - } else if (ival == 194 && vend_id == VENDOR_KONTRON) { - printf("%s \n",pc); /* string */ - } else if (ival == 201) { ; /* did it above */ - } else { /* print results for all other ival's */ - pstr = ""; /*interpreted meaning*/ - if (fcanonical) { - switch(ival) { - case 4: /*param 4, ip src*/ - if (pc[0] == SRC_STATIC) pstr = "Static"; /*0x01*/ - else if (pc[0] == SRC_DHCP) pstr = "DHCP"; /*0x02*/ - else if (pc[0] == SRC_BIOS) pstr = "BIOS"; /*0x03*/ - else pstr = "Other"; - printf("%s\n",pstr); - break; - case 5: /*param 5, mac addr*/ - case 13: /*param 6, def gwy mac*/ - printf("%02x:%02x:%02x:%02x:%02x:%02x\n", - pc[0], pc[1], pc[2], pc[3], pc[4], pc[5]); - break; - case 3: /*param 4, ip address*/ - case 6: /*param 6, subnet mask*/ - case 12: /*param 12, def gwy ip*/ - case 14: /*param 14, sec gwy ip*/ - case 192: /*param 192, DHCP svr ip*/ - printf("%d.%d.%d.%d\n",pc[0], pc[1], pc[2], pc[3]); - break; - case 19: /*param 19, dest address*/ - if (idest == 1) { - printf("IP=%d.%d.%d.%d " - "MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", - pc[3], pc[4], pc[5], pc[6], - pc[7], pc[8], pc[9], pc[10], pc[11], pc[12]); - } - break; - case 102: /*param 102, IPv6 enable*/ - if (pc[0] == 0x01) printf("enabled\n"); - else printf("disabled\n"); - break; - default: - printf("%02x \n",pc[0]); - break; - } - } else { /*not canonical */ - if (ival == 3 || ival == 6 || ival == 12 || ival == 14 - || ival == 192) { - printf("%d.%d.%d.%d",pc[0], pc[1], pc[2], pc[3]); - } else if (ival == 23) { /*Cipher Suites*/ - for (i = 1; i <= nciphers; i++) { - if (pc[i] == 0) ncipher0 = pc[i]; - printf("%2d ",pc[i]); - } - } else if (ival == 24) { /*Cipher Suite Privi Levels*/ - j = 0; - for (i = 1; i < 9; i++) { - char c1, c2; - char *p; - p = parse_priv((pc[i] & 0x0f)); - c1 = p[0]; - p = parse_priv((pc[i] & 0xf0) >> 4); - c2 = p[0]; - rgciphers[j++] = (pc[i] & 0x0f); - rgciphers[j++] = ((pc[i] & 0xf0) >> 4); - if ((i*2) >= nciphers) c2 = ' '; - printf(" %c %c ",c1,c2); - if ((i*2) > nciphers) break; - } - } else - for (i = 0; i < sz; i++) - { - /* print in hex, decimal, or string, based on ival */ - if (ival == 1) { /* Auth type support */ - pstr = &mystr[0]; - getauthstr(authmask,pstr); - printf("%02x ",authmask); - } else if (ival == 4) { /* IP addr source */ - if (pc[i] == SRC_STATIC) pstr = "Static"; /*0x01*/ - else if (pc[i] == SRC_DHCP) pstr = "DHCP"; /*0x02*/ - else if (pc[i] == SRC_BIOS) pstr = "BIOS"; /*0x03*/ - else pstr = "Other"; - printf("%02x ",pc[i]); - } else if (ival == 10) { /* grat ARP */ - mystr[0] = 0; - if (pc[i] == 0) strcat(mystr,"ARP disabled "); - else if (pc[i] & 0x01) strcat(mystr,"Grat-ARP enabled"); - else strcat(mystr,"Grat-ARP disabled"); - if (pc[i] & 0x02) strcat(mystr,", ARP-resp enabled"); - pstr = &mystr[0]; - printf("%02x ",pc[i]); - } else if (ival == 11) { /* grat ARP interval */ - float f; - f = (float)pc[i] / (float)2; /*500msec increments*/ - sprintf(mystr,"%.1f sec",f); - pstr = &mystr[0]; - printf("%02x ",pc[i]); - } else if (ival == 19) { /* dest addr */ - if (i > 2 && i < 7) { - char *sepstr; - if (i == 3) printf("["); - if (i == 6) sepstr = "] "; - else if (i >=3 && i < 6) sepstr = "."; - else sepstr = " "; - printf("%d%s",pc[i],sepstr); /* IP address in dec */ - } - else printf("%02x ",pc[i]); /* show mac/etc. in hex */ - } - else printf("%02x ",pc[i]); /* show in hex */ - } /*end for*/ - if (ival == 2) { /*Auth type enables*/ - pstr = &mystr[0]; - i = 0; - if (lan_ch > 0) i = lan_ch - 1; - getauthstr(pc[i],pstr); - } - if (pstr[0] != 0) printf(": %s\n",pstr); - else printf("\n"); - } /*end-else not canonical*/ - } /*end-else others*/ - if (ival == 18 || ival == 19) { - if (idest < ndest) { - idest++; - idx--; /* repeat this param*/ - } else idest = 1; + if (idx < pefnum) { /* special handling for presets, 1 thru 11 */ + PefRecord.fconfig = 0x80; /* enabled, software */ + ret = SetPefEntry (&PefRecord); + if (fdebug) + printf ("SetPefEntry(%d/80) ret=%d\n", PefRecord.rec_id, ret); + // if (ret != 0) { nerrs++; lasterr = ret; } + // else ngood++; + PefRecord.fconfig = 0xC0; /* enabled, preset */ } - } else { /* ret != 0 */ - if (ival >= 20 && ival <= 25) { /*if errors, optional*/ - if (fdebug) printf("GetLanEntry(%d), ret = %d\n",ival,ret); - } else - printf("GetLanEntry(%d), ret = %d\n",ival,ret); - if (ival == 17) ndest = 0; /*error getting num dest*/ - } - } /*end for*/ - if (fRomley || fGrantley) { /*get LAN Failover param*/ - uchar b; - ret = lan_failover_intel(0xFF,(uchar *)&b); - if (ret != 0) - printf("Intel Lan Failover, ret = %d\n",ret); - else { - if (b == 1) pstr = "enabled"; - else pstr = "disabled"; - if (fcanonical) - printf("Intel Lan Failover %s%c %s\n", - pspace3, bdelim,pstr); - else printf("Intel Lan Failover %s%c %02x %c %s\n", - pspace2, bdelim,b,bdelim,pstr); - } - } - if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) { - ret = oem_supermicro_get_lan_port(&bset); - if (ret == 0) { - pstr = oem_supermicro_lan_port_string(bset); - if (fcanonical) - printf("SuperMicro Lan Interface %s%c %s\n", - pspace2, bdelim,pstr); - else printf("SuperMicro Lan Interface %c %02x %c %s\n", - bdelim,bset,bdelim,pstr); - } else { - if (fdebug) printf("oem_supermicro_get_lan_port error %d\n",ret); - ret = 0; /*may not be supported on all smc plaforms*/ - } - } - // if (fmBMC) lan_access = 0x04; /*Admin*/ - // else lan_access = 0x04; /*Admin*/ - if (!fIPMI10) { /* Get SOL params */ - ret = GetSerialOverLan(lan_ch,0,0); - if (ret != 0) printf("GetSOL error %d\n",ret); - } - for (i = 1; i <= show_users; i++) - GetUser((uchar)i); - - if (fgetser && !fcanonical) { - printf("\n%s, GetSerEntry ...\n",progname); - if (fmBMC) /* mBMC doesn't support serial */ - printf("No serial channel support on this platform\n"); - else - for (idx = 0; idx < NSER; idx++) { - int ival; - // if (idx == 9) continue; /* not implemented */ - ival = serparams[idx].cmd; - if (ival == 201) { - ret = GetChanAcc(ser_ch, 0x40, &LanRecord); - } else { - ret = GetSerEntry((uchar)ival, &LanRecord); - } - if (ret == 0) { // Show the SER record - pc = (uchar *)&LanRecord; - sz = serparams[idx].sz; - printf("Serial Param(%d) %s: ",ival,serparams[idx].desc); - if (idx == 10) { /* modem init string */ - pc[sz] = 0; - printf("%02x %s\n",pc[0],&pc[1]); - } - else if ((idx >= 11 && idx <= 13) || idx == 15) { /* strings */ - printf("%s\n",pc); - } - else { - for (i = 0; i < sz; i++) { - printf("%02x ",pc[i]); /* show in hex */ - } - printf("\n"); - } /*end else*/ - } - } /*end for*/ - } /*endif fgetser*/ - - if (!freadonly) /* Set IPMI LAN enable/disable params. */ - { - if (fipmilan) /* Sets not valid via ipmi_lan if same channel. */ - printf("\nWarning: Setting LAN %d params while using a LAN channel.\n", lan_ch); - - { - if (fenable && (fsharedMAC==0) && !lan_dhcp) { - /* must have an IP from -I option */ - if (!IpIsValid(rgmyip)) { /* if not user-specified */ - if (IpIsValid(bmcmyip)) { - memcpy(rgmyip,bmcmyip,4); - if (fdebug) printf("Using current IP %d.%d.%d.%d\n", - bmcmyip[0], bmcmyip[1], - bmcmyip[2], bmcmyip[3]); - } else { - printf("\nNot shared BMC LAN, must specify a unique " - "IP address via -I\n"); - ret = ERR_BAD_PARAM; - goto do_exit; - } - } - } - /* Set LAN parameters. fenable or fdisable */ - printf("\n%s, SetLanEntry for channel %d ...\n",progname,lan_ch); - /* use ifname to resolve MAC addresses below */ - if (fdisable) { - if (!fIPMI10) { - ret = DisablePef(alertnum); - printf("DisablePef, ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } - if (lan_user != 0) { - j = DisableUser(lan_user); /*disable this lan user*/ - printf("DisableUser(%d), ret = %d\n",lan_user,j); - if (j != 0) { nerrs++; lasterr = j; } - else ngood++; - } - LanRecord.data[0] = 0x01; /* static IP address source */ - ret = SetLanEntry(4, &LanRecord, 1); - printf("SetLanEntry(4), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - /* clear the BMC IP address */ - memset(&LanRecord,0,4); - ret = SetLanEntry(3, &LanRecord, 4); - printf("SetLanEntry(3), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - /* clear the gateway IP address */ - memset(&LanRecord,0,4); - ret = SetLanEntry(12, &LanRecord, 4); - printf("SetLanEntry(12), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - /* clear the gateway MAC address */ - memset(&LanRecord,0,6); - ret = SetLanEntry(13, &LanRecord, 6); - printf("SetLanEntry(13), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } else if (fdisableSOL) { - ret = SetupSerialOverLan(0); /*disable*/ - SELprintf("SetupSerialOverLan: ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } else { /*fenable*/ - uchar chanctl; - if (bmcpefctl != 0) chanctl = chan_pefon; /*previously on*/ - else chanctl = chan_pefoff; - ret = SetChanAcc(lan_ch, 0x80, chanctl); - if (fdebug) printf("SetChanAcc(lan/active), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - ret = SetChanAcc(lan_ch, 0x40, chanctl); - if (fdebug) printf("SetChanAcc(lan/nonvol), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - if (flansecure) { - j = DisableUser(0); /*disable the default null user*/ - printf("DisableUser(0), ret = %d\n",j); - } - ret = SetUser(lan_user,myuser,passwordData); - printf("SetUser(%d), ret = %d\n",lan_user,ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } - if (fdisable && (vend_id == VENDOR_SUPERMICROX - || vend_id == VENDOR_SUPERMICRO) ) { - failover_enable = 0; /*dedicated*/ - ret = oem_supermicro_set_lan_port(failover_enable); - printf("Set SuperMicro Lan port to %s, ret = %d\n", - oem_supermicro_lan_port_string(failover_enable),ret); - if (ret != 0) { nerrs++; lasterr = ret; } - } - - if (fdisable || fdisableSOL) { - // if (nerrs > 0) printf("Warning: %d errors occurred\n",nerrs); - goto do_exit; - } - - if (authmask == 0) authmask = 0x17; /*if none from GetLanEntry(1)*/ - LanRecord.data[0] = (bAuth & authmask); /*Callback level*/ - LanRecord.data[1] = (bAuth & authmask); /*User level */ - LanRecord.data[2] = (bAuth & authmask); /*Operator level*/ - LanRecord.data[3] = (bAuth & authmask); /*Admin level */ - LanRecord.data[4] = 0; /*OEM level*/ - if (fdebug) printf("SetLanEntry(2): %02x %02x %02x %02x %02x\n", - LanRecord.data[0],LanRecord.data[1],LanRecord.data[2], - LanRecord.data[3],LanRecord.data[4]); - ret = SetLanEntry(2, &LanRecord, 5); - printf("SetLanEntry(2), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - - /* Get the values to use from Linux eth0, etc. */ - ret = Get_IPMac_Addr(); - if (lan_dhcp) { /* use DHCP */ - LanRecord.data[0] = SRC_DHCP; /* BMC running DHCP */ - /* = SRC_BIOS; * address source = BIOS using DHCP */ - ret = SetLanEntry(4, &LanRecord, 1); - printf("SetLanEntry(4), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - if (MacIsValid(rgmymac)) { - memcpy(&LanRecord,rgmymac,6); - ret = SetLanEntry(5, &LanRecord, 6); - if (ret == 0x82) { /*BMC may not allow the MAC to be set*/ - if (fdebug) - printf("SetLanEntry(5), ret = %x cannot modify MAC\n",ret); - } else { - printf("SetLanEntry(5), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } - } - - /* DHCP also relates to OEM LAN params 192, 193, 194 */ - if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) - { /*DHCP params 192-194 are Intel only*/ - if (IpIsValid(rgmyip)) - { - /* Set DHCP Server IP in param 192 from -I param. */ - memcpy(&LanRecord,rgmyip,4); - ret = SetLanEntry(192, &LanRecord, 4); - printf("SetLanEntry(192), ret = %d\n",ret); - if (!MacIsValid(rgdhcpmac)) /* if MAC not set yet */ - ret = Get_Mac(rgmyip,rgdhcpmac,NULL); - if (ret == 0) { - memcpy(&LanRecord,rgdhcpmac,MAC_LEN); - ret = SetLanEntry(193, &LanRecord, MAC_LEN); - printf("SetLanEntry(193), ret = %d\n",ret); - } - } - LanRecord.data[0] = 0x01; /*enable DHCP*/ - ret = SetLanEntry(194, &LanRecord, 1); - printf("SetLanEntry(194), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } - } else { /* use static IP */ - printf("LAN%d (%s)\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", - lan_ch,ifname, rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], - rgmymac[0], rgmymac[1], rgmymac[2], rgmymac[3], - rgmymac[4], rgmymac[5]); - if (IpIsValid(rgmyip)) { - if (lan_ch != gcm_ch) { /*skip if gcm*/ - LanRecord.data[0] = 0x00; /*disable grat arp while setting IP*/ - ret = SetLanEntry(10, &LanRecord, 1); - if (fdebug) printf("SetLanEntry(10,0), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } + else { + PefRecord.fconfig = 0x80; /* enabled, software */ } - LanRecord.data[0] = 0x01; /* static IP address source */ - ret = SetLanEntry(4, &LanRecord, 1); - printf("SetLanEntry(4), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - memcpy(&LanRecord,rgmyip,4); - ret = SetLanEntry(3, &LanRecord, 4); - printf("SetLanEntry(3), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - if (MacIsValid(rgmymac)) { - memcpy(&LanRecord,rgmymac,6); - ret = SetLanEntry(5, &LanRecord, 6); - if (ret == 0x82) { - /* Do not show anything, not an error if BMC does not - allow the BMC MAC to be changed. */ - if (fdebug) - printf("SetLanEntry(5), ret = %x cannot modify MAC\n",ret); - } else { - printf("SetLanEntry(5), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } - } - if (!SubnetIsValid(rgsubnet)) /* not specified, use previous */ - memcpy(rgsubnet,bmcsubnet,4); - memcpy(&LanRecord,rgsubnet,4); - ret = SetLanEntry(6, &LanRecord, 4); - printf("SetLanEntry(6), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - if (vend_id != VENDOR_PEPPERCON) { - /* may want to check bparm7 here */ - LanRecord.data[0] = parm7[0]; /*IPv4 header, TTL */ - LanRecord.data[1] = parm7[1]; /*IPv4 header, Flags */ - LanRecord.data[2] = parm7[2]; /*IPv4 hdr, Precedence/Service */ - ret = SetLanEntry(7, &LanRecord, 3); - printf("SetLanEntry(7), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; + } /*endif not empty */ + } + { // Show the new PEF record before setting it. + pc = (uchar *) & PefRecord; + sz = 21; + printf ("PEFilter(%d): ", PefRecord.rec_id); + for (i = 0; i < sz; i++) + printf ("%02x ", pc[i]); + printf ("\n"); + } + ret = SetPefEntry (&PefRecord); + if (fdebug) + printf ("SetPefEntry(%d) ret = %d\n", PefRecord.rec_id, ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } /*end for */ + } + } /*end if not fIPMI10 */ + + if (!fcanonical) + printf ("\n%s, GetLanEntry for channel %d ...\n", progname, lan_ch); + idest = 1; + for (idx = 0; idx < NLAN; idx++) { + int ival; + if (fcanonical && (canon_param[idx] == 0)) + continue; + if (idx == 8 || idx == 9) + continue; /* not implemented */ + ival = lanparams[idx].cmd; + if (ival >= 96 && ival <= 98) + continue; /* not implemented */ + if (ival >= 102 && ival <= 108) { /*custom IPv6 parameters */ + if (fipv6 == 0) + continue; /*skip these */ + } + if (ival == 194 && vend_id == VENDOR_KONTRON) { /*oem hostname parm */ + lanparams[idx].sz = 36; + strcpy (lanparams[idx].desc, "IPMI Hostname"); + } + else if (ival >= 192 && ival <= 194) { /*custom DHCP parameters */ + if (vend_id != VENDOR_INTEL) + continue; + if (fmBMC || fiBMC || fcanonical) + continue; /*skip these */ + } + if (ival >= 20 && ival <= 25) { + if (!fIPMI20) + continue; /*VLAN params 20-25, fIPMI20 only/opt */ + } + if ((ndest == 0) && (ival >= 18 && ival <= 19)) + continue; /*skip dest */ + if (ival == 11) { /*grat arp interval */ + if (vend_id == VENDOR_SUPERMICROX) + continue; + if (vend_id == VENDOR_SUPERMICRO) + continue; + } + if (ival == 14 || ival == 15) { /*secondary gateway is optional */ + if (vend_id == VENDOR_KONTRON) + continue; + } + if (ival == 201) { /*Get Channel Access */ + ret = ShowChanAcc (lan_ch); + } + else { + if (ival == 18 || ival == 19) { /*dest params */ + if (ndest == 0) + continue; /*skip if ndest==0 */ + bset = (uchar) idest; /* dest id = 1 thru n */ + } + else + bset = 0; + ret = GetLanEntry ((uchar) ival, bset, &LanRecord); + } + if (ret == 0) { // Show the LAN record + pc = (uchar *) & LanRecord; + sz = lanparams[idx].sz; + if (ival == 18) { /*skip if invalid dest type param */ + if ((idest > 1) && (pc[2] == 0)) { + idest = 1; + continue; + } + } + else if (ival == 19) { /*skip if invalid dest addr param */ + if ((idest > 1) && !IpIsValid (&pc[3])) { + idest = 1; + continue; + } + } + if (ival == 201); /* did it above */ + else { + if (fcanonical) { + if ((ival == 19) && (idest > 1)); /*skip it */ + else { + j = strlen_ (lanparams[idx].desc); + // (ival < 7) || (ival == 19) || ival == 102) + if (j <= 12) + pstr = pspace3; + else + pstr = pspace2; + printf ("Channel %d %s %s%c ", lan_ch, + lanparams[idx].desc, pstr, bdelim); + } + } + else + printf ("Lan Param(%d) %s: ", ival, lanparams[idx].desc); + } + if (ival == 1) { + authmask = pc[0]; /* auth type support mask */ + /* if (fmBMC) authmask is usually 0x15, else 0x14 */ + } + else if (ival == 3) { + if (IpIsValid (pc)) + memcpy (bmcmyip, pc, 4); + } + else if (ival == 5) { + if (MacIsValid (pc)) + memcpy (bmcmymac, pc, MAC_LEN); + } + else if (ival == 6) { + if (SubnetIsValid (pc)) + memcpy (bmcsubnet, pc, 4); + /* else if invalid, leave default as 255.255.255.0 */ + //} else if (ival == 7) { + // if (pc[0] >= 30) memcpy(bparm7,pc,3); + } + else if (ival == 17) { /* num dest */ + ndest = pc[0]; /* save the number of destinations */ + } + else if (ival == 12) { /* gateway addr */ + if (IpIsValid (pc)) + memcpy (bmcgwyip, pc, 4); + } + else if (ival == 13) { /* gateway mac */ + if (MacIsValid (pc)) + memcpy (bmcgwymac, pc, MAC_LEN); + } + else if (ival == 19) { /* dest addr */ + if (IpIsValid (&pc[3])) + memcpy (bmcdestip, &pc[3], 4); + if (MacIsValid (&pc[7])) + memcpy (bmcdestmac, &pc[7], MAC_LEN); + } + else if (ival == 22) { /*Cipher Suite Support */ + nciphers = pc[0]; + } + /* now start to display data */ + if (ival == 16) { + printf ("%s \n", pc); /* string */ + } + else if (ival == 194 && vend_id == VENDOR_KONTRON) { + printf ("%s \n", pc); /* string */ + } + else if (ival == 201) {; /* did it above */ + } + else { /* print results for all other ival's */ + pstr = ""; /*interpreted meaning */ + if (fcanonical) { + switch (ival) { + case 4: /*param 4, ip src */ + if (pc[0] == SRC_STATIC) + pstr = "Static"; /*0x01 */ + else if (pc[0] == SRC_DHCP) + pstr = "DHCP"; /*0x02 */ + else if (pc[0] == SRC_BIOS) + pstr = "BIOS"; /*0x03 */ + else + pstr = "Other"; + printf ("%s\n", pstr); + break; + case 5: /*param 5, mac addr */ + case 13: /*param 6, def gwy mac */ + printf ("%02x:%02x:%02x:%02x:%02x:%02x\n", + pc[0], pc[1], pc[2], pc[3], pc[4], pc[5]); + break; + case 3: /*param 4, ip address */ + case 6: /*param 6, subnet mask */ + case 12: /*param 12, def gwy ip */ + case 14: /*param 14, sec gwy ip */ + case 192: /*param 192, DHCP svr ip */ + printf ("%d.%d.%d.%d\n", pc[0], pc[1], pc[2], pc[3]); + break; + case 19: /*param 19, dest address */ + if (idest == 1) { + printf ("IP=%d.%d.%d.%d " + "MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", + pc[3], pc[4], pc[5], pc[6], + pc[7], pc[8], pc[9], pc[10], pc[11], pc[12]); } - /* if lan_ch == 3, gcm gets error setting grat arp (ccode=0xCD) */ - if (lan_ch != gcm_ch) { /*skip if gcm*/ - /* 01=enable grat arp, 02=enable arp resp, 03=both */ - LanRecord.data[0] = arp_ctl; /*grat arp*/ - ret = SetLanEntry(10, &LanRecord, 1); - printf("SetLanEntry(10,%x), ret = %d\n",arp_ctl,ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; + break; + case 102: /*param 102, IPv6 enable */ + if (pc[0] == 0x01) + printf ("enabled\n"); + else + printf ("disabled\n"); + break; + default: + printf ("%02x \n", pc[0]); + break; + } + } + else { /*not canonical */ + if (ival == 3 || ival == 6 || ival == 12 || ival == 14 + || ival == 192) { + printf ("%d.%d.%d.%d", pc[0], pc[1], pc[2], pc[3]); + } + else if (ival == 23) { /*Cipher Suites */ + for (i = 1; i <= nciphers; i++) { + if (pc[i] == 0) + ncipher0 = pc[i]; + printf ("%2d ", pc[i]); } - LanRecord.data[0] = arp_interval; /*grat arp interval*/ - ret = SetLanEntry(11, &LanRecord, 1); - printf("SetLanEntry(11), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) { - LanRecord.data[0] = 0x00; /*disable DHCP*/ - ret = SetLanEntry(194, &LanRecord, 1); - printf("SetLanEntry(194), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; + } + else if (ival == 24) { /*Cipher Suite Privi Levels */ + j = 0; + for (i = 1; i < 9; i++) { + char c1, c2; + char *p; + p = parse_priv ((pc[i] & 0x0f)); + c1 = p[0]; + p = parse_priv ((pc[i] & 0xf0) >> 4); + c2 = p[0]; + rgciphers[j++] = (pc[i] & 0x0f); + rgciphers[j++] = ((pc[i] & 0xf0) >> 4); + if ((i * 2) >= nciphers) + c2 = ' '; + printf (" %c %c ", c1, c2); + if ((i * 2) > nciphers) + break; } - } else { /* error, don't continue */ - printf("Missing IP Address, can't continue. Use -I to specify\n"); - ret = ERR_BAD_PARAM; - goto do_exit; } - if (vend_id == VENDOR_KONTRON && rghostname[0] != 0) { - /* set the IPMI Hostname if specified */ - sz = strlen_(rghostname); - /* LanRecord is larger than rghostname, bounds ok */ - strncpy((char *)&LanRecord.data,rghostname,sz); - ret = SetLanEntry(194, &LanRecord, sz); - printf("SetLanEntry(194), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else { - LanRecord.data[0] = 0x31; - ret = SetLanEntry(195, &LanRecord, 1); /*re-read hostname*/ - // printf("SetLanEntry(195), ret = %d\n",ret); - // if (ret != 0) { nerrs++; lasterr = ret; } + else + for (i = 0; i < sz; i++) { + /* print in hex, decimal, or string, based on ival */ + if (ival == 1) { /* Auth type support */ + pstr = &mystr[0]; + getauthstr (authmask, pstr); + printf ("%02x ", authmask); + } + else if (ival == 4) { /* IP addr source */ + if (pc[i] == SRC_STATIC) + pstr = "Static"; /*0x01 */ + else if (pc[i] == SRC_DHCP) + pstr = "DHCP"; /*0x02 */ + else if (pc[i] == SRC_BIOS) + pstr = "BIOS"; /*0x03 */ + else + pstr = "Other"; + printf ("%02x ", pc[i]); + } + else if (ival == 10) { /* grat ARP */ + mystr[0] = 0; + if (pc[i] == 0) + strcat (mystr, "ARP disabled "); + else if (pc[i] & 0x01) + strcat (mystr, "Grat-ARP enabled"); + else + strcat (mystr, "Grat-ARP disabled"); + if (pc[i] & 0x02) + strcat (mystr, ", ARP-resp enabled"); + pstr = &mystr[0]; + printf ("%02x ", pc[i]); + } + else if (ival == 11) { /* grat ARP interval */ + float f; + f = (float) pc[i] / (float) 2; /*500msec increments */ + sprintf (mystr, "%.1f sec", f); + pstr = &mystr[0]; + printf ("%02x ", pc[i]); + } + else if (ival == 19) { /* dest addr */ + if (i > 2 && i < 7) { + char *sepstr; + if (i == 3) + printf ("["); + if (i == 6) + sepstr = "] "; + else if (i >= 3 && i < 6) + sepstr = "."; + else + sepstr = " "; + printf ("%d%s", pc[i], sepstr); /* IP address in dec */ + } + else + printf ("%02x ", pc[i]); /* show mac/etc. in hex */ + } + else + printf ("%02x ", pc[i]); /* show in hex */ + } /*end for */ + if (ival == 2) { /*Auth type enables */ + pstr = &mystr[0]; + i = 0; + if (lan_ch > 0) + i = lan_ch - 1; + getauthstr (pc[i], pstr); + } + if (pstr[0] != 0) + printf (": %s\n", pstr); + else + printf ("\n"); + } /*end-else not canonical */ + } /*end-else others */ + if (ival == 18 || ival == 19) { + if (idest < ndest) { + idest++; + idx--; /* repeat this param */ + } + else + idest = 1; + } + } + else { /* ret != 0 */ + if (ival >= 20 && ival <= 25) { /*if errors, optional */ + if (fdebug) + printf ("GetLanEntry(%d), ret = %d\n", ival, ret); + } + else + printf ("GetLanEntry(%d), ret = %d\n", ival, ret); + if (ival == 17) + ndest = 0; /*error getting num dest */ + } + } /*end for */ + if (fRomley || fGrantley) { /*get LAN Failover param */ + uchar b; + ret = lan_failover_intel (0xFF, (uchar *) & b); + if (ret != 0) + printf ("Intel Lan Failover, ret = %d\n", ret); + else { + if (b == 1) + pstr = "enabled"; + else + pstr = "disabled"; + if (fcanonical) + printf ("Intel Lan Failover %s%c %s\n", pspace3, bdelim, pstr); + else + printf ("Intel Lan Failover %s%c %02x %c %s\n", + pspace2, bdelim, b, bdelim, pstr); + } + } + if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) { + ret = oem_supermicro_get_lan_port (&bset); + if (ret == 0) { + pstr = oem_supermicro_lan_port_string (bset); + if (fcanonical) + printf ("SuperMicro Lan Interface %s%c %s\n", pspace2, bdelim, pstr); + else + printf ("SuperMicro Lan Interface %c %02x %c %s\n", + bdelim, bset, bdelim, pstr); + } + else { + if (fdebug) + printf ("oem_supermicro_get_lan_port error %d\n", ret); + ret = 0; /*may not be supported on all smc plaforms */ + } + } + // if (fmBMC) lan_access = 0x04; /*Admin*/ + // else lan_access = 0x04; /*Admin*/ + if (!fIPMI10) { /* Get SOL params */ + ret = GetSerialOverLan (lan_ch, 0, 0); + if (ret != 0) + printf ("GetSOL error %d\n", ret); + } + for (i = 1; i <= show_users; i++) + GetUser ((uchar) i, lan_ch); + + if (fgetser && !fcanonical) { + printf ("\n%s, GetSerEntry ...\n", progname); + if (fmBMC) /* mBMC doesn't support serial */ + printf ("No serial channel support on this platform\n"); + else + for (idx = 0; idx < NSER; idx++) { + int ival; + // if (idx == 9) continue; /* not implemented */ + ival = serparams[idx].cmd; + if (ival == 201) { + ret = GetChanAcc (ser_ch, 0x40, &LanRecord); + } + else { + ret = GetSerEntry ((uchar) ival, &LanRecord); + } + if (ret == 0) { // Show the SER record + pc = (uchar *) & LanRecord; + sz = serparams[idx].sz; + printf ("Serial Param(%d) %s: ", ival, serparams[idx].desc); + if (idx == 10) { /* modem init string */ + pc[sz] = 0; + printf ("%02x %s\n", pc[0], &pc[1]); + } + else if ((idx >= 11 && idx <= 13) || idx == 15) { /* strings */ + printf ("%s\n", pc); + } + else { + for (i = 0; i < sz; i++) { + printf ("%02x ", pc[i]); /* show in hex */ } + printf ("\n"); + } /*end else */ + } + } /*end for */ + } /*endif fgetser */ + + if (!freadonly) { /* Set IPMI LAN enable/disable params. */ + if (fipmilan) /* Sets not valid via ipmi_lan if same channel. */ + printf ("\nWarning: Setting LAN %d params while using a LAN channel.\n", + lan_ch); + + { + if (fenable && (fsharedMAC == 0) && !lan_dhcp) { + /* must have an IP from -I option */ + if (!IpIsValid (rgmyip)) { /* if not user-specified */ + if (IpIsValid (bmcmyip)) { + memcpy (rgmyip, bmcmyip, 4); + if (fdebug) + printf ("Using current IP %d.%d.%d.%d\n", + bmcmyip[0], bmcmyip[1], bmcmyip[2], bmcmyip[3]); } - if (IpIsValid(rggwyip)) { - if (!MacIsValid(rggwymac)) /* if gwy MAC not set by user */ - ret = Get_Mac(rggwyip,rggwymac,NULL); - printf("gateway \tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", - rggwyip[0], rggwyip[1], rggwyip[2], rggwyip[3], - rggwymac[0], rggwymac[1], rggwymac[2], rggwymac[3], - rggwymac[4], rggwymac[5]); - if (!SubnetIsSame(rgmyip,rggwyip,rgsubnet)) { - printf("WARNING: IP Address and Gateway are not on the same subnet," - " setting Gateway to previous value\n"); - memcpy(rggwyip,bmcgwyip,4); - memcpy(rggwymac,bmcgwymac,6); + else { + printf ("\nNot shared BMC LAN, must specify a unique " + "IP address via -I\n"); + ret = ERR_BAD_PARAM; + goto do_exit; + } + } + } + /* Set LAN parameters. fenable or fdisable */ + printf ("\n%s, SetLanEntry for channel %d ...\n", progname, lan_ch); + /* use ifname to resolve MAC addresses below */ + if (fdisable) { + if (!fIPMI10) { + ret = DisablePef (alertnum); + printf ("DisablePef, ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + if (lan_user != 0) { + j = DisableUser (lan_user, lan_ch); /*disable this lan user */ + printf ("DisableUser(%d), ret = %d\n", lan_user, j); + if (j != 0) { + nerrs++; + lasterr = j; + } + else + ngood++; + } + LanRecord.data[0] = 0x01; /* static IP address source */ + ret = SetLanEntry (4, &LanRecord, 1); + printf ("SetLanEntry(4), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + /* clear the BMC IP address */ + memset (&LanRecord, 0, 4); + ret = SetLanEntry (3, &LanRecord, 4); + printf ("SetLanEntry(3), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + /* clear the gateway IP address */ + memset (&LanRecord, 0, 4); + ret = SetLanEntry (12, &LanRecord, 4); + printf ("SetLanEntry(12), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + /* clear the gateway MAC address */ + memset (&LanRecord, 0, 6); + ret = SetLanEntry (13, &LanRecord, 6); + printf ("SetLanEntry(13), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + else if (fdisableSOL) { + ret = SetupSerialOverLan (0); /*disable */ + SELprintf ("SetupSerialOverLan: ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + else { /*fenable */ + uchar chanctl; + if (bmcpefctl != 0) + chanctl = chan_pefon; /*previously on */ + else + chanctl = chan_pefoff; + ret = SetChanAcc (lan_ch, 0x80, chanctl); + if (fdebug) + printf ("SetChanAcc(lan/active), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + ret = SetChanAcc (lan_ch, 0x40, chanctl); + if (fdebug) + printf ("SetChanAcc(lan/nonvol), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + if (flansecure) { + j = DisableUser (0, lan_ch); /*disable the default null user */ + printf ("DisableUser(0), ret = %d\n", j); + } + ret = SetUser (lan_user, myuser, passwordData, lan_ch); + printf ("SetUser(%d), ret = %d\n", lan_user, ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + if (fdisable && (vend_id == VENDOR_SUPERMICROX + || vend_id == VENDOR_SUPERMICRO)) { + failover_enable = 0; /*dedicated */ + ret = oem_supermicro_set_lan_port (failover_enable); + printf ("Set SuperMicro Lan port to %s, ret = %d\n", + oem_supermicro_lan_port_string (failover_enable), ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + } + + if (fdisable || fdisableSOL) { +// if (nerrs > 0) printf("Warning: %d errors occurred\n",nerrs); + goto do_exit; + } + + if (authmask == 0) + authmask = 0x17; /*if none from GetLanEntry(1) */ + LanRecord.data[0] = (bAuth & authmask); /*Callback level */ + LanRecord.data[1] = (bAuth & authmask); /*User level */ + LanRecord.data[2] = (bAuth & authmask); /*Operator level */ + LanRecord.data[3] = (bAuth & authmask); /*Admin level */ + LanRecord.data[4] = 0; /*OEM level */ + if (fdebug) + printf ("SetLanEntry(2): %02x %02x %02x %02x %02x\n", + LanRecord.data[0], LanRecord.data[1], LanRecord.data[2], + LanRecord.data[3], LanRecord.data[4]); + ret = SetLanEntry (2, &LanRecord, 5); + printf ("SetLanEntry(2), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + + /* Get the values to use from Linux eth0, etc. */ + ret = Get_IPMac_Addr (); + if (lan_dhcp) { /* use DHCP */ + LanRecord.data[0] = SRC_DHCP; /* BMC running DHCP */ + /* = SRC_BIOS; * address source = BIOS using DHCP */ + ret = SetLanEntry (4, &LanRecord, 1); + printf ("SetLanEntry(4), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + if (MacIsValid (rgmymac)) { + memcpy (&LanRecord, rgmymac, 6); + ret = SetLanEntry (5, &LanRecord, 6); + if (ret == 0x82) { /*BMC may not allow the MAC to be set */ + if (fdebug) + printf ("SetLanEntry(5), ret = %x cannot modify MAC\n", ret); + } + else { + printf ("SetLanEntry(5), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; } + else + ngood++; + } + } - /* Set the Default Gateway IP & MAC */ - memcpy(&LanRecord,rggwyip,4); - ret = SetLanEntry(12, &LanRecord, 4); - printf("SetLanEntry(12), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - if (!MacIsValid(rggwymac)) { /* if gwy MAC not resolved */ - printf(" Warning: Gateway MAC address was not resolved! " - "Check %s interface, use -i ethN, or use -H gwymac.\n", - ifname); - memcpy(&LanRecord,bmcgwymac,6); - } else { - memcpy(&LanRecord,rggwymac,6); + /* DHCP also relates to OEM LAN params 192, 193, 194 */ + if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) { /*DHCP params 192-194 are Intel only */ + if (IpIsValid (rgmyip)) { + /* Set DHCP Server IP in param 192 from -I param. */ + memcpy (&LanRecord, rgmyip, 4); + ret = SetLanEntry (192, &LanRecord, 4); + printf ("SetLanEntry(192), ret = %d\n", ret); + if (!MacIsValid (rgdhcpmac)) /* if MAC not set yet */ + ret = Get_Mac (rgmyip, rgdhcpmac, NULL); + if (ret == 0) { + memcpy (&LanRecord, rgdhcpmac, MAC_LEN); + ret = SetLanEntry (193, &LanRecord, MAC_LEN); + printf ("SetLanEntry(193), ret = %d\n", ret); } - ret = SetLanEntry(13, &LanRecord, 6); - printf("SetLanEntry(13), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; } - if (IpIsValid(rggwy2ip)) { - if (!MacIsValid(rggwy2mac)) /* if gwy2 MAC not set by user */ - ret = Get_Mac(rggwy2ip,rggwy2mac,NULL); - /* Set the Secondary Gateway IP & MAC */ - memcpy(&LanRecord,rggwy2ip,4); - ret = SetLanEntry(14, &LanRecord, 4); - printf("SetLanEntry(14), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - memcpy(&LanRecord,rggwy2mac,6); - ret = SetLanEntry(15, &LanRecord, 6); - printf("SetLanEntry(15), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; + LanRecord.data[0] = 0x01; /*enable DHCP */ + ret = SetLanEntry (194, &LanRecord, 1); + printf ("SetLanEntry(194), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; } - } /* end-else static IP */ - if (flansecure) { /* disable cipher 0 */ - char c1, c2; - memset(&LanRecord,0,12); - j = 1; - for (i = 0; i < nciphers; i+=2) { - c1 = rgciphers[i]; - c2 = rgciphers[i+1]; - /* 0x0f may be vendor-specific, 0x00 = Reserved/Unused */ - if (i == ncipher0) c1 = 0x00; - if ((i+1) == ncipher0) c2 = 0x00; - LanRecord.data[j++] = (c2 << 4) | c1; + else + ngood++; + } + } + else { /* use static IP */ + printf + ("LAN%d (%s)\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", + lan_ch, ifname, rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], + rgmymac[0], rgmymac[1], rgmymac[2], rgmymac[3], rgmymac[4], + rgmymac[5]); + if (IpIsValid (rgmyip)) { + if (lan_ch != gcm_ch) { /*skip if gcm */ + LanRecord.data[0] = 0x00; /*disable grat arp while setting IP */ + ret = SetLanEntry (10, &LanRecord, 1); + if (fdebug) + printf ("SetLanEntry(10,0), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; } - ret = SetLanEntry(24, &LanRecord, 9); - printf("SetLanEntry(24) disable cipher0, ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } - ret = SetupSerialOverLan(1); /*enable*/ - SELprintf("SetupSerialOverLan: ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - if (!IpIsValid(rgdestip) && IpIsValid(bmcdestip)) { - memcpy(rgdestip,bmcdestip,4); - if (fdebug) printf("Using current dest IP %d.%d.%d.%d\n", - bmcdestip[0], bmcdestip[1], - bmcdestip[2], bmcdestip[3]); - } - if (ndest == 0) { - if (fdebug) printf("ndest==0, anum=%d rgdestip=%d.%d.%d.%d\n", - alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3]); - printf("alert dest \tnot supported\n"); - } else if (!IpIsValid(rgdestip)) { - printf("alert dest \taddress not specified\n"); - } else { /* valid alert dest ip */ - if (!MacIsValid(rgdestmac)) /* if dest MAC not set by user */ - ret = Get_Mac(rgdestip,rgdestmac,NULL); /*try to resolve MAC */ - if (!MacIsValid(rgdestmac)) { /* if dest MAC not resolved */ - printf(" Warning: Alert mac address was not resolved!" - " Check %s interface or use -i.\n",ifname); - /* use existing BMC alert dest mac (as best guess) */ - memcpy(rgdestmac,bmcdestmac,6); + } + LanRecord.data[0] = 0x01; /* static IP address source */ + ret = SetLanEntry (4, &LanRecord, 1); + printf ("SetLanEntry(4), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + memcpy (&LanRecord, rgmyip, 4); + ret = SetLanEntry (3, &LanRecord, 4); + printf ("SetLanEntry(3), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + if (MacIsValid (rgmymac)) { + memcpy (&LanRecord, rgmymac, 6); + ret = SetLanEntry (5, &LanRecord, 6); + if (ret == 0x82) { + + /* Do not show anything, not an error if BMC does not + allow the BMC MAC to be changed. */ + if (fdebug) + + printf ("SetLanEntry(5), ret = %x cannot modify MAC\n", ret); } - /* show destination data */ - printf("alert dest %d\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", - alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3], - rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3], - rgdestmac[4], rgdestmac[5]); - printf("snmp community \t%s\n",rgcommunity); - /* Only need the SNMP community if there is an Alert Destination */ - memset(&LanRecord.data[0], 0, 18); /* make sure zero-filled */ - strcpy((char *)&LanRecord.data[0],rgcommunity); - ret = SetLanEntry(16, &LanRecord, 18); - printf("SetLanEntry(16), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - /* Set Alert Destination Type */ - LanRecord.data[0] = alertnum; /* dest id = 1 */ - LanRecord.data[1] = 0x00; /* dest type = PET, no ack */ - LanRecord.data[2] = 0x01; /* ack timeout / retry interval */ - LanRecord.data[3] = 0x00; /* no retries */ - // LanRecord.data[4] = 0x69; - ret = SetLanEntry(18, &LanRecord, 4); - printf("SetLanEntry(18), ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - { - /* Set the Alert Destination IP & MAC (param 19) */ - LanRecord.data[0] = alertnum; /* dest id = 1 */ - LanRecord.data[1] = 0x00; - LanRecord.data[2] = 0x00; - memcpy(&LanRecord.data[3],rgdestip,4); - memcpy(&LanRecord.data[7],rgdestmac,6); - ret = SetLanEntry(19, &LanRecord, 13); - printf("SetLanEntry(19), ret = %d\n", ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; + else { + + printf ("SetLanEntry(5), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; } - } /*endif valid alert*/ - - /* Now enable PEF since we have an Alert destination. */ - if (!fdisable && !fIPMI10 && fpefenable) { /*fpefenable*/ - ret = EnablePef(alertnum); - printf("EnablePef, ret = %d\n",ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - /* ChanAcc changed, so show it again */ - j = ShowChanAcc(lan_ch); - } - - if ((vlan_enable != PARM_INIT) && (fIPMI20)) { - if (vlan_enable == 0) { /*disable vlan*/ - LanRecord.data[0] = 0x00; - LanRecord.data[1] = 0x00; - ret = SetLanEntry(20, &LanRecord, 2); - printf("SetLanEntry(20,disable) ret = %d\n", ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - } else { /*vlan_enable == 1, enable vlan with id */ - LanRecord.data[0] = (vlan_id & 0x00ff); - LanRecord.data[1] = ((vlan_id & 0x0f00) >> 8) | 0x80; - ret = SetLanEntry(20, &LanRecord, 2); - printf("SetLanEntry(20,%d), ret = %d\n", vlan_id,ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; - LanRecord.data[0] = vlan_prio; - ret = SetLanEntry(21, &LanRecord, 1); - printf("SetLanEntry(21), ret = %d\n", ret); - if (ret != 0) { nerrs++; lasterr = ret; } - else ngood++; + } + if (!SubnetIsValid (rgsubnet)) /* not specified, use previous */ + memcpy (rgsubnet, bmcsubnet, 4); + memcpy (&LanRecord, rgsubnet, 4); + ret = SetLanEntry (6, &LanRecord, 4); + printf ("SetLanEntry(6), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + if (vend_id != VENDOR_PEPPERCON) { + /* may want to check bparm7 here */ + LanRecord.data[0] = parm7[0]; /*IPv4 header, TTL */ + LanRecord.data[1] = parm7[1]; /*IPv4 header, Flags */ + LanRecord.data[2] = parm7[2]; /*IPv4 hdr, Precedence/Service */ + ret = SetLanEntry (7, &LanRecord, 3); + printf ("SetLanEntry(7), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; } - } - if (failover_enable != PARM_INIT) { - if (fRomley || fGrantley) { - if (failover_enable > 1) failover_enable = 0; /*default*/ - ret = lan_failover_intel(failover_enable,(uchar *)&i); - printf("Set Intel Lan Failover (%d), ret = %d\n", - failover_enable,ret); - if (ret != 0) { nerrs++; lasterr = ret; } - } else if (vend_id == VENDOR_SUPERMICROX - || vend_id == VENDOR_SUPERMICRO) { - if (failover_enable > 2) failover_enable = 2; /*default*/ - ret = oem_supermicro_set_lan_port(failover_enable); - printf("Set SuperMicro Lan port to %s, ret = %d\n", - oem_supermicro_lan_port_string(failover_enable),ret); - if (ret != 0) { nerrs++; lasterr = ret; } - } - } /*endif failover specified*/ - } /*end-else not via ipmi_lan*/ - } /*endif not readonly*/ - - if (flanstats) - { /* get BMC LAN Statistics */ + else + ngood++; + } + /* if lan_ch == 3, gcm gets error setting grat arp (ccode=0xCD) */ + if (lan_ch != gcm_ch) { /*skip if gcm */ + /* 01=enable grat arp, 02=enable arp resp, 03=both */ + LanRecord.data[0] = arp_ctl; /*grat arp */ + ret = SetLanEntry (10, &LanRecord, 1); + printf ("SetLanEntry(10,%x), ret = %d\n", arp_ctl, ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + LanRecord.data[0] = arp_interval; /*grat arp interval */ + ret = SetLanEntry (11, &LanRecord, 1); + printf ("SetLanEntry(11), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) { + LanRecord.data[0] = 0x00; /*disable DHCP */ + ret = SetLanEntry (194, &LanRecord, 1); + printf ("SetLanEntry(194), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + } + else { /* error, don't continue */ + printf ("Missing IP Address, can't continue. Use -I to specify\n"); + ret = ERR_BAD_PARAM; + goto do_exit; + } + if (vend_id == VENDOR_KONTRON && rghostname[0] != 0) { + /* set the IPMI Hostname if specified */ + sz = strlen_ (rghostname); + /* LanRecord is larger than rghostname, bounds ok */ + strncpy ((char *) &LanRecord.data, rghostname, sz); + ret = SetLanEntry (194, &LanRecord, sz); + printf ("SetLanEntry(194), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else { + LanRecord.data[0] = 0x31; + ret = SetLanEntry (195, &LanRecord, 1); /*re-read hostname */ + // printf("SetLanEntry(195), ret = %d\n",ret); + // if (ret != 0) { nerrs++; lasterr = ret; } + } + } + if (IpIsValid (rggwyip)) { + if (!MacIsValid (rggwymac)) /* if gwy MAC not set by user */ + ret = Get_Mac (rggwyip, rggwymac, NULL); + printf + ("gateway \tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", + rggwyip[0], rggwyip[1], rggwyip[2], rggwyip[3], rggwymac[0], + rggwymac[1], rggwymac[2], rggwymac[3], rggwymac[4], rggwymac[5]); + if (!SubnetIsSame (rgmyip, rggwyip, rgsubnet)) { + printf + ("WARNING: IP Address and Gateway are not on the same subnet," + " setting Gateway to previous value\n"); + memcpy (rggwyip, bmcgwyip, 4); + memcpy (rggwymac, bmcgwymac, 6); + } + + /* Set the Default Gateway IP & MAC */ + memcpy (&LanRecord, rggwyip, 4); + ret = SetLanEntry (12, &LanRecord, 4); + printf ("SetLanEntry(12), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + if (!MacIsValid (rggwymac)) { /* if gwy MAC not resolved */ + printf (" Warning: Gateway MAC address was not resolved! " + "Check %s interface, use -i ethN, or use -H gwymac.\n", + ifname); + memcpy (&LanRecord, bmcgwymac, 6); + } + else { + memcpy (&LanRecord, rggwymac, 6); + } + ret = SetLanEntry (13, &LanRecord, 6); + printf ("SetLanEntry(13), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + if (IpIsValid (rggwy2ip)) { + if (!MacIsValid (rggwy2mac)) /* if gwy2 MAC not set by user */ + ret = Get_Mac (rggwy2ip, rggwy2mac, NULL); + /* Set the Secondary Gateway IP & MAC */ + memcpy (&LanRecord, rggwy2ip, 4); + ret = SetLanEntry (14, &LanRecord, 4); + printf ("SetLanEntry(14), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + memcpy (&LanRecord, rggwy2mac, 6); + ret = SetLanEntry (15, &LanRecord, 6); + printf ("SetLanEntry(15), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + } /* end-else static IP */ + if (flansecure) { /* disable cipher 0 */ + char c1, c2; + memset (&LanRecord, 0, 12); + j = 1; + for (i = 0; i < nciphers; i += 2) { + c1 = rgciphers[i]; + c2 = rgciphers[i + 1]; + /* 0x0f may be vendor-specific, 0x00 = Reserved/Unused */ + if (i == ncipher0) + c1 = 0x00; + if ((i + 1) == ncipher0) + c2 = 0x00; + LanRecord.data[j++] = (c2 << 4) | c1; + } + ret = SetLanEntry (24, &LanRecord, 9); + printf ("SetLanEntry(24) disable cipher0, ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + ret = SetupSerialOverLan (1); /*enable */ + SELprintf ("SetupSerialOverLan: ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else ngood++; + if (!IpIsValid (rgdestip) && IpIsValid (bmcdestip)) { + memcpy (rgdestip, bmcdestip, 4); + if (fdebug) + printf ("Using current dest IP %d.%d.%d.%d\n", + bmcdestip[0], bmcdestip[1], bmcdestip[2], bmcdestip[3]); + } + if (ndest == 0) { + if (fdebug) + printf ("ndest==0, anum=%d rgdestip=%d.%d.%d.%d\n", + alertnum, rgdestip[0], rgdestip[1], rgdestip[2], + rgdestip[3]); + printf ("alert dest \tnot supported\n"); + } + else if (!IpIsValid (rgdestip)) { + printf ("alert dest \taddress not specified\n"); + } + else { /* valid alert dest ip */ + if (!MacIsValid (rgdestmac)) /* if dest MAC not set by user */ + ret = Get_Mac (rgdestip, rgdestmac, NULL); /*try to resolve MAC */ + if (!MacIsValid (rgdestmac)) { /* if dest MAC not resolved */ + printf (" Warning: Alert mac address was not resolved!" + " Check %s interface or use -i.\n", ifname); + /* use existing BMC alert dest mac (as best guess) */ + memcpy (rgdestmac, bmcdestmac, 6); + } + /* show destination data */ + printf("alert dest %d\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", + alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3], + rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3], + rgdestmac[4], rgdestmac[5]); + printf ("snmp community \t%s\n", rgcommunity); + /* Only need the SNMP community if there is an Alert Destination */ + memset (&LanRecord.data[0], 0, 18); /* make sure zero-filled */ + strcpy ((char *) &LanRecord.data[0], rgcommunity); + ret = SetLanEntry (16, &LanRecord, 18); + printf ("SetLanEntry(16), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + /* Set Alert Destination Type */ + LanRecord.data[0] = alertnum; /* dest id = 1 */ + LanRecord.data[1] = 0x00; /* dest type = PET, no ack */ + LanRecord.data[2] = 0x01; /* ack timeout / retry interval */ + LanRecord.data[3] = 0x00; /* no retries */ + // LanRecord.data[4] = 0x69; + ret = SetLanEntry (18, &LanRecord, 4); + printf ("SetLanEntry(18), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else ngood++; + { + /* Set the Alert Destination IP & MAC (param 19) */ + LanRecord.data[0] = alertnum; /* dest id = 1 */ + LanRecord.data[1] = 0x00; + LanRecord.data[2] = 0x00; + memcpy (&LanRecord.data[3], rgdestip, 4); + memcpy (&LanRecord.data[7], rgdestmac, 6); + ret = SetLanEntry (19, &LanRecord, 13); + printf ("SetLanEntry(19), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else ngood++; + } + } /*endif valid alert */ + + /* Now enable PEF since we have an Alert destination. */ + if (!fdisable && !fIPMI10 && fpefenable) { /*fpefenable */ + ret = EnablePef (alertnum); + printf ("EnablePef, ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + /* ChanAcc changed, so show it again */ + j = ShowChanAcc (lan_ch); + } + + if ((vlan_enable != PARM_INIT) && (fIPMI20)) { + if (vlan_enable == 0) { /*disable vlan */ + LanRecord.data[0] = 0x00; + LanRecord.data[1] = 0x00; + ret = SetLanEntry (20, &LanRecord, 2); + printf ("SetLanEntry(20,disable) ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + else { /*vlan_enable == 1, enable vlan with id */ + LanRecord.data[0] = (vlan_id & 0x00ff); + LanRecord.data[1] = ((vlan_id & 0x0f00) >> 8) | 0x80; + ret = SetLanEntry (20, &LanRecord, 2); + printf ("SetLanEntry(20,%d), ret = %d\n", vlan_id, ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + LanRecord.data[0] = vlan_prio; + ret = SetLanEntry (21, &LanRecord, 1); + printf ("SetLanEntry(21), ret = %d\n", ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + else + ngood++; + } + } + if (failover_enable != PARM_INIT) { + if (fRomley || fGrantley) { + if (failover_enable > 1) + failover_enable = 0; /*default */ + ret = lan_failover_intel (failover_enable, (uchar *) & i); + printf ("Set Intel Lan Failover (%d), ret = %d\n", + failover_enable, ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + } + else if (vend_id == VENDOR_SUPERMICROX + || vend_id == VENDOR_SUPERMICRO) { + if (failover_enable > 2) + failover_enable = 2; /*default */ + ret = oem_supermicro_set_lan_port (failover_enable); + printf ("Set SuperMicro Lan port to %s, ret = %d\n", + oem_supermicro_lan_port_string (failover_enable), ret); + if (ret != 0) { + nerrs++; + lasterr = ret; + } + } + } /*endif failover specified */ + } /*end-else not via ipmi_lan */ + } /*endif not readonly */ + + if (flanstats) { /* get BMC LAN Statistics */ #ifdef METACOMMAND - j = get_lan_stats(lan_ch); + j = get_lan_stats (lan_ch); #else - uchar idata[2]; - uchar rdata[20]; - int rlen; - uchar cc; - idata[0] = lan_ch; - idata[1] = 0x00; /*do not clear stats*/ - rlen = sizeof(rdata); - j = ipmi_cmd(GET_LAN_STATS, idata,2, rdata,&rlen, &cc, fdebug); - if (j == 0) { /*show BMC LAN stats*/ - ushort *rw; - rw = (ushort *)&rdata[0]; - printf("IPMI LAN channel %d statistics: \n",lan_ch); - printf(" \tReceived IP Packets = %d\n",rw[0]); - printf(" \tRecvd IP Header errors = %d\n",rw[1]); - printf(" \tRecvd IP Address errors = %d\n",rw[2]); - printf(" \tRecvd IP Fragments = %d\n",rw[3]); - printf(" \tTransmitted IP Packets = %d\n",rw[4]); - printf(" \tReceived UDP Packets = %d\n",rw[5]); - printf(" \tReceived Valid RMCP Pkts = %d\n",rw[6]); - printf(" \tReceived UDP Proxy Pkts = %d\n",rw[7]); - printf(" \tDropped UDP Proxy Pkts = %d\n",rw[8]); - } + uchar idata[2]; + uchar rdata[20]; + int rlen; + uchar cc; + idata[0] = lan_ch; + idata[1] = 0x00; /*do not clear stats */ + rlen = sizeof (rdata); + j = ipmi_cmd (GET_LAN_STATS, idata, 2, rdata, &rlen, &cc, fdebug); + if (j == 0) { /*show BMC LAN stats */ + ushort *rw; + rw = (ushort *) & rdata[0]; + printf ("IPMI LAN channel %d statistics: \n", lan_ch); + printf (" \tReceived IP Packets = %d\n", rw[0]); + printf (" \tRecvd IP Header errors = %d\n", rw[1]); + printf (" \tRecvd IP Address errors = %d\n", rw[2]); + printf (" \tRecvd IP Fragments = %d\n", rw[3]); + printf (" \tTransmitted IP Packets = %d\n", rw[4]); + printf (" \tReceived UDP Packets = %d\n", rw[5]); + printf (" \tReceived Valid RMCP Pkts = %d\n", rw[6]); + printf (" \tReceived UDP Proxy Pkts = %d\n", rw[7]); + printf (" \tDropped UDP Proxy Pkts = %d\n", rw[8]); + } #endif - } + } do_exit: - ipmi_close_(); - if (foptmsg) { - if (fset_ip != 0) - printf("WARNING: IP address options were specified, but no -e,-l,-d option.\n"); - else - printf("WARNING: %d options were specified, but no -e,-l,-d option.\n", - nopts); - printf("Read-only usage assumed.\n"); - } - if (nerrs > 0) { - printf("Warning: %d ok, %d errors occurred, last error = %d\n",ngood,nerrs,lasterr); - ret = lasterr; - } - // show_outcome(progname,ret); - return(ret); -} /* end main()*/ + ipmi_close_ (); + if (foptmsg) { + if (fset_ip != 0) + printf + ("WARNING: IP address options were specified, but no -e,-l,-d option.\n"); + else + printf ("WARNING: %d options were specified, but no -e,-l,-d option.\n", + nopts); + printf ("Read-only usage assumed.\n"); + } + if (nerrs > 0) { + printf ("Warning: %d ok, %d errors occurred, last error = %d\n", ngood, + nerrs, lasterr); + ret = lasterr; + } + // show_outcome(progname,ret); + return (ret); +} /* end main() */ /* end ilan.c */ diff --git a/util/ilan.c~ b/util/ilan.c~ new file mode 100644 index 0000000..7d91d55 --- /dev/null +++ b/util/ilan.c~ @@ -0,0 +1,5242 @@ +/*--------------------------------------------------------------------------- + * Filename: ilan.c (was pefconfig.c) + * + * Author: arcress at users.sourceforge.net + * Copyright (c) 2009 Kontron America, Inc. + * + * Abstract: + * This tool sets up the custom Platform Event Filter for the panicSEL + * record (0x20, OS Critical Stop) to send a PEF SNMP alert for Linux + * panics. It also configures the BMC LAN parameters, which are needed + * to support PEF alerts. + * + * ----------- Change History ----------------------------------------------- + * 10/16/01 Andy Cress - created + * 10/24/01 Andy Cress - mods for SetPefEntry(0c) + * 11/02/01 Andy Cress - added option to disable a given PefEntry + * 11/15/01 Andy Cress - added function to GetLanEntry + * 11/19/01 Andy Cress - added function to SetLanEntry + * 01/18/02 Andy Cress - added GetCfgData function + * 01/31/02 Andy Cress - converted to use ipmi_cmd_ia + * 02/06/02 Andy Cress - removed GetCfgData + * 02/06/02 Andy Cress - added ipmi_cmd_va + * 02/08/02 Andy Cress - added GetChanAcc + * 02/14/02 Andy Cress - added Get_IPMac_Addr() + * 02/21/02 Andy Cress - added Alert IP/MAC logic to Get_IPMac_Addr() + * 03/21/02 Andy Cress - do SetChanAcc(0x80) with every SetChanAcc(0x40) + * 04/15/02 Andy Cress v1.2 - fix bug with user-specified Alert IP: + * (ccode=c7 on SetLanEntry(16 & 18), also + * added Get_Mac() for user-specified Alert IP. + * 04/16/02 Andy Cress v1.3 added SetUser() to set password if specified, + * also changed unset mac[0] to be 0xFF, not 0. + * 05/09/02 Andy Cress v1.4 fixed bug 504 gwymac[0]=00 (mymac overwrote it), + * also fixed alert scan to pick last trapsink + * 05/31/02 Andy Cress v1.5 for gwy mac, changed arping -c 1 to -c 2, + * also get com2sec community from snmpd.conf, + * set dest type for no ack, no retry, + * special handling to set preset PEF entries + * 07/02/02 Andy Cress v1.6 added more Usage text + * 07/08/02 Andy Cress v1.7 SetUserAccess length change + * 08/02/02 Andy Cress v1.8 moved common ipmi_cmd() code to ipmicmd.c + * 08/27/02 Andy Cress v1.9 fixed 0xc7 on SETUSER_ACCESS with pefconfig -P "", + * show message if alert dest not found + * 09/10/02 Andy Cress v1.10 make channel nums into defines (16) + * 09/17/02 Andy Cress v1.11 decode Dest Addr IP (19) in decimal, + * fix enable user padding in SetUser, + * display new community string when setting + * 12/09/02 Andy Cress v1.12 fix error w -C & snmpd.conf conflict + * 01/29/03 Andy Cress v1.13 added MV OpenIPMI support + * 02/05/03 Andy Cress v1.14 show pef entry descriptions, + * added EnablePef routine + * show correct Alert dest mac if -A only + * 04/04/03 Andy Cress v1.15 add eth interface option (-i) + * 05/13/03 Andy Cress v1.16 fix EnablePef if startup delay not supported + * 06/19/03 Andy Cress v1.17 added errno.h (email from Travers Carter) + * 07/25/03 Andy Cress v1.18 add SerialOverLan configuration + * mod to SetUser, added GetBmcEthDevice, + * use 'arping -I' if eth1. + * 08/18/03 Andy Cress v1.19 Don't abort if IPMI 1.0, just skip PEF, + * SetLanEntry(10 & 11) for bmc grat arp, + * SetLanEntry(2) to 0x17 for auth priv + * 09/10/03 Andy Cress v1.20 Don't enable a PEF entry if it is empty, + * added -L lan_ch parameter, + * scan for lan_ch in GetBmcEthDevice + * 09/22/03 Andy Cress v1.21 Add DHCP option (-D), from Jerry Yu. + * 12/05/03 Andy Cress v1.22 Fix auth type enables for ServerConfig + * 12/16/03 Andy Cress v1.23 Allow flexible auth types via authmask + * 03/19/04 Andy Cress v1.24 Change default pefnum for mBMC to 10 + * 04/15/04 Andy Cress v1.25 Init each response for channel info, avoids + * 0xcc error with /dev/ipmi0 due to wrong lan_ch + * 05/05/04 Andy Cress v1.26 call ipmi_close before exit. Note that + * Get_IPMac_Addr and GetBmcEthDevice + * routines need more work for WIN32. + * 05/24/04 Andy Cress v1.27 added CHAN_ACC params for ia64 + * 06/28/04 Andy Cress v1.28 added parsing to get community from trapsink + * 07/23/04 Andy Cress v1.29 use lan_ch variable to set Alert Policy Table + * 08/23/04 Andy Cress v1.30 fixed decoding of PE Table entries, + * added -e option (same as no params) + * 08/25/04 Andy Cress v1.31 added some WIN32 logic to Get_Mac, Get_IPMac_Addr + * 11/01/04 Andy Cress v1.32 add -N / -R for remote nodes + * added -U for remote username + * 11/18/04 Andy Cress v1.33 added -u to configure a lan username (user 2) + * 11/23/04 Andy Cress v1.34 added pef_defaults if first 11 empty + * 01/11/05 Andy Cress v1.35 allow scan for BMC LAN if fIPMI10 + * 01/20/05 Andy Cress v1.36 fix to allow IPMI 2.0 + * 02/16/05 Andy Cress v1.37 added IPMI 2.0 VLAN parameters, + * if DHCP, can set DHCP Server via -I param + * 03/02/05 Andy Cress v1.38 show Serial-Over-Lan params, + * fix -L with lan_ch_parm. mods to GetBmcEthDevice + * 03/18/05 Andy Cress v1.39 fix GetBmcEthDevice for invalid MAC compares + * 06/03/05 Andy Cress v1.40 For my MAC in BMC, check user-specified, then + * check existing BMC MAC, then check OS MAC. + * 06/10/05 Andy Cress v1.41 Display multiple Alert Destinations, + * handle fSOL20 commands + * 07/07/05 Andy Cress v1.42 Fix GetBmcEthDevice for TIGI2U to skip GCM ch 3 + * 07/08/05 Andy Cress v1.43 Mods to handle Intel NSI2U miniBMC, + * 08/01/05 Andy Cress v1.44 added -t option to test if BMC LAN configured + * 08/10/05 Andy Cress v1.45 truncate extra string chars, + * decode more PEF params + * 09/07/05 Andy Cress v1.46 enable mBMC PEF entries 26 thru 30 + * 04/06/06 Andy Cress v1.47 show "gcm" as ifname if -L 3. + * 06/20/06 Andy Cress v1.48 fix strcmp(gcm), show all 4 alert policies, + * add PefDesc() for misc vendor pefdesc, add -a. + * 08/08/06 Andy Cress v1.49 add Alcolu to fsharedMAC + * 09/29/06 Andy Cress v1.52 use bmcmymac if valid, use bmcmyip if ok, + * added -q for user number, + * enhanced Get_IPMac_Addr for Windows + * 10/12/06 Andy Cress v1.53 FindEthNum updates, always use gwy iface for mac + * 11/02/06 Andy Cress v1.55 add user names, EnablePef mods for non-Intel. + * 05/02/07 Brian Johnson v1.65 add fpefenable flag to not do SetPefEntry + * if no Alert Destination. Previously did + * SetPefEntry but not EnablePef in this case. + * 05/04/07 Andy Cress v1.65 Use 0x02 for DHCP source instead of 0x03, + * fix 1714748 missing "X:" in getopt line + * 05/23/07 Jakub Gorgolewski + * v1.66 Use iphlpapi for Windows detection + * 10/31/07 Andy Cress v2.3 Fixed PEF entry for Power Redundancy Lost + * 11/15/07 Andy Cress v2.4 Move custom PEF to #14, add to usage, + * Allow broadcast MAC for -X + * 12/17/07 Andy Cress v2.5 Add fSetPEFOks & secondary Gateway + */ +/*M* + *--------------------------------------------------------------------------- +Copyright (c) 2009 Kontron America, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a.. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b.. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + c.. Neither the name of Kontron nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *--------------------------------------------------------------------------- + *M*/ +#ifdef WIN32 +#include <winsock2.h> +#include <iphlpapi.h> +#include <windows.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "getopt.h" +#elif defined(DOS) +#include <dos.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "getopt.h" +#else +/* Linux or similar */ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#if defined(HPUX) +/* getopt is defined in stdio.h */ +#elif defined(MACOS) +/* getopt is defined in unistd.h */ +#include <unistd.h> +#else +#include <getopt.h> +#endif +#include <string.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <errno.h> +#endif +#ifdef LINUX +#include <unistd.h> +#endif +#ifdef SOLARIS +#include <sys/sockio.h> +#define SIOCGIFHWADDR SIOCGENADDR +#define ifr_netmask ifr_ifru.ifru_addr +// #define ifr_hwaddr.sa_data ifr_ifru.ifru_enaddr +#elif defined(BSD) +#include <sys/sockio.h> +#define SIOCGIFHWADDR SIOCGIFMAC +#define ifr_netmask ifr_ifru.ifru_addr +// #define ifr_hwaddr.sa_data ifr_ifru.ifru_addr +#elif defined(MACOS) +#include <sys/sockio.h> +#define ifr_netmask ifr_ifru.ifru_addr +#endif +#include "ipmicmd.h" +#include "oem_intel.h" +#include "oem_supermicro.h" + +#define SELprintf printf +#define RTF_UP 0x0001 /* route usable */ + +#define SOL_ENABLE_FLAG 0x01 +#define SOL_DISABLE_FLAG 0x00 +#define SOL_PRIVILEGE_LEVEL_USER 0x02 +#define SOL_PRIVILEGE_LEVEL_OPERATOR 0x03 +#define SOL_PRIVILEGE_LEVEL_ADMIN 0x04 +#define SOL_PREFERRED_BAUD_RATE 0x0a /*115.2k*/ +/* For IPMI 1.5, use Intel SOL commands & subfunctions */ +#define SOL_ENABLE_PARAM 0x01 +#define SOL_AUTHENTICATION_PARAM 0x02 +#define SOL_ACC_INTERVAL_PARAM 0x03 +#define SOL_RETRY_PARAM 0x04 +#define SOL_BAUD_RATE_PARAM 0x05 /*non-volatile*/ +#define SOL_VOL_BAUD_RATE_PARAM 0x06 /*volatile*/ +/* For IPMI 2.0, use IPMI SOL commands & subfunctions */ +#define SOL_ENABLE_PARAM2 0x08 +#define SOL_AUTHENTICATION_PARAM2 0x09 +#define SOL_BAUD_RATE_PARAM2 0x11 + +/* IPMI 2.0 SOL PAYLOAD commands */ +#define SET_PAYLOAD_ACCESS 0x4C +#define GET_PAYLOAD_ACCESS 0x4D +#define GET_PAYLOAD_SUPPORT 0x4E + +/* Channel Access values */ +#define CHAN_ACC_DISABLE 0x20 /* PEF off, disabled*/ +#define CHAN_ACC_PEFON 0x02 /* PEF on, always avail */ +#define CHAN_ACC_PEFOFF 0x22 /* PEF off, always avail*/ +/* special channel access values for ia64 */ +#define CHAN_ACC_PEFON64 0x0A /* PEF on, always avail, UserLevelAuth=off */ +#define CHAN_ACC_PEFOFF64 0x2A /* PEF off, always avail, UserLevelAuth=off */ +#define OS_LINUX 1 +#define OS_WINDOWS 2 +#define OS_SOLARIS 3 +#define OS_BSD 4 +#define OS_HPUX 5 + + /* TSRLT2 Channels: 0=IPMB, 1=Serial/EMP, 6=LAN2, 7=LAN1 */ + /* S5000 Channels: 0=IPMB, 1=LAN1, 2=LAN2, 3=RMM2, 4=Serial, 6=pci, 7=sys */ + /* For TIGPT1U/mBMC: 1=LAN channel, no serial */ +#define LAN_CH 1 +#define SER_CH 4 +#define MAXCHAN 12 /*was 16, reduced for gnu ipmi_lan*/ +#define NUM_DEVICES_TO_CHECK 32 /*for GetBmcEthDevice()*/ +#define MAC_LEN 6 /*length of MAC Address*/ +#define PSW_LEN 16 /* see also PSW_MAX =20 in ipmicmd.h*/ +/* Note: The optional IPMI 2.0 20-byte passwords are not supported here, + * due to back-compatibility issues. */ + + /* IP address source values */ +#define SRC_STATIC 0x01 +#define SRC_DHCP 0x02 /* BMC running DHCP */ +#define SRC_BIOS 0x03 /* BIOS, sometimes DHCP */ +#define SRC_OTHER 0x04 + +/* PEF event severities */ +#define PEF_SEV_UNSPEC 0x00 +#define PEF_SEV_MON 0x01 +#define PEF_SEV_INFO 0x02 +#define PEF_SEV_OK 0x04 +#define PEF_SEV_WARN 0x08 +#define PEF_SEV_CRIT 0x10 +#define PEF_SEV_NORECOV 0x20 +#define FLAG_INIT 99 /*initial value of char flag, beyond scope*/ +#define PARM_INIT 0xff + +typedef struct +{ /* See IPMI Table 15-2 */ + uchar rec_id; + uchar fconfig; + uchar action; + uchar policy; + uchar severity; + uchar genid1; + uchar genid2; + uchar sensor_type; + uchar sensor_no; + uchar event_trigger; + uchar data1; + uchar mask1; + uchar res[9]; +} PEF_RECORD; + +typedef struct +{ /* See IPMI Table 19-3 */ + uchar data[36]; +} LAN_RECORD; /*LanRecord*/ + +#ifdef METACOMMAND +extern int get_lan_stats(uchar chan); /*see bmchealth.c */ +extern char *get_sensor_type_desc(uchar stype); /*from ievents.c*/ +#endif + +#define MYIP 0x01 +#define GWYIP 0x02 +#define DESTIP 0x04 +#define MAXPEF 41 /* max pefnum offset = 40 (41 entries) */ +/* + * Global variables + */ +static char * progver = "3.03"; +static char * progname = "ilan"; +static char fdebug = 0; +static char fipmilan = 0; +static char fIPMI10 = 0; /* =1 if IPMI v1.0 or less */ +static char fIPMI20 = 0; /* =1 if IPMI v2.0 or greater */ +static char fSOL20 = 1; /* =1 if use Serial-Over-Lan 2.0 w IPMI 2.0 */ +static char fsharedMAC = 0; /* =1 if special shared-MAC BMC LAN port */ +static char fAdjustPefNum = 0; /* =1 adjust pefnum to first empty index */ +static char fUserPefNum = 0; /* =1 if user specified a valid pefnum value*/ +static char freadonly = 1; /* =1 to only read LAN & PEF parameters */ +static char fcanonical = 0; /* =1 to show only canonical output */ +static char flansecure = 0; /* =1 set lan security: no null, cipher0 off*/ +static char bdelim = BCOLON; /* delimiter ':' or '|' if canonical output*/ +static char ftestonly = 0; +static char fprivset = 0; +static char flanstats = 0; /* =1 to show the IPMI LAN statistics */ +static char foptmsg = 0; /* =1 to show the option warning msg */ +static char fshowchan = 0; /* =1 to show the IPMI channels */ +static char nopts = 0; /* number of pefconfig options specified*/ +static int nerrs = 0; /* number of errors during processing */ +static int ngood = 0; /* number of good results */ +static int lasterr = 0; /* value of the last error */ +static char fCustomPEF = 0; /* =1 if -j to input a custom PEF record */ +static char fSetPEFOks = 0; /* =1 if -k to set PEF OK rules */ +static char fdisable = 0; +static char fenable = 0; /* =1 to config BMC LAN and PEF */ +static char fpefenable = 0; /* =1 enable PEF if Alert Dest is specified*/ +static char fdisableSOL = 0; +static char fgetser = 0; +static char fsetifn = 0; /* =1 if user specified ifname[] with -i */ +static char fethfound = 0; /* =1 if FindEthNum successful */ +static char fset_ip = 0; /* !=0 if options used to specify an IP addr*/ +static char fpassword = 0; /* =1 user-specified a password, so set it. */ +static uchar fmBMC = 0; /* =1 mini-BMC, =0 Sahalee BMC */ +static uchar fiBMC = 0; /* =1 Intel iBMC */ +static uchar fRomley = 0; /* =1 Intel Romley BMC */ +static uchar fGrantley = 0; +static uchar fipv6 = 0; /* =1 if BMC supports IPv6 */ +static uchar bmcpefctl = 0; /* existing BMC PEF Control, !0 = enabled */ +static char alertnum = 1; /* alert dest num (usu 1 thru 4) */ +static char alertmax = 9; /* alert dest num max (usu 4, error if >9) */ +static char pefnum = 12; /* 11 pre-defined entries, adding 12th */ +static char pefadd = 0; /* num PEF rules added (usu 2, could be 5 */ +static char pefmax = MAXPEF; /* 20 for Sahalee, 30 for miniBMC */ +static char *myuser = NULL; /* username to set, specified by -u */ +static uchar usernum = 0; /* set non-zero to specify user number */ +static uchar rgmyip[4] = {0,0,0,0}; +static uchar rggwyip[4] = {0,0,0,0}; +static uchar rggwy2ip[4] = {0,0,0,0}; +static uchar rgdestip[4] = {0,0,0,0}; +static uchar rgsubnet[4] = {0,0,0,0}; +static uchar bmcsubnet[4] = {255,255,255,0}; /* default subnet */ +static uchar ossubnet[4] = {0,0,0,0}; +static uchar osmyip[4] = {0,0,0,0}; +static uchar bmcmyip[4] = {0,0,0,0}; +static uchar bmcdestip[4] = {0,0,0,0}; +static uchar bmcdestmac[6]= {0xff,0,0,0,0,0}; +static uchar bmcgwyip[4] = {0,0,0,0}; +static uchar bmcgwymac[6]= {0xff,0,0,0,0,0}; +static uchar bmcmymac[6] = {0xff,0,0,0,0,0}; +static uchar rgmymac[6] = {0xff,0,0,0,0,0}; +static uchar osmymac[6] = {0xff,0,0,0,0,0}; +static uchar rggwymac[6] = {0xff,0,0,0,0,0}; +static uchar rggwy2mac[6] = {0xff,0,0,0,0,0}; +static uchar rgdestmac[6] = {0xff,0,0,0,0,0}; +static uchar rgdhcpmac[6] = {0xff,0,0,0,0,0}; +static int nciphers = 16; +static int ncipher0 = 0; +static uchar rgciphers[16] = {0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +static char rghostname[32] = {'\0'}; +static uchar custPEF[20]; /* max used = 18 bytes */ +static char rgcommunity[19] = "public"; /* default community */ +static char fsetcommunity = 0; /* =1 if user-specified community */ +static char passwordData[PSW_MAX+1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +static uchar authmask = 0; /* usu 0x17, mBMC = 0x15 */ +static uchar bAuth = 0x16; /*exclude auth=None for security*/ +static uchar arp_interval = 0x04; /* in 500 ms increments, 0-based */ +static uchar arp_ctl = 0x01; /* 01=grat arp, 02=arp resp, 03=both*/ +static uchar fsetarp = 0; /* 1=user-specified arp_ctl */ +#ifdef WIN32 +static uchar ostype = OS_WINDOWS; /*windows*/ +static char ifname[64] = "Local Area Connection "; /* interface name */ +static char ifpattn[25] = "Local Area Connection "; +#elif SOLARIS +/* for i86pc use "e1000g0", but for sun4u(sparc) this might be "eri0" */ +static uchar ostype = OS_SOLARIS; +#ifdef __SPARC__ +static char ifname[16] = "eri0"; /* SPARC interface name */ +static char ifname0[16] = "eri0"; +static char ifpattn[14] = "eri"; +#else +static char ifname[16] = "e1000g0"; /* Solaris x86 interface name */ +static char ifname0[16] = "e1000g0"; +static char ifpattn[14] = "e1000g"; +#endif +#elif defined(BSD) +static uchar ostype = OS_BSD; +static char ifname[16] = "em0"; /* interface name */ +static char ifname0[16] = "em0"; +static char ifpattn[14] = "em"; +#elif defined(HPUX) +static uchar ostype = OS_HPUX; +static char ifname[16] = "lan0"; /* interface name */ +static char ifname0[16] = "lan0"; +static char ifpattn[14] = "lan"; +#else +static uchar ostype = OS_LINUX; +static char ifname[16] = "eth0"; /* interface name */ +static char ifname0[16] = "eth0"; +static char ifpattn[14] = "eth"; +#endif +static char *pspace1 = "\t"; /*used for fcanonical output*/ +static char *pspace2 = "\t\t"; +static char *pspace3 = "\t\t\t"; +static char *pspace4 = "\t\t\t\t"; +static int vend_id; +static int prod_id; +static int lan_dhcp = 0; /*=1 if using DHCP for bmc lan channel*/ +static uchar ser_ch = SER_CH; +static uchar gcm_ch = PARM_INIT; +static uchar failover_enable = PARM_INIT; +static uchar vlan_enable = PARM_INIT; +static uchar vlan_prio = 0; /*default = 0*/ +static ushort vlan_id = 0; /*max 12 bits used*/ +static uchar lan_access = 0x04; /* -v usu 4=Admin, 3=Operator, 2=User */ +static uchar lan_user = 0x02; /* -u if specified, default to user 2 */ +static uchar lan_ch_parm = PARM_INIT; /* -L to set, unused if PARM_INIT */ +static uchar lan_ch = LAN_CH; /* default=LAN_CH=1 */ +static uchar max_users = 5; /* set in GetUser(1); */ +static uchar enabled_users = 0; /* set in GetUser(1); */ +static uchar show_users = 5; /* default, adjusted based on DeviceID */ +static uchar fnewbaud = 0; /* =1 if user specified baud */ +static uchar sol_baud = SOL_PREFERRED_BAUD_RATE; /*115.2k default*/ +static uchar sol_accum[2] = { 0x04, 0x32 }; +static uchar sol_retry[2] = { 0x06, 0x14 }; +static uchar sol_bvalid = 0; /* =1 if SOL baud is valid */ +static uchar chan_pefon = CHAN_ACC_PEFON; +static uchar chan_pefoff = CHAN_ACC_PEFOFF; +static uchar SessInfo[18]; /* Session Info data */ +// static uchar bparm7[3] = {0x00, 0x00, 0x00}; /*ipv4 header before*/ +static uchar iparm7[3] = {0x1E, 0x00, 0x00}; /*intel ipv4 TTL,Flags,Service*/ +static uchar oparm7[3] = {0x40, 0x40, 0x10}; /*other ipv4 TTL,Flags,Service*/ +static uchar *parm7 = &oparm7[0]; +#define MAX_PEFPARAMS 14 /* max pef params = 14 */ +uchar peflen[MAX_PEFPARAMS] = {0,1,1,1,1,1,21,2,1,4,17,1,3,18}; /*for ShowPef*/ +uchar pef_array[MAXPEF][21]; /* array of all PEF entries read, */ + /* sizeof(PEF_RECORD) = 21 */ +uchar pef_defaults[11][21] = { /* array of first 11 default PEF entries */ +{0x01,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x01,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Temp*/ +{0x02,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x02,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Volt*/ +{0x03,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x04,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Fan*/ +{0x04,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x05,0x05,0x03,0x01,0x00,0,0,0,0,0,0,0,0,0}, /*Chass*/ +{0x05,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x08,0xff,0x6f,0x06,0x00,0,0,0,0,0,0,0,0,0}, /*PS*/ +{0x06,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x0c,0x08,0x6f,0x02,0x00,0,0,0,0,0,0,0,0,0}, /*ECC*/ +{0x07,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x0f,0x06,0x6f,0x01,0x00,0,0,0,0,0,0,0,0,0}, /*FRB*/ +{0x08,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x07,0xff,0x6f,0x1c,0x00,0,0,0,0,0,0,0,0,0}, /*POST*/ +{0x09,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x13,0xff,0x6f,0x3e,0x03,0,0,0,0,0,0,0,0,0}, /*NMI*/ +{0x0a,0x80,1,1,PEF_SEV_INFO,0xff,0xff,0x23,0x03,0x6f,0x0e,0x00,0,0,0,0,0,0,0,0,0}, /*WDT*/ +{0x0b,0x80,1,1,PEF_SEV_MON,0xff,0xff,0x12,0xff,0x6f,0x02,0x00,0,0,0,0,0,0,0,0,0} };/*Restart*/ + +char **pefdesc; +char *pefdesc1[MAXPEF] = { /* for Sahalee BMC */ +/* 0 0x00 */ "", +/* 1 0x01 */ "Temperature Sensor", +/* 2 0x02 */ "Voltage Sensor", +/* 3 0x04 */ "Fan Failure", +/* 4 0x05 */ "Chassis Intrusion", +/* 5 0x08 */ "Power Supply Fault", +/* 6 0x0c */ "Memory ECC Error", +/* 7 0x0f */ "BIOS POST Error", +/* 8 0x07 */ "FRB Failure", +/* 9 0x13 */ "Fatal NMI", +/*10 0x23 */ "Watchdog Timer Reset", +/*11 0x12 */ "System Restart", +/*12 0x20 */ "OS Critical Stop", +/*13 0x09 */ "Power Redundancy Lost", +/*14 0x00 */ "reserved", +/*15 0x00 */ "reserved", +/*16 0x00 */ "reserved", +/*17 */ "reserved", +/*18 */ "reserved", +/*19 */ "reserved", +/*20 */ "reserved", +/*21 */ "reserved", +/*22 */ "reserved", +/*23 */ "reserved", +/*24 */ "reserved", +/*25 */ "reserved", +/*26 */ "reserved", +/*27 */ "reserved", +/*28 */ "reserved", +/*29 */ "unused", +/*30 */ "unused" }; + +char *pefdesc2[MAXPEF] = { /* for NSC miniBMC */ +/* 0 */ "", +/* 1 0x02*/ "Voltage Sensor Assert", +/* 2 0x23*/ "Watchdog FRB Timeout", /* was "Proc FRB Thermal", */ +/* 3 0x02*/ "Voltage Sensor Deassert", +/* 4 0x07*/ "Proc1 IERR", +/* 5 0xff*/ "Digital Sensor OK", +/* 6 0x14*/ "Chassis Identify", +/* 7 0x13*/ "NMI Button", +/* 8 0x14*/ "Clear CMOS via Panel", +/* 9 0x0f*/ "OS Load POST Code", +/*10 0x20*/ "OS Critical Stop", +/*11 0x09 */ "Power Redundancy Lost", +/*12 0x00*/ "reserved", +/*13 */ "reserved", +/*14 */ "reserved", +/*15 */ "reserved", +/*16 */ "reserved", +/*17 */ "reserved", +/*18 */ "reserved", +/*19 */ "reserved", +/*20 */ "reserved", +/*21 */ "reserved", +/*22 */ "reserved", +/*23 */ "reserved", +/*24 */ "reserved", +/*25 */ "reserved", +/*26 0x05*/ "Chassis Intrusion", +/*27 0x0f*/ "POST Code Error", +/*28 0x02*/ "Voltage Failure", +/*29 0x04*/ "Fan Failure", +/*30 0x01*/ "Temperature Failure"}; + +#define NLAN 39 +char canon_param[NLAN] = { 0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,0,1, + 0,0,0,0,0,0,1,1,1,1}; +struct { + int cmd; + int sz; + char desc[28]; +} lanparams[NLAN] = { /* see IPMI Table 19-4 */ + /* 0 */ { 0, 1, "Set in progress"}, + /* 1 */ { 1, 1, "Auth type support"}, + /* 2 */ { 2, 5, "Auth type enables"}, + /* 3 */ { 3, 4, "IP address"}, + /* 4 */ { 4, 1, "IP addr src"}, /* (DHCP/Static) */ + /* 5 */ { 5, 6, "MAC addr"}, + /* 6 */ { 6, 4, "Subnet mask"}, + /* 7 */ { 7, 3, "IPv4 header"}, + /* 8 */ { 8, 2, "Prim RMCP port"}, + /* 9 */ { 9, 2, "Sec RMCP port"}, + /* 10 */ {10, 1, "BMC grat ARP"}, + /* 11 */ {11, 1, "grat ARP interval"}, + /* 12 */ {12, 4, "Def gateway IP"}, + /* 13 */ {13, 6, "Def gateway MAC"}, + /* 14 */ {14, 4, "Sec gateway IP"}, + /* 15 */ {15, 6, "Sec gateway MAC"}, + /* 16 */ {16,18, "Community string"}, + /* 17 */ {17, 1, "Num dest"}, + /* 18 */ {18, 5, "Dest type"}, + /* 19 */ {19, 13, "Dest address"}, + /* 20 */ {20, 2, "VLAN ID"}, + /* 21 */ {21, 1, "VLAN Priority"}, + /* 22 */ {22, 1, "Cipher Suite Support"}, + /* 23 */ {23,17, "Cipher Suites "}, + /* 24 */ {24, 9, "Cipher Suite Priv"}, + /* 25 */ {25, 4, "VLAN Dest Tag"}, + /* 26 */ {96, 28, "OEM Alert String"}, + /* 27 */ {97, 1, "Alert Retry Algorithm"}, + /* 28 */ {98, 3, "UTC Offset"}, + /* 29 */ {102, 1, "IPv6 Enable"}, + /* 30 */ {103, 1, "IPv6 Addr Source"}, + /* 31 */ {104,16, "IPv6 Address"}, + /* 32 */ {105, 1, "IPv6 Prefix Len"}, + /* 33 */ {106,16, "IPv6 Default Gateway"}, + /* 34 */ {108,17, "IPv6 Dest address"}, + /* 35 */ {192, 4, "DHCP Server IP"}, + /* 36 */ {193, 6, "DHCP MAC Address"}, + /* 37 */ {194, 1, "DHCP Enable"}, + /* 38 */ {201, 2, "Channel Access Mode(Lan)"} +}; + +#define NSER 22 /* max=32 */ +struct { + int cmd; + int sz; + char desc[28]; +} serparams[NSER] = { /* see IPMI Table 20-4 */ + /* 0 */ { 0, 1, "Set in progress"}, + /* 1 */ { 1, 1, "Auth type support"}, + /* 2 */ { 2, 5, "Auth type enables"}, + /* 3 */ { 3, 1, "Connection Mode"}, + /* 4 */ { 4, 1, "Sess Inactiv Timeout"}, + /* 5 */ { 5, 5, "Channel Callback"}, + /* 6 */ { 6, 1, "Session Termination"}, + /* 7 */ { 7, 2, "IPMI Msg Comm"}, + /* 8 */ { 8, 2, "Mux Switch"}, + /* 9 */ { 9, 2, "Modem Ring Time"}, + /* 10 */ {10,17, "Modem Init String"}, + /* 11 */ {11, 5, "Modem Escape Seq"}, + /* 12 */ {12, 8, "Modem Hangup Seq"}, + /* 13 */ {13, 8, "Modem Dial Command"}, + /* 14 */ {14, 1, "Page Blackout Interval"}, + /* 15 */ {15,18, "Community String"}, + /* 16 */ {16, 1, "Num of Alert Dest"}, + /* 17 */ {17, 5, "Destination Info"}, + /* 18 */ {18, 1, "Call Retry Interval"}, + /* 19 */ {19, 3, "Destination Comm Settings"}, + /* 20 */ {29, 2, "Terminal Mode Config"}, + /* 21 */ {201, 2,"Channel Access Mode (Ser)"} +}; + +static void getauthstr(uchar auth, char *s) +{ + if (s == NULL) return; + s[0] = 0; + if (auth & 0x01) strcat(s,"None "); + if (auth & 0x02) strcat(s,"MD2 "); + if (auth & 0x04) strcat(s,"MD5 "); + if (auth & 0x10) strcat(s,"Pswd "); + if (auth & 0x20) strcat(s,"OEM "); + return; +} + +static int GetDeviceID(LAN_RECORD *pLanRecord) +{ /*See also ipmi_getdeviceid( pLanRecord, sizeof(LAN_RECORD),fdebug); */ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar inputData[24]; + uchar completionCode; + + if (pLanRecord == NULL) return(-1); + + status = ipmi_cmd(GET_DEVICE_ID, inputData, 0, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if( completionCode ) { + SELprintf("GetDeviceID: completion code=%x\n", + completionCode); + status = completionCode; + } else { + memcpy(pLanRecord,&responseData[0],responseLength); + set_mfgid(&responseData[0],responseLength); + return(0); // successful, done + } + } /* endif */ + /* if get here, error */ + return(status); +} /*end GetDeviceID() */ + +static int GetChanAcc(uchar chan, uchar parm, LAN_RECORD *pLanRecord) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar inputData[24]; + uchar completionCode; + + if (pLanRecord == NULL) return(-1); + responseLength = 3; + inputData[0] = chan; + inputData[1] = parm; /* 0x80 = active, 0x40 = non-volatile */ + responseLength = sizeof(responseData); + status = ipmi_cmd(GET_CHANNEL_ACC, inputData, 2, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if( completionCode ) { + SELprintf("GetChanAcc: completion code=%x\n", + completionCode); + status = completionCode; + } else { + // dont copy first byte (Parameter revision, usu 0x11) + memcpy(pLanRecord,&responseData[0],responseLength); + return(0); // successful, done + } + } /* endif */ + /* if get here, error */ + return(status); +} /*GetChanAcc()*/ + +static int SetChanAcc(uchar chan, uchar parm, uchar val) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar inputData[24]; + uchar completionCode; + + if (fmBMC) return(0); /* mBMC doesn't support this */ + /* parm: 0x80 = active, 0x40 = set non-vol*/ + responseLength = 1; + inputData[0] = chan; /* channel */ + inputData[1] = (parm & 0xc0) | (val & 0x3F); + inputData[2] = (parm & 0xc0) | lan_access; /* set priv level to Admin */ + + responseLength = sizeof(responseData); + status = ipmi_cmd(SET_CHANNEL_ACC, inputData, 3, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if( completionCode ) { + SELprintf("SetChanAcc: completion code=%x\n", + completionCode); + status = completionCode; + } else { + return(0); // successful, done + } + } /* endif */ + /* if get here, error */ + return(status); +} /*SetChanAcc()*/ + +int SetPasswd(int unum, char *uname, char *upswd, uchar chan, uchar priv) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status, i, psw_len; + uchar completionCode; + uchar inputData[24]; + int ret = 0; + + inputData[0] = (uchar)unum; /*user 1 = null user */ + responseLength = sizeof(responseData); + status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData, + &responseLength, &completionCode, fdebug); + SELprintf("GET_USERNAME: %x %x %x, status = %x, ccode=%x\n", + responseData[0],responseData[1],responseData[2], + status,completionCode); + if (fdebug) { + char aname[17]; + printf("User %d: ",unum); + for (i = 0; i < responseLength; i++) { + printf("%02x ",responseData[i]); + if (responseData[i] < 0x20) aname[i] = '.'; + else aname[i] = responseData[i]; + } + aname[16] = 0; + printf(" %s\n",aname); + } + + if (unum != 1) + { /* user specified a lan username */ + if (fiBMC && (unum == 2)) { + /* cannot set user 2 name */ + if (uname != NULL) { + if (strcmp(uname,"root") != 0) + printf("SETUSERNAME - user2 name %s must be root\n",uname); + } + } else if (unum == 2 && (vend_id == VENDOR_SUPERMICROX || + vend_id == VENDOR_SUPERMICRO) ) { + /* cannot set user 2 name */ + if (uname != NULL) { + if (strcmp(uname,"ADMIN") != 0) + printf("SETUSERNAME - user2 name %s must be ADMIN\n",uname); + } + } else if (uname != NULL) { + inputData[0] = (uchar)unum; + memset(&inputData[1],0,16); + memcpy(&inputData[1],uname,strlen(uname)); + status = ipmi_cmd(SET_USER_NAME, inputData, 17, responseData, + &responseLength, &completionCode, fdebug); + if (completionCode == 0xCC) + status = 0; /*setting username to previous gives 0xCC, ok*/ + else { + SELprintf("SETUSERNAME - %x %x %x status = %x, ccode=%x\n", + inputData[0],inputData[1],inputData[2], + status,completionCode); + if (status == 0) status = completionCode; + if (status != 0) ret = status; + } + } + } + + if ((unum != 1) && (uname == NULL)) { + ; /* if no username, do not enable user */ + } else { + inputData[0] = (uchar)unum; + inputData[1] = 0x01; /*enable user*/ + responseLength = sizeof(responseData); + status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2, responseData, + &responseLength, &completionCode, fdebug); + printf("SETUSERENAB - inputData %x %x %x, status = %x, ccode=%x\n", + inputData[0],inputData[1],inputData[2], + status,completionCode); + if (status == 0) status = completionCode; + if (status != 0) ret = status; + } + + if (upswd != NULL) { + inputData[0] = (uchar)unum; + inputData[1] = 0x02; /*set password*/ + psw_len = PSW_LEN; /*=16 change if 20-byte passwords supported */ + memset(&inputData[2],0,psw_len); + strcpy((char *)&inputData[2],upswd); + if (fdebug) { + char apsw[PSW_MAX+1]; + char c; + printf("Pswd %d: ",unum); + for (i = 0; i < psw_len; i++) { + c = inputData[i+2]; + printf("%02x ",(unsigned char)c); + if (c < 0x20) apsw[i] = '.'; + else apsw[i] = c; + } + apsw[psw_len] = 0; + printf(" %s\n",apsw); + } + responseLength = sizeof(responseData); + status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2+psw_len, + responseData,&responseLength, &completionCode,fdebug); + SELprintf("SETUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n", + inputData[0],inputData[1],inputData[2], + status,completionCode); + if (status == 0) status = completionCode; + if (status != 0) ret = status; + + inputData[0] = (uchar)unum; /*user 1 = null user */ + inputData[1] = 0x03; /*test password*/ + memset(&inputData[2],0,psw_len); + if (upswd != NULL) + strcpy((char *)&inputData[2],upswd); + responseLength = sizeof(responseData); + status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2+psw_len, + responseData,&responseLength, &completionCode,fdebug); + SELprintf("TESTUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n", + inputData[0],inputData[1],inputData[2], + status,completionCode); + } + + if (fiBMC && (unum == 2)) { /*iBMC doesn't support this on user 2*/ + if (fdebug) + printf("skipping SETUSER_ACCESS on iBMC for user %d\n",unum); + } else { + inputData[0] = 0x90 | chan; /* = 0x97 for chan=lan_ch=7 */ + inputData[1] = (uchar)unum; /* user num */ + inputData[2] = priv; /* usu priv=lan_access is admin */ + inputData[3] = 0x00; /* User Session Limit, 0=not limited*/ + responseLength = sizeof(responseData); + status = ipmi_cmd(SET_USER_ACCESS, inputData, 4, responseData, + &responseLength, &completionCode, fdebug); + printf("SETUSER_ACCESS - inputData %x %x %x, status = %x ccode=%x\n", + (uchar)inputData[0],inputData[1],inputData[2], + status,completionCode); + if (status == 0) status = completionCode; + if (status != 0) ret = status; + } + + return(ret); +} /*end SetPswd()*/ + +int SetUser(int unum, char *uname, char *passwd, uchar chan) +{ + int ret = 0; + /* if the user specified a username or password, set it. */ + if ((fpassword) || (uname != NULL)) { + /* set username and password */ + ret = SetPasswd(unum, uname,passwd, chan, lan_access); + } + return(ret); +} /*end SetUser()*/ + +int +DisableUser(int unum, uchar chan) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar completionCode; + uchar inputData[24]; + + inputData[0] = 0x80 | chan; /* = 0x87, no IPMI */ + inputData[1] = (uchar)unum; /* user 1 */ + inputData[2] = 0x0F; /* No access */ + inputData[3] = 0x00; /* User Session Limit, 0=not limited*/ + responseLength = sizeof(responseData); + status = ipmi_cmd(SET_USER_ACCESS, inputData, 4, responseData, + &responseLength, &completionCode, fdebug); + if (status == 0) status = completionCode; + return(status); +} + +static char *parse_priv(uchar c) +{ + char *p; + c = (c & 0x0f); + switch(c) { + case 1: p = "Callback"; break; + case 2: p = "User "; break; + case 3: p = "Operator"; break; + case 4: p = "Admin "; break; + case 5: p = "OEM "; break; + case 0x0f: p = "No access"; break; + default: p = "Reserved"; /*usually =0*/ + } + return(p); +} + +static void show_priv(uchar c) +{ + char *privstr; + privstr = parse_priv(c); + printf("%s",privstr); +} + +static int valid_priv(int c) +{ + int rv; + switch(c) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 0x0f: + rv = 1; + break; + default: + rv = 0; + break; + } + return rv; +} + +/* GetUserINfo - get user configuration info for user subfunction */ +int GetUserInfo(uchar unum, uchar chan, uchar *enab, uchar *priv, char *uname) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status, rv; + uchar completionCode; + uchar inputData[24]; + uchar upriv; + + if (enab == NULL || priv == NULL) return(-2); + inputData[0] = chan; /*lan_ch*/ + inputData[1] = unum; /* user number for IPMI LAN */ + responseLength = sizeof(responseData); + status = ipmi_cmd(GET_USER_ACCESS, inputData, 2, responseData, + &responseLength, &completionCode, fdebug); + rv = status; + if (status == 0 && completionCode != 0) rv = completionCode; + if (rv == 0) { + if (unum == 1) { /*get max_users and enabled_users*/ + max_users = responseData[0] & 0x3f; + enabled_users = responseData[1] & 0x3f; + } + upriv = responseData[3]; + inputData[0] = unum; /* usually = 1 for BMC LAN */ + responseLength = sizeof(responseData); + status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData, + &responseLength, &completionCode, fdebug); + if (status != 0 || completionCode != 0) + responseData[0] = 0; /*empty user name */ + responseData[PSW_MAX-1] = 0; /*for safety*/ + *priv = upriv; + if ((responseData[1] & 0x80) == 0) *enab = 0; + else *enab = 1; + if (uname != NULL) strcpy(uname,responseData); + } + return(rv); +} + +/* GetUser - get and show user configuration */ +int GetUser(uchar user_num, uchar chan) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar completionCode; + uchar inputData[24]; + + inputData[0] = chan; /*lan_ch*/ + inputData[1] = user_num; /* usually = 1 for BMC LAN */ + responseLength = sizeof(responseData); + status = ipmi_cmd(GET_USER_ACCESS, inputData, 2, responseData, + &responseLength, &completionCode, fdebug); + if (status == 0 && completionCode == 0) { + uchar c; + if (user_num == 1) { /*get max_users and enabled_users*/ + max_users = responseData[0] & 0x3f; + enabled_users = responseData[1] & 0x3f; + if (enabled_users > show_users) show_users = enabled_users; + if (show_users > max_users) show_users = max_users; + if (!fcanonical) + SELprintf("Users: showing %d of max %d users (%d enabled)\n", + show_users,max_users,enabled_users); + } + if (fcanonical) + SELprintf("Channel %d User %d Access %s%c ", chan, user_num, + pspace2,bdelim); + else + SELprintf("User Access(chan%d,user%d): %02x %02x %02x %02x : ", + chan, user_num, (uchar)responseData[0], + responseData[1],responseData[2], responseData[3]); + c = responseData[3]; + inputData[0] = user_num; /* usually = 1 for BMC LAN */ + responseLength = sizeof(responseData); + status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData, + &responseLength, &completionCode, fdebug); + if (status != 0 || completionCode != 0) + responseData[0] = 0; + if (c & 0x10) printf("IPMI, "); + show_priv(c); + printf(" (%s)\n",responseData); /*show user name */ + } else + SELprintf("Get User Access(%d,%d), status=%x, ccode=%x\n", + chan, user_num, status, completionCode); + return(status); +} /*end ShowUser()*/ + +static int GetSerEntry(uchar subfunc, LAN_RECORD *pLanRecord) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[24]; + int status; + uchar completionCode; + uchar chan; uchar bset; + + if (pLanRecord == NULL) + { + if (fdebug) + printf("GetSerEntry(%d): error, output buffer is NULL\n",subfunc); + return (-1); + } + + chan = ser_ch; /* 1=EMP, 0=IPMB, 6=LAN2, 7=LAN1 */ + bset = 0; + + inputData[0] = chan; // flags, channel 3:0 (1=EMP) + inputData[1] = subfunc; // Param selector + inputData[2] = bset; // Set selector + inputData[3] = 0; // Block selector + if (subfunc == 10) { + inputData[2] = 0; + inputData[3] = 1; + } + + status = ipmi_cmd(GET_SER_CONFIG, inputData, 4, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if( completionCode ) { + if (fdebug) + SELprintf("GetSerEntry(%d,%d): completion code=%x\n", + chan,subfunc,completionCode); + } else { + // dont copy first byte (Parameter revision, usu 0x11) + memcpy(pLanRecord,&responseData[1],responseLength-1); + pLanRecord->data[responseLength-1] = 0; + //successful, done + return(0); + } + } + + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf("GetSerEntry(%d,%d): ipmi_cmd status=%x ccode=%x\n", + chan,subfunc,status,completionCode); + return -1; +} + +static int GetLanEntry(uchar subfunc, uchar bset, LAN_RECORD *pLanRecord) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[24]; + int status, n; + uchar completionCode; + uchar chan; + + if (pLanRecord == NULL) + { + if (fdebug) + printf("GetLanEntry: error, output buffer is NULL\n"); + return (-1); + } + + chan = lan_ch; /* LAN 1 = 7 */ + + inputData[0] = chan; // flags, channel 3:0 (LAN 1) + inputData[1] = subfunc; // Param selector (3 = ip addr) + inputData[2] = bset; // Set selector + inputData[3] = 0; // Block selector + + status = ipmi_cmd(GET_LAN_CONFIG, inputData, 4, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if( completionCode ) { + if (fdebug) + SELprintf("GetLanEntry: completion code=%x\n", + completionCode); + status = completionCode; + } else { + // dont copy first byte (Parameter revision, usu 0x11) + if (responseLength > 0) { + n = responseLength-1; + memcpy(pLanRecord,&responseData[1],n); + } else n = 0; + pLanRecord->data[n] = 0; + //successful, done + return(0); + } + } + + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf("GetLanEntry: ipmi_cmd status=%d completionCode=%x\n", + status,completionCode); + return status; +} /* end GetLanEntry() */ + +static int SetLanEntry(uchar subfunc, LAN_RECORD *pLanRecord, int reqlen) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[24]; + int status; + uchar completionCode; + + if (pLanRecord == NULL) + { + if (fdebug) + printf("SetLanEntry(%d): error, input buffer is NULL\n",subfunc); + return (-1); + } + if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) { + /* SUPERMICRO cannot set grat arp or grat arp interval */ + if (subfunc == 10 || subfunc == 11) return(0); + } + + inputData[0] = lan_ch; // flags, channel 3:0 (LAN 1) + inputData[1] = subfunc; // Param selector (3 = ip addr) + memcpy(&inputData[2],pLanRecord,reqlen); + + status = ipmi_cmd(SET_LAN_CONFIG, inputData, (uchar)(reqlen+2), + responseData, &responseLength,&completionCode,fdebug); + + if (status == ACCESS_OK) { + if( completionCode ) { + if (fdebug) + SELprintf("SetLanEntry(%d): completion code=%x\n", + subfunc,completionCode); // responseData[0]); + return(completionCode); + } else { + //successful, done + return(0); + } + } + + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf("SetLanEntry(%d): ipmi_cmd status=%d ccode=%x\n", + subfunc,status,completionCode); + return status; +} /* end SetLanEntry() */ + +int GetPefEntry(uchar subfunc, ushort rec_id, PEF_RECORD *pPefRecord) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[24]; /* only use 3 bytes for input */ + int status, n; + uchar completionCode; + + if (pPefRecord == NULL) + { + if (fdebug) + printf("GetPefEntry(%d): error, output buffer is NULL\n",subfunc); + return (-1); + } + + inputData[0] = subfunc; // Parameter = Evt Filter Table + inputData[1] = (uchar)rec_id; + inputData[2] = 0; + + status = ipmi_cmd(GET_PEF_CONFIG, inputData, 3, responseData, + &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if( completionCode ) { + if (fdebug) + SELprintf("GetPefEntry(%d/%d): completion code=%x\n", + subfunc,rec_id,completionCode); + status = completionCode; + } else { + /* expect PEF record to be >=21 bytes */ + if (responseLength > 1) n = responseLength-1; + else n = 0; + if (n > 21) n = 21; /*only use 21 bytes*/ + if ((subfunc == 6) && (n < 21)) { + if (fdebug) + printf("GetPefEntry(%d/%d): length %d too short\n", + subfunc,rec_id,responseLength); + } + // dont copy first byte (Parameter revision, usu 0x11) + if (n == 0) memset(pPefRecord,0,21); + else memcpy(pPefRecord,&responseData[1],n); + //successful, done + return(0); + } + } + + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf("GetPefEntry: ipmi_cmd status=%x completionCode=%x\n", + status, completionCode); + return status; +} /* end GetPefEntry() */ + +int SetPefEntry(PEF_RECORD *pPefRecord) +{ + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + uchar inputData[32]; /* sizeof(PEF_RECORD) = 21 +1=22 */ + int status; + uchar completionCode; + uchar subfunc; + + subfunc = 0x06; // Parameter = Evt Filter Table + + if (pPefRecord == NULL) { + if (fdebug) + printf("SetPefEntry: error, output buffer is NULL\n"); + return (-1); + } + + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 + // 06 0c 80 01 01 00 ff ff 20 ff 6f ff 00 00 00 00 00 00 00 00 00 00 + // memset(&inputData[0],0,requestData.dataLength); + inputData[0] = subfunc; + memcpy(&inputData[1],pPefRecord,sizeof(PEF_RECORD)); + + status = ipmi_cmd(SET_PEF_CONFIG, inputData, sizeof(PEF_RECORD)+1, + responseData, &responseLength, &completionCode, fdebug); + + if (status == ACCESS_OK) { + if( completionCode ) { + if (fdebug) + SELprintf("SetPefEntry: completion code=%x\n", + completionCode); // responseData[0]); + status = completionCode; + } else { + //successful, done + return(0); + } + + } + + // we are here because completionCode is not COMPLETION_CODE_OK + if (fdebug) + SELprintf("SetPefEntry: ipmi_cmd status=%d completion code=%x\n", + status,completionCode); + return(status); + +} /* end SetPefEntry() */ + +int DisablePef(int anum) +{ + uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ + uchar rData[MAX_BUFFER_SIZE]; + int rLength = MAX_BUFFER_SIZE; + uchar cc; + int status; + + if (fmBMC) { + SELprintf("mini-BMC does not support disabling BMC LAN\n"); + return(-1); + } else { + status = SetChanAcc(lan_ch, 0x80, CHAN_ACC_DISABLE); + if (fdebug) SELprintf("SetChanAcc(lan/active), ret = %d\n",status); + status = SetChanAcc(lan_ch, 0x40, CHAN_ACC_DISABLE); + SELprintf("SetChanAcc(lan), ret = %d\n",status); + if (status != 0) return(status); + } + + iData[0] = 0x01; /* PEF Control Param */ + iData[1] = 0x00; /* PEF disable */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (status != 0) return(status); + if( cc ) { + SELprintf("DisablePef[%d]: completion code=%x\n",iData[0],cc); + return(-1); + } + + if (anum != 0) { + iData[0] = 0x09; /* PEF Alert Policy Table */ + iData[1] = (uchar)anum; /* Policy number (default 0x01) */ + iData[2] = 0x10; /* PEF LAN, policy disable */ + iData[3] = 0x00; /* LAN_CH=00, default dest=00 */ + iData[4] = 0x00; /* No alert string */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(SET_PEF_CONFIG, iData, 5, rData, &rLength, + &cc, fdebug); + if (status != 0) return(status); + if( cc ) { + SELprintf("DisablePef[%d]: completion code=%x\n",iData[0],cc); + return(-1); + } + } + return(status); +} + +int ShowPef(void) +{ + uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ + uchar rData[MAX_BUFFER_SIZE]; + int rLength = MAX_BUFFER_SIZE; + uchar cc; + int status, i,j; + + for (j = 1; j < MAX_PEFPARAMS; j++) { + if (j == 4 && fmBMC) { + /* fmBMC gets cc=0x80 for param 4, so skip it. */ + continue; + } + iData[0] = (uchar)j; /* PEF Control Param */ + if (j == 6 || j == 7 || j == 9) iData[1] = 1; + else iData[1] = 0x00; /* PEF Set Selector */ + if (j == 13) iData[2] = 1; + else iData[2] = 0x00; /* PEF Block Selector */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength, + &cc, fdebug); + if (status == 0 && cc == 0) { + SELprintf("PefParam[%d]: ",iData[0]); + if (rLength > 0) + for (i=0;i<peflen[j];i++) SELprintf("%02x ", rData[1+i]); + SELprintf("\n"); + } else + SELprintf("PefParam[%d]: GET_PEF status=%d cc=%x\n", + iData[0],status,cc); + } + return(status); +} + +int EnablePef(int anum) +{ + uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */ + uchar rData[MAX_BUFFER_SIZE]; + int rLength = MAX_BUFFER_SIZE; + uchar cc; + int status; + uchar sdelay; + + status = SetChanAcc(lan_ch, 0x80, chan_pefon); + if (fdebug) SELprintf("SetChanAcc(lan/active), ret = %d\n",status); + status = SetChanAcc(lan_ch, 0x40, chan_pefon); + SELprintf("SetChanAcc(lan), ret = %d\n",status); + if (status != 0) return(status); + + { + iData[0] = 0x01; /* PEF Control Param */ + iData[1] = 0x00; /* PEF Set Selector */ + iData[2] = 0x00; /* PEF Block Selector */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength, + &cc, fdebug); + if (status != 0 || cc != 0) sdelay = 0; + else sdelay = rData[1]; + if (fdebug) SELprintf("EnablePef[%d]: get cc=%x, control=%02x\n", + iData[0],cc,sdelay); + iData[0] = 0x01; /* PEF Control Param (0x01 or 0x05) */ + iData[1] = 0x01; /* PEF enable, & no startup delay */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (status != 0) return(status); + if( cc ) { + SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); + return(-1); + } + +#ifdef TEST + iData[0] = 0x01; /* Serial Channel */ + iData[1] = 0x13; /* Dest Com settings = 19. */ + iData[2] = 0x01; /* POL Default Dest */ + iData[3] = 0x60; + iData[4] = 0x07; + status = ipmi_cmd(SET_SER_CONFIG, iData, 5, rData, &rLength, + &cc, fdebug); +#endif + + iData[0] = 0x02; /* PEF Action Param */ + iData[1] = 0x00; /* PEF Set Selector */ + iData[2] = 0x00; /* PEF Block Selector */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength, + &cc, fdebug); + if (fdebug) SELprintf("EnablePef[%d]: get cc=%x, val=%02x\n", + iData[0],cc,rData[1]); + iData[0] = 0x02; /* PEF Action Param */ + if (vend_id == VENDOR_INTEL) + iData[1] = 0x2f; /* enable alerts, reset, power cycle/down, diag*/ + else + iData[1] = 0x0f; /* enable alerts, reset, power cycle/down */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (status != 0) return(status); + if( cc ) { + SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); + return(-1); + } + + if ((sdelay & 0x04) != 0) { /* startup delay is supported */ + iData[0] = 0x03; /* PEF Startup Delay Param */ + iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n", + iData[0],iData[1],cc); + if (status != 0) return(status); + if( cc ) { + SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); + // return(-1); + } + iData[0] = 0x04; /* PEF Alert Startup Delay Param */ + iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength, + &cc, fdebug); + if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n", + iData[0],iData[1],cc); + if (status != 0) return(status); + if( cc ) { + SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); + // return(-1); + } + } /*endif sdelay*/ + + iData[0] = 0x09; /* PEF Alert Policy Table */ + iData[1] = (uchar)anum; /* Policy number (default 0x01) */ + iData[2] = 0x18; /* PEF LAN, always alert, policy enable */ + iData[3] = (lan_ch << 4) + anum; /* LAN_CH=70, default dest=01 */ + iData[4] = 0x00; /* No alert string */ + rLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(SET_PEF_CONFIG, iData, 5, rData, &rLength, + &cc, fdebug); + if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n", + iData[0],iData[1],cc); + if (status != 0) return(status); + if( cc ) { + SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc); + return(-1); + } + } /*endif IPMI 1.5 */ + + return(status); +} /* end EnablePef */ + +#define NBAUDS 10 +static struct { + unsigned char val; + char str[8]; + } mapbaud[NBAUDS] = { + { 6, "9600" }, + { 6, "9.6K" }, + { 7, "19.2K" }, + { 7, "19200" }, + { 8, "38.4K" }, + { 8, "38400" }, + { 9, "57.6K" }, + { 9, "57600" }, + { 10, "115.2K" }, + { 10, "115200" } + }; + +static unsigned char Str2Baud(char * str) +{ + unsigned char baud = 0; + int i, n, len; + len = strlen_(str); + for (i = 0; i < len; i++) /*toupper*/ + if (str[i] >= 'a' && str[i] <= 'z') str[i] &= 0x5F; + for (i = 0; i < NBAUDS; i++) { + n = strlen_(mapbaud[i].str); + if (strncmp(str,mapbaud[i].str,n) == 0) { + baud = mapbaud[i].val; + break; + } + } + if (i == NBAUDS || baud == 0) { + printf("Invalid -B parameter value (%s), using 19.2K.\n",str); + i = 1; /* default is 19.2K */ + baud = mapbaud[i].val; /* =7 */ + } + if (fdebug) printf("new baud = %02x (%s)\n",baud,mapbaud[i].str); + return(baud); +} + +static char *Baud2Str(unsigned char bin) +{ + char *baudstr; + unsigned char b; + b = bin & 0x0f; + switch(b) { + case 6: baudstr = "9600 "; break; + case 7: baudstr = "19.2k"; break; + case 8: baudstr = "38.4k"; break; + case 9: baudstr = "57.6k"; break; + case 10: baudstr = "115.2k"; break; + default: baudstr = "nobaud"; + } + return(baudstr); +} + +static int BaudValid(unsigned char b) +{ + int val = 0; + switch(b) { + case 6: val = 1; break; + case 7: val = 1; break; + case 8: val = 1; break; + case 9: val = 1; break; + case 10: val = 1; break; + default: val = 0; break; + } + return(val); +} + +/* + * atomac - converts ASCII string to binary MAC address (array). + * Accepts input formatted as 11:22:33:44:55:66 or 11-22-33-44-55-66. + */ +void atomac(uchar *array, char *instr) +{ + int i,j,n; + char *pi; + j = 0; + pi = instr; + n = strlen_(instr); + for (i = 0; i <= n; i++) { + if (instr[i] == ':') { + array[j++] = htoi(pi); + pi = &instr[i+1]; + } else if (instr[i] == '-') { + array[j++] = htoi(pi); + pi = &instr[i+1]; + } else if (instr[i] == 0) { + array[j++] = htoi(pi); + } + if (j >= MAC_LEN) break; /*safety valve*/ + } + if (fdebug) + printf("atomac: %02x %02x %02x %02x %02x %02x\n", + array[0],array[1],array[2],array[3], array[4],array[5]); +} /*end atomac()*/ + +/* extern void atoip(uchar *array,char *instr); *from subs.c*/ +void MacSetInvalid(uchar *mac) +{ + int i; + if (mac == NULL) return; + for (i = 0; i < MAC_LEN; i++) { + if (i == 0) mac[i] = 0xFF; + else mac[i] = 0x00; + } +} + +int MacIsValid(uchar *mac) +{ + int fvalid = 0; + int i; + /* check for initial invalid value of FF:00:... */ + if (mac[0] == 0xff && mac[1] == 0x00) /* marked as invalid */ + return(fvalid); + /* check for all zeros */ + for (i = 0; i < MAC_LEN; i++) + if (mac[i] != 0) { /* not all zeros */ + fvalid = 1; + break; + } + return(fvalid); +} + +int IpIsValid(uchar *ipadr) +{ + int fvalid = 1; + if (ipadr[0] == 0) fvalid = 0; + return(fvalid); +} + +int SubnetIsValid(uchar *subnet) +{ + int fvalid = 0; + /* if masking off at least one bit, say valid */ + if (subnet[0] != 0) fvalid = 1; + return(fvalid); +} + +int SubnetIsSame(uchar *ip1, uchar *ip2, uchar *subnet) +{ + int i; + uchar c1, c2; + for (i = 0; i < 4; i ++) { + c1 = ip1[i] & subnet[i]; + c2 = ip2[i] & subnet[i]; + if (c1 != c2) return 0; + } + return 1; /*same, return true*/ +} + +#ifdef WIN32 +/* + * Obtain network adapter information (Windows). + */ +PIP_ADAPTER_ADDRESSES GetAdapters() { + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + ULONG OutBufferLength = 0; + ULONG RetVal = 0, i; + + // The size of the buffer can be different + // between consecutive API calls. + // In most cases, i < 2 is sufficient; + // One call to get the size and one call to get the actual parameters. + // But if one more interface is added or addresses are added, + // the call again fails with BUFFER_OVERFLOW. + // So the number is picked slightly greater than 2. + // We use i <5 in the example + for (i = 0; i < 5; i++) { + RetVal = GetAdaptersAddresses( + AF_INET, 0, NULL, + AdapterAddresses, + &OutBufferLength); + + if (RetVal != ERROR_BUFFER_OVERFLOW) { + break; + } + + if (AdapterAddresses != NULL) { + free(AdapterAddresses); + } + + AdapterAddresses = (PIP_ADAPTER_ADDRESSES) malloc(OutBufferLength); + if (AdapterAddresses == NULL) { + RetVal = GetLastError(); + break; + } + } + if (RetVal == NO_ERROR) { + // If successful, return pointer to structure + return AdapterAddresses; + } + else { + LPVOID MsgBuf; + + printf("Call to GetAdaptersAddresses failed.\n"); + if (FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + RetVal, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &MsgBuf, + 0, + NULL )) { + printf("\tError: %s", MsgBuf); + } + LocalFree(MsgBuf); + } + return NULL; +} + +/* + * Set BMC MAC corresponding to current BMC IP address (Windows). + */ +int GetLocalMACByIP() { + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + PIP_ADAPTER_ADDRESSES AdapterList; + int result = 0; + + struct sockaddr_in *si; + + AdapterAddresses = GetAdapters(); + AdapterList = AdapterAddresses; + + while (AdapterList) { + PIP_ADAPTER_UNICAST_ADDRESS addr; + addr = AdapterList->FirstUnicastAddress; + if (addr == NULL) si = NULL; + else si = (struct sockaddr_in*)addr->Address.lpSockaddr; + if (si != NULL) { + if(memcmp(&si->sin_addr.s_addr, rgmyip, 4) == 0) { + if (!MacIsValid(rgmymac)) + memcpy(rgmymac, AdapterList->PhysicalAddress, MAC_LEN); + memcpy(osmyip, &si->sin_addr.s_addr, 4); + memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN); + wcstombs(ifname,AdapterList->FriendlyName, sizeof(ifname)); + result = 1; + break; + } + } + AdapterList = AdapterList->Next; + } + + if (AdapterAddresses != NULL) { + free(AdapterAddresses); + } + return result; +} + +/* + * Get First IP Address in Windows OS + * ipaddr is 4 bytes, macaddr is 6 bytes, ipname can be 64 bytes. + * (called by idiscover.c) + */ +int GetFirstIP(uchar *ipaddr, uchar *macadr, char *ipname, char fdbg) +{ + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + PIP_ADAPTER_ADDRESSES AdapterList; + struct sockaddr_in *si; + uchar *psaddr; + int result = -1; + + AdapterAddresses = GetAdapters(); + AdapterList = AdapterAddresses; + + while (AdapterList) { + PIP_ADAPTER_UNICAST_ADDRESS addr; + + addr = AdapterList->FirstUnicastAddress; + si = (struct sockaddr_in*)addr->Address.lpSockaddr; + psaddr = (uchar *)&si->sin_addr.s_addr; + if ((psaddr[0] != 0) && (psaddr[0] != 169)) { + if (fdbg) printf("found IP: s_addr=%d.%d.%d.%d\n", + psaddr[0], psaddr[1], psaddr[2], psaddr[3]); + if (ipaddr != NULL) + memcpy(ipaddr, &si->sin_addr.s_addr, 4); + if (macadr != NULL) { + memcpy(macadr, AdapterList->PhysicalAddress, MAC_LEN); + if (fdbg) printf("found MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", + macadr[0], macadr[1], macadr[2], macadr[3], + macadr[4], macadr[5]); + } + if (ipname != NULL) { + wcstombs(ipname,AdapterList->FriendlyName, sizeof(ifname)); + if (fdbg) printf("found Adapter: %d\n",ipname); + } + result = 0; + break; + } + AdapterList = AdapterList->Next; + } + + if (AdapterAddresses != NULL) { + free(AdapterAddresses); + } + return result; +} + +/* + * Set BMC MAC corresponding to current BMC IP address (Windows). + */ +int GetLocalIPByMAC(uchar *macadr) { + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + PIP_ADAPTER_ADDRESSES AdapterList; + int result = 0; + + struct sockaddr_in *si; + + AdapterAddresses = GetAdapters(); + AdapterList = AdapterAddresses; + + while (AdapterList) { + PIP_ADAPTER_UNICAST_ADDRESS addr; + if(memcmp(AdapterList->PhysicalAddress, macadr, MAC_LEN) == 0) { + addr = AdapterList->FirstUnicastAddress; + + si = (struct sockaddr_in*)addr->Address.lpSockaddr; + if (fdebug) { + uchar *psaddr; + psaddr = (uchar *)&si->sin_addr.s_addr; + printf("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d\n", + rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], + psaddr[0], psaddr[1], psaddr[2], psaddr[3]); + } + if (!IpIsValid(rgmyip) && (fsharedMAC==1)) /*not specified, shared*/ + memcpy(rgmyip, &si->sin_addr.s_addr, 4); + memcpy(osmyip, &si->sin_addr.s_addr, 4); + memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN); + wcstombs(ifname,AdapterList->FriendlyName, sizeof(ifname)); + result = 1; + break; + } + AdapterList = AdapterList->Next; + } + + if (AdapterAddresses != NULL) { + free(AdapterAddresses); + } + return result; +} +/* + * Set MAC and IP address from given interface name (Windows). + */ +int GetLocalDataByIface() { + PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL; + PIP_ADAPTER_ADDRESSES AdapterList; + int result = 0; + + size_t origsize, newsize, convertedChars; + wchar_t* wcstring; + struct sockaddr_in *si; + + AdapterAddresses = GetAdapters(); + AdapterList = AdapterAddresses; + + origsize = strlen(ifname) + 1; + newsize = origsize; + convertedChars = 0; + wcstring = (wchar_t*) malloc(sizeof(wchar_t) * newsize) ; + if (wcstring == NULL) AdapterList = NULL; /*skip loop, do free*/ + else mbstowcs(wcstring, ifname, origsize ); + + while (AdapterList) { + PIP_ADAPTER_UNICAST_ADDRESS addr; + if(wcsstr(AdapterList->FriendlyName, wcstring)) { + printf("Using interface: %S\n", AdapterList->FriendlyName); + printf("\t%S\n", AdapterList->Description); + addr = AdapterList->FirstUnicastAddress; + + si = (struct sockaddr_in*)addr->Address.lpSockaddr; + if (fdebug) { + uchar *psaddr; + psaddr = (uchar *)&si->sin_addr.s_addr; + printf("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d " + "fsharedMAC=%d\n", + rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], + psaddr[0], psaddr[1], psaddr[2], psaddr[3], + fsharedMAC); + } + if (!IpIsValid(rgmyip)) { /*IP not specified*/ + memcpy(rgmyip, &si->sin_addr.s_addr, 4); + memcpy(rgmymac, AdapterList->PhysicalAddress, MAC_LEN); + } + memcpy(osmyip, &si->sin_addr.s_addr, 4); + memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN); + /* FriendlyName == ifname already */ + result = 1; + break; + } + AdapterList = AdapterList->Next; + } + + if (AdapterAddresses != NULL) { + free(AdapterAddresses); + } + return result; +} + +int FindEthNum(uchar *macadrin) +{ + int i; + uchar macadr[MAC_LEN]; + memcpy(macadr,macadrin,MAC_LEN); + if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) { + /* Intel factory assigns them this way, so use that to compare */ + macadr[MAC_LEN-1] -= 2; /*OS MAC = BMC MAC - 2*/ + } + i = GetLocalIPByMAC(macadr); + if (i == 1) fethfound = 1; + if (fdebug) /* show the local OS eth if and MAC */ + printf("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", + ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], + osmymac[0], osmymac[1], osmymac[2], osmymac[3], + osmymac[4], osmymac[5]); + /* The actual Windows ethernet interface is determined + * in Get_IPMac_Addr using ipconfig, so + * init eth interface number as eth0 for Windows. */ + return(0); +} +#elif defined(HPUX) +#define INSAP 22 +#define OUTSAP 24 + +#include <sys/types.h> +#include <fcntl.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <signal.h> +#include <ctype.h> +#include <sys/stropts.h> +#include <sys/poll.h> +#include <sys/dlpi.h> + +#define bcopy(source, destination, length) memcpy(destination, source, length) +#define AREA_SZ 5000 /*=* buffer length in bytes *=*/ +#define GOT_CTRL 1 +#define GOT_DATA 2 +#define GOT_BOTH 3 +#define GOT_INTR 4 +#define GOT_ERR 128 +static u_long ctl_area[AREA_SZ]; +static u_long dat_area[AREA_SZ]; +static struct strbuf ctl = {AREA_SZ, 0, (char *)ctl_area}; +static struct strbuf dat = {AREA_SZ, 0, (char *)dat_area}; +static char *dlpi_dev[] = {"/dev/dlpi", ""}; + +/*=* get a message from a stream; return type of message *=*/ +static int get_msg(int fd) +{ + int flags = 0; + int res, ret; + ctl_area[0] = 0; + dat_area[0] = 0; + ret = 0; + res = getmsg(fd, &ctl, &dat, &flags); + if(res < 0) { + if(errno == EINTR) { + return(GOT_INTR); + } else { + return(GOT_ERR); + } + } + if(ctl.len > 0) { + ret |= GOT_CTRL; + } + if(dat.len > 0) { + ret |= GOT_DATA; + } + return(ret); +} + +/*=* verify that dl_primitive in ctl_area = prim *=*/ +static int check_ctrl(int prim) +{ + dl_error_ack_t *err_ack = (dl_error_ack_t *)ctl_area; + if(err_ack->dl_primitive != prim) { + return GOT_ERR; + } + return 0; +} + +/*=* put a control message on a stream *=*/ +static int put_ctrl(int fd, int len, int pri) +{ + ctl.len = len; + if(putmsg(fd, &ctl, 0, pri) < 0) { + return GOT_ERR; + } + return 0; +} + +/*=* put a control + data message on a stream *=*/ +static int put_both(int fd, int clen, int dlen, int pri) +{ + ctl.len = clen; + dat.len = dlen; + if(putmsg(fd, &ctl, &dat, pri) < 0) { + return GOT_ERR; + } + return 0; +} + +/*=* open file descriptor and attach *=*/ +static int dl_open(const char *dev, int ppa, int *fd) +{ + dl_attach_req_t *attach_req = (dl_attach_req_t *)ctl_area; + if((*fd = open(dev, O_RDWR)) == -1) { + return GOT_ERR; + } + attach_req->dl_primitive = DL_ATTACH_REQ; + attach_req->dl_ppa = ppa; + put_ctrl(*fd, sizeof(dl_attach_req_t), 0); + get_msg(*fd); + return check_ctrl(DL_OK_ACK); +} + +/*=* send DL_BIND_REQ *=*/ +static int dl_bind(int fd, int sap, u_char *addr) +{ + dl_bind_req_t *bind_req = (dl_bind_req_t *)ctl_area; + dl_bind_ack_t *bind_ack = (dl_bind_ack_t *)ctl_area; + bind_req->dl_primitive = DL_BIND_REQ; + bind_req->dl_sap = sap; + bind_req->dl_max_conind = 1; + bind_req->dl_service_mode = DL_CLDLS; + bind_req->dl_conn_mgmt = 0; + bind_req->dl_xidtest_flg = 0; + put_ctrl(fd, sizeof(dl_bind_req_t), 0); + get_msg(fd); + if (GOT_ERR == check_ctrl(DL_BIND_ACK)) { + return GOT_ERR; + } + bcopy((u_char *)bind_ack + bind_ack->dl_addr_offset, addr, + bind_ack->dl_addr_length); + return 0; +} + +int FindEthNum(uchar *addr) +{ /* Need to use DLPI for HPUX */ + /*See http://cplus.kompf.de/artikel/macaddr.html */ + int fd; + int ppa; + u_char mac_addr[25]; + char **dev; + int i = 0; + + for (dev = dlpi_dev; **dev != ''; ++dev) { + for (ppa=0; ppa<10; ++ppa) { + if (GOT_ERR != dl_open(*dev, ppa, &fd)) { + if (GOT_ERR != dl_bind(fd, INSAP, mac_addr)) { + // bcopy( mac_addr, addr, 6); + i = ppa; + if (memcmp(mac_addr,addr,MAC_LEN) == 0) { + memcpy(osmymac, addr, MAC_LEN); + return(ppa); + } + } + } + close(fd); + } + } + return(i); +} +#else + +static char *get_ifreq_mac(struct ifreq *ifrq) +{ + char *ptr; +#ifdef SOLARIS + ptr = (char *)&ifrq->ifr_ifru.ifru_enaddr[0]; +#elif BSD + ptr = (char *)&ifrq->ifr_ifru.ifru_addr.sa_data[0]; +#elif MACOS + static uchar mactmp[MAC_LEN]; + ptr = &mactmp[0]; + MacSetInvalid(ptr); +#else + ptr = (char *)&ifrq->ifr_hwaddr.sa_data[0]; +#endif + return (ptr); +} + +extern int find_ifname(char *ifname); /*see idiscover.c*/ + +int FindEthNum(uchar *macadrin) +{ /*only used for Linux*/ + struct ifreq ifr; + int skfd; + int nCurDevice; + int devnum = -1; + int devos = 0; + uchar macadr[MAC_LEN]; + uchar macsav[MAC_LEN]; + uchar mactmp[MAC_LEN]; + uchar ipsav[4]; + char szDeviceName[ 16 ]; /* MAX_DEVICE_NAME_LENGTH + 1 */ + uchar fipvalid = 0; + int n; + + memcpy(macadr,macadrin,MAC_LEN); + if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) { + /* Intel factory assigns them this way, so use that to compare */ + macadr[MAC_LEN-1] -= 2; /*OS MAC = BMC MAC - 2*/ + } +#ifdef DBG + if (fdebug) { + uchar *pb; + pb = macadrin; + printf("input mac:%02x:%02x:%02x:%02x:%02x:%02x " + "tmp mac:%02x:%02x:%02x:%02x:%02x:%02x\n", + pb[0],pb[1],pb[2],pb[3],pb[4],pb[5], + macadr[0],macadr[1],macadr[2],macadr[3],macadr[4],macadr[5]); + } +#endif + + n = find_ifname(szDeviceName); + if (n >= 0) { + n = strlen_(szDeviceName); + if (n < sizeof(ifpattn)) { + strcpy(ifpattn,szDeviceName); + ifpattn[n - 1] = 0; /*truncate last digit*/ + } + if (fdebug) + printf("found ifname %s, pattern %s\n",szDeviceName,ifpattn); + } + + if ( ( skfd = socket(AF_INET, SOCK_DGRAM, 0 ) ) < 0) { + if ( fdebug ) { + perror("socket"); + return devnum; + } + } + + for( nCurDevice = 0 ; + (nCurDevice < NUM_DEVICES_TO_CHECK) && (devnum == -1); + nCurDevice++ ) + { + sprintf( szDeviceName, "%s%d", ifpattn, nCurDevice ); /*eth%d*/ + memset((char *)&ifr,0,sizeof(ifr)); + strcpy(ifr.ifr_name, szDeviceName ); +#ifdef SIOCGIFHWADDR + if (ioctl(skfd, SIOCGIFHWADDR, &ifr) > 0) { + if ( fdebug ) + printf("FindEthNum: Could not get MAC address for %s\n", + szDeviceName); + } else +#endif + { + uchar *pb; + pb = (uchar *)get_ifreq_mac(&ifr); +#ifdef DBG + if (fdebug) { + printf("%s mac: %02x:%02x:%02x:%02x:%02x:%02x\n", + szDeviceName, pb[0],pb[1],pb[2],pb[3],pb[4],pb[5]); + } +#endif + memcpy(macsav, pb, MAC_LEN); + /* check if this device is configured for IP addr */ + memset((char *)&ifr,0,sizeof(ifr)); + strcpy(ifr.ifr_name, szDeviceName); + ifr.ifr_addr.sa_family = AF_INET; + if (ioctl(skfd, SIOCGIFADDR, &ifr) >= 0) { + fipvalid = 1; + memcpy(ipsav, &ifr.ifr_addr.sa_data[2], 4); + } else fipvalid = 0; + if (memcmp(macsav, macadr, MAC_LEN) == 0) { /*found match*/ + devnum = nCurDevice; + memcpy(osmymac, macsav, MAC_LEN); + if (fipvalid) memcpy(osmyip, ipsav, 4); + break; + } + if (nCurDevice == 0) { /*set a default of eth0*/ + devos = nCurDevice; + memcpy(osmymac,macsav, MAC_LEN); + if (fipvalid) memcpy(osmyip, ipsav, 4); + } else if (fipvalid) { /*check if NIC1 is eth1,2,3,...*/ + memcpy(mactmp,osmymac,MAC_LEN); + mactmp[MAC_LEN-1] -= 1; + if (memcmp(mactmp,macsav,MAC_LEN) == 0) { + devos = nCurDevice; + memcpy(osmymac, macsav, MAC_LEN); + memcpy(osmyip, ipsav, 4); + } + } + } /*end else*/ + } + if (!fsetifn) { + if (devnum == -1) { /*not found, use devos default*/ + devnum = devos; + sprintf( ifname, "%s%d", ifpattn, devnum ); /*eth%d*/ + } else { /* match was found, devnum set */ + fethfound = 1; + strcpy(ifname, szDeviceName ); + } + } + close(skfd); + if (fdebug) /* show the local OS eth if and MAC */ + printf("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", + ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], + osmymac[0], osmymac[1], osmymac[2], osmymac[3], + osmymac[4], osmymac[5]); + return(devnum); +} +#endif + +int show_channels(void) +{ + int ret, rlen; + uchar iData[2]; + uchar rData[10]; + uchar cc, mtype; + int j; + int rv = -1; + + for (j = 1; j < MAXCHAN; j++) { + rlen = sizeof(rData); + iData[0] = (uchar)j; /*channel #*/ + memset(rData,0,9); /*initialize recv data*/ + ret = ipmi_cmd(GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug); + if (rv != 0) rv = ret; + if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */ + continue; + if (ret != 0) { + if (fdebug) printf("get_chan_info rc = %x\n",ret); + break; + } + mtype = rData[1]; /* channel medium type */ + switch(mtype) { + case 4: printf("channel[%d] type = lan\n",j); break; /*802.3 LAN type*/ + case 5: printf("channel[%d] type = serial\n",j); break; + case 7: printf("channel[%d] type = pci_smbus\n",j); break; + case 12: printf("channel[%d] type = system_interface\n",j); break; + default: printf("channel[%d] type = other %d\n",j,mtype); break; + } + rv = 0; + } /*end for j*/ + return(rv); +} + +/* + * GetBmcEthDevice + * Attempt to auto-detect the BMC LAN channel and matching OS eth port. + * INPUT: lan_parm = lan channel from user -L option, 0xFF if not specified + * OUTPUT: lan_ch is set to BMC LAN channel number + * if success, returns index of OS eth port (0, 1, ...). + * if no lan channels found, returns -2. + * if other error, returns -1. + */ +int GetBmcEthDevice(uchar lan_parm, uchar *pchan) +{ + LAN_RECORD LanRecord; + int devnum = -1; + int ret; + uchar bmcMacAddress[ MAC_LEN ]; /*MAC_LEN = 6*/ + int rlen; + uchar iData[2]; + uchar rData[10]; + uchar cc; + int i = 0; + int j, jstart, jend, jlan; + uchar mtype; + uchar *pb; + int fchgmac; + // int found = 0; + + /* Find the LAN channel(s) via Channel Info */ + if (lan_parm < MAXCHAN) { /* try user-specified channel only */ + lan_ch = lan_parm; + jstart = lan_parm; + jend = lan_parm+1; + } else { + jstart = 1; + jend = MAXCHAN; + } + memset(bmcMacAddress,0xff,sizeof(bmcMacAddress)); /*initialize to invalid*/ + for (j = jstart; j < jend; j++) { + rlen = sizeof(rData); + iData[0] = (uchar)j; /*channel #*/ + memset(rData,0,9); /*initialize recv data*/ + ret = ipmi_cmd(GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug); + if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */ + continue; + if (ret != 0) { + if (fdebug) printf("get_chan_info rc = %x\n",ret); + break; + } + mtype = rData[1]; /* channel medium type */ + if (mtype == 4) { /* 802.3 LAN type*/ + if (fdebug) printf("chan[%d] = lan\n",j); + jlan = lan_ch; /*save prev lan chan */ + /* Get BMC MAC for this LAN channel. */ + /* Note: BMC MAC may not be valid yet. */ + lan_ch = (uchar)j; /*set lan channel for GetLanEntry*/ + ret = GetLanEntry( 5 /*MAC_ADDRESS_LAN_PARAM*/,0, &LanRecord); + if ( ret != 0 ) { + lan_ch = (uchar)jlan; /*restore lan_ch*/ + printf( "GetBmcEthDevice: GetLanEntry failed\n" ); + return devnum; + } else { + pb = &LanRecord.data[0]; + if (fdebug) printf("chan[%d] BMC MAC %x:%x:%x:%x:%x:%x\n",j, + pb[0], pb[1], pb[2], pb[3], pb[4], pb[5] ); + fchgmac = 0; + /* use the lowest valid lan channel MAC address */ + if (!MacIsValid(bmcMacAddress)) /* old MAC not valid*/ + fchgmac = 1; + else if (MacIsValid(pb) && /* new MAC is valid and*/ + (memcmp(bmcMacAddress,pb, sizeof(bmcMacAddress)) > 0)) + fchgmac = 1; /* new MAC lower */ + /* if no -L 3 and this is gcm, do not pick it. */ + if ((j == gcm_ch) && (lan_parm == PARM_INIT)) + fchgmac = 0; + if (fchgmac) { /* pick this channel & MAC */ + memcpy(bmcMacAddress,pb,sizeof(bmcMacAddress)); + lan_ch = (uchar)j; + } else lan_ch = (uchar)jlan; /*restore prev lan chan*/ + } + i++; /* i = num lan channels found */ + } else if (mtype == 5) { /* serial type*/ + if (fdebug) printf("chan[%d] = serial\n",j); + ser_ch = (uchar)j; /* set to last serial channel */ + } else if (mtype == 7) { /* PCI SMBus */ + if (fdebug) printf("chan[%d] = pci_smbus\n",j); + } else if (mtype == 12) { /* system interface */ + if (fdebug) printf("chan[%d] = system_interface\n",j); + } else if (mtype == 1) { /* IPMB */ + if (fdebug) printf("chan[%d] = IPMB\n",j); + } else /* other channel medium types, see IPMI 1.5 Table 6-3 */ + if (fdebug) printf("chan[%d] = %d\n",j,mtype); + } + if (i == 0) return(-2); /* no lan channels found */ + if (fdebug) printf("lan_ch detected = %d\n",lan_ch); + + /* This will work if the BMC MAC is shared with the OS */ + /* Otherwise, wait until we get the eth dev from the gateway below */ + devnum = FindEthNum(bmcMacAddress); + if ( fdebug ) + printf("GetBmcEthDevice: channel %d, %s%d\n",lan_ch,ifpattn,devnum); + if (pchan != NULL) *pchan = lan_ch; + return devnum; +} + +/* file_grep/findmatch - No longer used here, see ievents.c */ + +/* + * Get_Mac + * This routine finds a MAC address from a given IP address. + * Usually for the Alert destination. + * It uses ARP cache to do this. + */ +#if defined(WIN32) +int Get_Mac(uchar *ipadr,uchar *macadr, char *nodname) +{ + DWORD dwRetVal; + IPAddr DestIp = 0; + IPAddr SrcIp = 0; /* default for src ip */ + ULONG MacAddr[2]; /* for 6-byte hardware addresses */ + ULONG PhysAddrLen = MAC_LEN; /* default to length of six bytes */ + BYTE *bPhysAddr; + + if (!IpIsValid(ipadr)) { + if (fdebug) printf("Get_Mac: invalid IP addr\n"); + return 1; /*error*/ + } + memcpy(&DestIp, ipadr, 4); + + /* invoke system ARP query */ + dwRetVal = SendARP(DestIp, SrcIp, MacAddr, &PhysAddrLen); + + if (dwRetVal == NO_ERROR) + { /* no error - get the MAC */ + bPhysAddr = (BYTE *) & MacAddr; + if (PhysAddrLen) { + memcpy(macadr, bPhysAddr, MAC_LEN); + } else + printf("Warning: SendArp completed successfully, but returned length=0\n"); + } else if (dwRetVal == ERROR_GEN_FAILURE) + { /* MAC not available in this network - get gateway MAC */ + memcpy(macadr, rggwymac, MAC_LEN); + } else + { /* other errors */ + printf("Error: SendArp failed with error: %d", dwRetVal); + switch (dwRetVal) { + case ERROR_INVALID_PARAMETER: + printf(" (ERROR_INVALID_PARAMETER)\n"); + break; + case ERROR_INVALID_USER_BUFFER: + printf(" (ERROR_INVALID_USER_BUFFER)\n"); + break; + case ERROR_BAD_NET_NAME: + printf(" (ERROR_GEN_FAILURE)\n"); + break; + case ERROR_BUFFER_OVERFLOW: + printf(" (ERROR_BUFFER_OVERFLOW)\n"); + break; + case ERROR_NOT_FOUND: + printf(" (ERROR_NOT_FOUND)\n"); + break; + default: + printf("\n"); + break; + } + return 1; + } + return 0; +} /* end Get_Mac() for WIN32*/ +#elif defined(SOLARIS) +int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename) +{ + FILE *fparp; + char buff[1024]; + /* char arpfile[] = "/proc/net/arp"; */ + char alertfile[] = "/tmp/dest.arping"; + char arping_cmd[128]; + char *pb, *pm; + int num, i; + int foundit = 0; + int ret = 0; + + if (IpIsValid(ipadr)) { /* if valid IP address */ + sprintf(arping_cmd, + "ping %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n", + ipadr[0],ipadr[1],ipadr[2],ipadr[3], + ipadr[0],ipadr[1],ipadr[2],ipadr[3], alertfile); + } else if (nodename != NULL) { /*if valid nodename */ + sprintf(arping_cmd, + "ping %s >/dev/null; arp -a |grep %s >%s\n", + nodename,nodename,alertfile); + } else ret = -1; + + if (ret == 0) { /* if valid IP address */ + /* make sure the destination is in the arp cache */ + if (fdebug) printf("%s", arping_cmd); + system(arping_cmd); + + fparp = fopen(alertfile,"r"); + if (fparp == NULL) { + fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n", + alertfile,get_errno()); + ret = -1; + } else { + /* sample output: */ + /* e1000g0 cooper9 255.255.255.255 o 00:07:e9:06:55:c8 */ + while (fgets(buff, 1023, fparp)) { + /* should only run through loop once */ + num = strcspn(buff," \t"); /* skip 1st word ("e1000g0") */ + i = strspn(&buff[num]," \t"); /* skip whitespace */ + pb = &buff[num+i]; + num = strcspn(pb," \t"); /* skip 2nd word (nodename/IP) */ + i = strspn(&pb[num]," \t"); /* skip whitespace */ + pb += (num+i); + pm = &pb[25]; /* Now pb[25] has the MAC address */ + { /*validate new address?*/ + if (fdebug) printf("Get_Mac: mac=%s\n",pm); + foundit = 1; + if (!MacIsValid(macadr)) atomac(macadr,pm); + break; + } + } /*end while*/ + fclose(fparp); + } /*end else file opened*/ + } /*endif valid IP */ + + if (foundit == 0) { /* no errors, but no mac reply */ + if (MacIsValid(rggwymac) && !MacIsValid(macadr)) + /* this is useful if the ipadr is not in the local subnet */ + memcpy(macadr,rggwymac,6); /* get to it from the default gateway */ + } + return(ret); +} /*end Get_Mac for Solaris*/ +#elif defined(BSD) +int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename) +{ + FILE *fparp; + char buff[1024]; + /* char arpfile[] = "/proc/net/arp"; */ + char alertfile[] = "/tmp/dest.arping"; + char arping_cmd[128]; + char *pb, *pm; + int num, i, j; + int foundit = 0; + int ret = 0; + + if (IpIsValid(ipadr)) { /* if valid IP address */ + sprintf(arping_cmd, + "ping -c2 %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n", + ipadr[0],ipadr[1],ipadr[2],ipadr[3], + ipadr[0],ipadr[1],ipadr[2],ipadr[3], alertfile); + } else if (nodename != NULL) { /*if valid nodename */ + sprintf(arping_cmd, + "ping -c2 %s >/dev/null; arp -a |grep %s >%s\n", + nodename,nodename,alertfile); + } else ret = -1; + + if (ret == 0) { /* if valid IP address */ + /* make sure the destination is in the arp cache */ + if (fdebug) printf("%s", arping_cmd); + system(arping_cmd); + + fparp = fopen(alertfile,"r"); + if (fparp == NULL) { + fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n", + alertfile,get_errno()); + ret = -1; + } else { + /* sample output of arp -a -n: */ + /* ? (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */ + /* sample output of arp -a: */ + /* telcoserv (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */ + while (fgets(buff, 1023, fparp)) { + /* should only run through loop once */ + pb = &buff[0]; + for (j = 0; j < 3; j++) { /* skip 3 words */ + num = strcspn(pb," \t"); /* skip jth word */ + i = strspn(&pb[num]," \t"); /* skip whitespace */ + pb += (num+i); + } + pm = &pb[0]; /* Now pb[0] has the MAC address */ + { /* no need to validate new address*/ + if (fdebug) printf("Get_Mac: mac=%s\n",pm); + foundit = 1; + if (!MacIsValid(macadr)) atomac(macadr,pm); + break; + } + } /*end while*/ + fclose(fparp); + } /*end else file opened*/ + } /*endif valid IP */ + + if (foundit == 0) { /* no errors, but no mac reply */ + if (MacIsValid(rggwymac) && !MacIsValid(macadr)) + /* this is useful if the ipadr is not in the local subnet */ + memcpy(macadr,rggwymac,6); /* get to it from the default gateway */ + } + return(ret); +} /*end Get_Mac for BSD */ +#else +int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename) +{ /* Get_Mac for Linux */ + FILE *fparp; + char buff[1024]; + /* char arpfile[] = "/proc/net/arp"; */ + char alertfile[] = "/tmp/dest.arping"; + char arping_cmd[128]; + char *pb, *pm, *px; + int num, i; + int foundit = 0; + int ret = 0; + char *_ifname; + + if (strcmp(ifname,"gcm") == 0) _ifname = ifname0; /*see gcm_ch instead*/ + else _ifname = ifname; + + /* Get a MAC address for a given IP address or nodename */ + if (IpIsValid(ipadr)) { /* if valid IP address */ + sprintf(arping_cmd, + "arping -I %s -c 2 %d.%d.%d.%d |grep reply |tail -n1 >%s\n", + _ifname,ipadr[0],ipadr[1],ipadr[2],ipadr[3],alertfile); + } else if (nodename != NULL) { /*if valid nodename */ + sprintf(arping_cmd, + "arping -I %s -c 2 %s |grep reply |tail -n1 >%s\n", + _ifname,nodename,alertfile); + } else ret = -1; + + if (ret == 0) { /* if valid IP address */ + /* make sure the destination is in the arp cache */ + if (fdebug) printf("%s", arping_cmd); + ret = system(arping_cmd); + + fparp = fopen(alertfile,"r"); + if (fparp == NULL) { + fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n", + alertfile,get_errno()); + ret = -1; + } else { + ret = 0; + while (fgets(buff, 1023, fparp)) { + /* should only run through loop once */ + num = strcspn(buff," \t"); /* skip 1st word ("Unicast") */ + i = strspn(&buff[num]," \t"); + pb = &buff[num+i]; + if (strncmp(pb,"reply",5) == 0) { /* valid output */ + /* Find the ip address */ + pb += 6 + 5; /* skip "reply from " */ + num = strcspn(pb," \t"); + pb[num] = 0; + if (fdebug) printf("Get_Mac: ip=%s\n",pb); + /* IP address should already match input param */ + if (!IpIsValid(ipadr)) /* had nodname only*/ + atoip(ipadr,pb); /* fill in ipadr */ + /* Now find the mac address */ + pm = strchr(&pb[num+1],'['); + if (pm == NULL) pm = &pb[num+2]; /* just in case */ + pm++; + px = strchr(pm,']'); + if (px == NULL) px = pm + 17; /* just in case */ + px[0] = 0; + if (fdebug) printf("Get_Mac: mac=%s\n",pm); + foundit = 1; + if (!MacIsValid(macadr)) atomac(macadr,pm); + break; + } + } /*end while*/ + fclose(fparp); + } /*end else file opened*/ + } /*endif valid IP */ + + if (foundit == 0) { /* no errors, but no mac reply */ + if (MacIsValid(rggwymac) && !MacIsValid(macadr)) + /* this is useful if the ipadr is not in the local subnet */ + memcpy(macadr,rggwymac,6); /* get to it from the default gateway */ + } + return(ret); +} /* end Get_Mac() for Linux*/ +#endif + +#ifdef WIN32 +/* + * Set subnet mask based on current IP address (Windows). + */ +int SetSubnetMask() { + PMIB_IPADDRTABLE pIPAddrTable; + unsigned int i; + DWORD dwSize = 0, dwRetVal; + LPVOID lpMsgBuf; + + pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof( MIB_IPADDRTABLE) ); + + if ( pIPAddrTable ) { + // Make an initial call to GetIpAddrTable to get the + // necessary size into the dwSize variable + if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { + free( pIPAddrTable ); + pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize ); + } + } else + printf("Memory allocation failed.\n"); + + if ( pIPAddrTable ) { + // Make a second call to GetIpAddrTable to get the + // actual data we want + if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) == NO_ERROR ) { + for(i = 0; i < pIPAddrTable->dwNumEntries; ++i) { + if(memcmp(&(pIPAddrTable->table[i].dwAddr), rgmyip, 4) == 0) { + memcpy(rgsubnet, &(pIPAddrTable->table[i].dwMask), 4); + free( pIPAddrTable ); + return 1; + } + } + } else { + if (FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + dwRetVal, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL )) { + printf("\tError: %s", lpMsgBuf); + } + + printf("Call to GetIpAddrTable failed.\n"); + } + } + + if ( pIPAddrTable ) + free( pIPAddrTable ); + + return 0; +} + +/* + * Extract gateway address from routing table (Windows). + */ +int SetDefaultGateway() { + PMIB_IPFORWARDTABLE pIpForwardTable; + DWORD dwRetVal, dwSize; + + unsigned int nord_mask; + unsigned int nord_ip; + unsigned int nord_net; + + unsigned int i; + + nord_mask = *((unsigned int *)rgsubnet); + nord_ip = *((unsigned int *)rgmyip); + + nord_net = nord_ip & nord_mask; + + pIpForwardTable = (MIB_IPFORWARDTABLE*) malloc(sizeof(MIB_IPFORWARDTABLE)); + if (pIpForwardTable == NULL) { + printf("Error allocating memory\n"); + return 0; + } + + dwSize = 0; + if (GetIpForwardTable(pIpForwardTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { + free(pIpForwardTable); + pIpForwardTable = (MIB_IPFORWARDTABLE*) malloc(dwSize); + if (pIpForwardTable == NULL) { + printf("Error allocating memory\n"); + return 0; + } + } + + /* + * Note that the IPv4 addresses returned in + * GetIpForwardTable entries are in network byte order + */ + if ((dwRetVal = GetIpForwardTable(pIpForwardTable, &dwSize, 0)) == NO_ERROR) { + for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) { + unsigned int gwaddr = pIpForwardTable->table[i].dwForwardNextHop; + if(nord_net == (gwaddr & nord_mask) && nord_ip != gwaddr) + { /* searching for gateways from our network with different address than ours */ + memcpy(rggwyip, &gwaddr, 4); + return 0; + } + } + free(pIpForwardTable); + return 1; + } + else { + printf("\tGetIpForwardTable failed.\n"); + free(pIpForwardTable); + return 0; + } + +} +/*endif WIN32*/ +#endif + +/* + * Get_IPMac_Addr + * This routine finds the IP and MAC for the local interface, + * the default gateway, and SNMP alert destination from the + * BMC and OS information. + * + * Linux snmpd.conf locations (see ipmiutil.spec): + * RedHat, MontaVista: /etc/snmp/snmpd.conf + * SuSE SLES 8: /etc/ucdsnmpd.conf + * SuSE SLES 9: /etc/snmpd.conf + */ +#ifdef WIN32 +int Get_IPMac_Addr() +{ /*for Windows*/ + char ipstr[] = "IP Address"; + char macstr[] = "Physical Address"; + char gwystr[] = "Default Gateway"; + char substr[] = "Subnet Mask"; + int found = 0; + char fgetmac; + + if (IpIsValid(rgmyip)) + { /* user-specified ip, get mac */ + if (fdebug) printf("User IP was specified\n"); + if (!MacIsValid(rgmymac)) + { /* no user-specified MAC, get it from IP */ + if (fdebug) printf("No user MAC specified\n"); + if(!GetLocalMACByIP()) + { /* couldn't get MAC from IP, get old one */ + if (fdebug) printf("No MAC from IP, use old\n"); + if(IpIsValid(bmcmyip) && MacIsValid(bmcmymac)) + { + printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + bmcmymac[0], bmcmymac[1], + bmcmymac[2], bmcmymac[3], + bmcmymac[4], bmcmymac[5]); + memcpy(rgmymac,bmcmymac,MAC_LEN); + } else { + printf("Failed to obtain valid MAC\n"); + } + } else { + printf("Using adapter MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + rgmymac[0], rgmymac[1], + rgmymac[2], rgmymac[3], + rgmymac[4], rgmymac[5]); + } + } else { /* user MAC available */ + printf("Using user MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + rgmymac[0], rgmymac[1], + rgmymac[2], rgmymac[3], + rgmymac[4], rgmymac[5]); + } + } else { /* no user-specified IP */ + if (fdebug) printf("No user IP specified\n"); + if (!MacIsValid(rgmymac)) + { /* no user-specified MAC, get it from interface */ + if(!GetLocalDataByIface()) + { /* use existing MAC an IP */ + printf("Using current BMC IP %d.%d.%d.%d\n", + bmcmyip[0], bmcmyip[1], + bmcmyip[2], bmcmyip[3]); + memcpy(rgmyip,bmcmyip,4); + printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + bmcmymac[0], bmcmymac[1], + bmcmymac[2], bmcmymac[3], + bmcmymac[4], bmcmymac[5]); + memcpy(rgmymac,bmcmymac,MAC_LEN); + + } + } else { /* user-specified MAC */ + if(!GetLocalIPByMAC(rgmymac)) + { /* use existing MAC and IP */ + printf("Using current BMC IP %d.%d.%d.%d\n", + bmcmyip[0], bmcmyip[1], + bmcmyip[2], bmcmyip[3]); + memcpy(rgmyip,bmcmyip,4); + printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + bmcmymac[0], bmcmymac[1], + bmcmymac[2], bmcmymac[3], + bmcmymac[4], bmcmymac[5]); + memcpy(rgmymac,bmcmymac,MAC_LEN); + } + } + } + + if (rghostname[0] == 0) { /*hostname not specified*/ + if (!fipmilan) + gethostname(rghostname,sizeof(rghostname)); + } + if (fdebug) /* show the local OS eth if and MAC */ + printf("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n", + ifname, osmyip[0],osmyip[1],osmyip[2],osmyip[3], rghostname, + osmymac[0], osmymac[1], osmymac[2], osmymac[3], + osmymac[4], osmymac[5]); + + if(!SubnetIsValid(rgsubnet)) { + SetSubnetMask(); + } + if (!IpIsValid(rggwyip)) { /* if gwy ip not user-specified */ + SetDefaultGateway(); + } + + if (lan_ch == gcm_ch) { + if (SubnetIsSame(rgmyip,rggwyip,rgsubnet)) fgetmac = 1; + else fgetmac = 0; + } else fgetmac = 1; + + if (fgetmac) { + if (IpIsValid(rggwyip) && !MacIsValid(rggwymac)) /*gwy mac not specified*/ + Get_Mac(rggwyip,rggwymac,NULL); + + if (IpIsValid(rggwy2ip) && !MacIsValid(rggwy2mac)) /*gwy2 mac not valid*/ + Get_Mac(rggwy2ip,rggwy2mac,NULL); + } + + return(0); +} /* end Get_IPMac_Addr for Windows */ + +#elif defined(HPUX) +int Get_IPMac_Addr() +{ /*for HP-UX*/ + return(-1); +} +#else +int Get_IPMac_Addr() +{ /*for Linux*/ +#if defined(SOLARIS) + char rtfile[] = "/tmp/route"; + char snmpfile[] = "/etc/snmp/conf/snmpd.conf"; +#elif defined(BSD) + char rtfile[] = "/tmp/route"; + char snmpfile[] = "/etc/snmpd.config"; +#else + char rtfile[] = "/proc/net/route"; + char snmpfile[] = "/etc/snmp/snmpd.conf"; +#endif + // char alertfile[] = "/tmp/alert.arping"; + // FILE *fparp; + FILE *fprt; + int fd = -1; + int skfd; + uchar *pc; + int rc = 0; + int i,j; + uchar bnetadr[4]; + uchar bgateadr[4]; + char gate_addr[128]; + char iface[16]; + char defcommunity[19] = "public"; + char buff[1024]; + char alertname[60]; + int num, nmatch; + struct ifreq ifr; + char *_ifname; + char fgetmac; + + /* Get the IP address and associated MAC address specified. */ + /* Local for ethN; Default Gateway; Alert Destination */ + + /* Get the default gateway IP */ +#if defined(SOLARIS) || defined(BSD) + char rtcmd[80]; + sprintf(rtcmd,"netstat -r -n |grep default |awk '{ print $2 }' >%s",rtfile); + system(rtcmd); + /* use rtfile output from netstat -r, see also /etc/defaultroute */ + fprt = fopen(rtfile,"r"); + if (fprt == NULL) { + fprintf(stdout,"netstat: Cannot open %s, errno = %d\n",rtfile,get_errno()); + } else { + while (fgets(buff, 1023, fprt)) { + if ((buff[0] > '0') && (buff[0] <= '9')) { /*valid*/ + atoip(bgateadr,buff); + if (fdebug) + printf("default gateway: %s, %d.%d.%d.%d %s\n",buff, + bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3],ifname); + if (!IpIsValid(rggwyip)) /* if not user-specified */ + memcpy(rggwyip,bgateadr,4); + break; + } + } + fclose(fprt); + } /*end-else good open */ +#else + /* cat /proc/net/route and save Gwy if Dest == 0 and Gateway != 0 */ + fprt = fopen(rtfile,"r"); + if (fprt == NULL) { + fprintf(stdout,"route: Cannot open %s, errno = %d\n",rtfile,get_errno()); + } else { + char rtfmt[] = "%16s %128s %128s %X %d %d %d %128s %d %d %d\n"; + int iflags, refcnt, use, metric, mss, window, irtt; + char mask_addr[128], net_addr[128]; + uint *pnet; + uint *pgate; + + pnet = (uint *)&bnetadr[0]; + pgate = (uint *)&bgateadr[0]; + while (fgets(buff, 1023, fprt)) { + num = sscanf(buff, rtfmt, + iface, net_addr, gate_addr, + &iflags, &refcnt, &use, &metric, mask_addr, + &mss, &window, &irtt); + if (num < 10 || !(iflags & RTF_UP)) + continue; + + j = 6; + for (i = 0; i < 4; i ++) { + bnetadr[i] = htoi(&net_addr[j]); + bgateadr[i] = htoi(&gate_addr[j]); + j -= 2; + } + if ((*pnet == 0) && (*pgate != 0)) { /* found default gateway */ + if (fdebug) + printf("default gateway: %s, %d.%d.%d.%d %s\n",gate_addr, + bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3],iface); + if (!IpIsValid(rggwyip)) /* if not user-specified */ + memcpy(rggwyip,bgateadr,4); + _ifname = iface; /*use this iface for gwy mac */ + if (!fsetifn) strncpy(ifname,iface,16); + break; + } + } /*end while*/ + fclose(fprt); + } /*end-else good open */ +#endif + + /* Create a channel to the NET kernel. */ + if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + perror("socket"); + return(-3); + } + + /* Find a valid local BMC MAC Address */ + if (lan_ch == gcm_ch) { + /* GCM has its own unique mac address */ + if (!MacIsValid(rgmymac)) { + if (MacIsValid(bmcmymac)) { + memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/ + } else { /*error*/ + printf("invalid MAC address for gcm\n"); + } + } /*else use rgmymac if specified*/ + _ifname = iface; /*use the iface from gwy (e.g. eth0) */ + fsharedMAC = 0; /*gcm has separate NIC, separate MAC*/ + + // fd = -1; + fd = skfd; // get_socket_for_af(AF_INET) below; + } else { /*else not gcm*/ + if (!fsetifn && !fethfound) { /*do not have ifname yet*/ + i = FindEthNum(bmcmymac); + if (i >= 0) sprintf(ifname,"%s%d",ifpattn,i); + } + ifr.ifr_addr.sa_family = AF_INET; + if (fdebug) printf("getipmac: ifname=%s\n",ifname); + _ifname = ifname; + strcpy(ifr.ifr_name, _ifname); + +#ifdef SIOCGIFHWADDR + /* Get the local if HWADDR (MAC Address) from OS */ + if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) { + if (fdebug) + printf("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n",_ifname,get_errno()); + } else memcpy(osmymac,get_ifreq_mac(&ifr),MAC_LEN); /*OS mac*/ +#endif + + if (memcmp(bmcmymac,osmymac,MAC_LEN) == 0) { + /* osmymac and ifname were set above by FindEthNum */ + printf("\tBMC shares IP/MAC with OS NIC %s\n",_ifname); + fsharedMAC = 1; + } /* else fsharedMAC = 0; */ + + if (fsharedMAC == 0) { /* then BMC has separate MAC */ + if (!MacIsValid(rgmymac) && MacIsValid(bmcmymac)) + memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/ + } else { /* else OS & BMC share a MAC */ + /* Use the local if HWADDR (MAC Address) from OS */ + if (!MacIsValid(rgmymac)) { /* if not user-specified */ + if (MacIsValid(bmcmymac)) + memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/ + else memcpy(rgmymac,osmymac,MAC_LEN); /*use OS mac*/ + } + } + fd = skfd; // get_socket_for_af(AF_INET) below; + } + + if (fd >= 0) { /* if valid fd, find OS IP */ + strcpy(ifr.ifr_name, _ifname); + ifr.ifr_addr.sa_family = AF_INET; + /* Get the IFADDR (IP Address) from OS */ + if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { + int err; + err = get_errno(); + /* errno 99 here means that eth0 is not enabled/up/defined. */ + if (err == 99) + printf("ioctl(SIOCGIFADDR) error, %s not enabled\n",_ifname); + else if (fdebug) + printf("ioctl(SIOCGIFADDR,%s) error, errno=%d\n",_ifname,err); + } else { /* got the local OS IP successfully */ + pc = (uchar *)&ifr.ifr_addr.sa_data[2]; + if (fdebug) + printf("%s addr = %d.%d.%d.%d\n",_ifname,pc[0],pc[1],pc[2],pc[3]); + memcpy(osmyip, pc, 4); + if (!IpIsValid(rgmyip) && (fsharedMAC==1)) /*not specified, shared*/ + memcpy(rgmyip, osmyip, 4); + + /* get the local OS netmask */ + strcpy(ifr.ifr_name, _ifname); + if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { + if (fdebug) + printf("ioctl(SIOCGIFNETMASK) error, errno=%d\n",get_errno()); + /* if leave invalid, will use default rgsubnet */ + } else { // sizeof(struct sockaddr) + pc = (uchar *)&ifr.ifr_netmask.sa_data[2]; + if (fdebug) + printf("subnet = %d.%d.%d.%d \n", pc[0],pc[1],pc[2],pc[3]); + memcpy(ossubnet, pc, 4); + if (!SubnetIsValid(rgsubnet) && fsharedMAC) /*not specified*/ + memcpy(rgsubnet, pc, 4); + } + +#ifdef SIOCGIFHWADDR + /* Get the localhost OS HWADDR (MAC Address) */ + if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { + if (fdebug) + printf("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n", + _ifname,get_errno()); + } else memcpy(osmymac,get_ifreq_mac(&ifr),MAC_LEN); /*OS mac*/ +#endif + } + } + close(skfd); /* done, close the socket */ + + if (rghostname[0] == 0) { /*hostname not specified*/ + if (!fipmilan) + gethostname(rghostname,sizeof(rghostname)); + } + if (fdebug) /* show the local OS eth if and MAC */ + printf("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n", + _ifname, osmyip[0],osmyip[1],osmyip[2],osmyip[3], rghostname, + osmymac[0], osmymac[1], osmymac[2], osmymac[3], + osmymac[4], osmymac[5]); + + if (!IpIsValid(rgmyip) && IpIsValid(bmcmyip)) { + /* If no user-specified IP and there is a valid IP already in the + * BMC LAN configuration, use the existing BMC LAN IP. */ + memcpy(rgmyip,bmcmyip,4); + if (fdebug) printf("Using current IP %d.%d.%d.%d\n", + bmcmyip[0], bmcmyip[1], + bmcmyip[2], bmcmyip[3]); + } + + /* Get the default gateway MAC */ + if (lan_ch == gcm_ch) { + if (SubnetIsSame(osmyip,rggwyip,ossubnet)) fgetmac = 1; + else { /* gateway is not on the same subnet as RMM/GCM */ + fgetmac = 0; /*don't try to get mac if not the same subnet*/ + if ((fset_ip & GWYIP) == 0) memset(rggwyip,0,4); + } + } else fgetmac = 1; + if (fgetmac && IpIsValid(rggwyip) && !MacIsValid(rggwymac)) + Get_Mac(rggwyip,rggwymac,NULL); /*gwy mac not specified, so get mac*/ + + /* Get the Alert Destination IP */ + /* By default, attempt to obtain this from /etc/snmp/snmpd.conf. */ + /* cat /etc/snmp/snmpd.conf | grep trapsink |tail -n1 | cut -f2 -d' ' */ + alertname[0] = 0; /* default to null string */ + fprt = fopen(snmpfile,"r"); + if (fprt == NULL) { + printf("snmp: Cannot open %s, errno = %d\n",snmpfile,get_errno()); + } else { + // char snmpfmt[] = "%20s %60s\n"; + // char *keywd, *value; + while (fgets(buff, 1023, fprt)) { + /* parse each line */ + if (buff[0] == '#') continue; /*skip comment lines*/ + /* skip leading whitespace here */ + j = strspn(&buff[0]," \t"); + if (strncmp(&buff[j],"com2sec",7) == 0) { /* found community line */ + /* usu like this: "com2sec demouser default public" */ + i = j + 7; + for (j = 0; j < 3; j++) { + num = strspn(&buff[i]," \t"); + i += num; + num = strcspn(&buff[i]," \t\r\n"); + if (j < 2) i += num; + } + buff[i+num] = 0; + if (fsetcommunity == 0) { /* if not user-specified */ + strcpy(rgcommunity,&buff[i]); + strcpy(defcommunity,&buff[i]); + } + } +#ifdef BSD + if (strncmp(&buff[j],"traphost :=",11) == 0) nmatch = 11; + else nmatch = 0; +#else + if (strncmp(&buff[j],"trapsink",8) == 0) nmatch = 8; + else if (strncmp(&buff[j],"trap2sink",9) == 0) nmatch = 9; + else nmatch = 0; +#endif + if (nmatch > 0) { /* found trapsink line match */ + if (fdebug) printf("%s: %s",snmpfile,&buff[j]); + num = strspn(&buff[j+nmatch]," \t"); + i = j + nmatch + num; + if (buff[i] == '`') continue; + num = strcspn(&buff[i]," \t\r\n"); + strncpy(alertname,&buff[i],num); /* save alert destination */ + alertname[num] = 0; + i += num; + num = strspn(&buff[i]," \t"); /*skip whitespace*/ + i += num; + num = strcspn(&buff[i]," \t\r\n"); /*span next word*/ + if (num != 0) { /* there is another word, that is community */ + if (fsetcommunity == 0) { /* if not user-specified */ + strncpy(rgcommunity,&buff[i],num); /* save community */ + rgcommunity[num] = 0; + } + } else { /*have trapsink node with no community*/ + /* use previously discovered default community from above */ + strcpy(rgcommunity,defcommunity); + } + /* dont break, keep looking, use the last one */ + } + } /*end while*/ + fclose(fprt); + if (fdebug) + printf("snmp alertname=%s community=%s\n",alertname,rgcommunity); + } /*end else snmpfile*/ + + /* Get the Alert Destination MAC from the alertname. */ + if (alertname[0] != 0) { +#ifdef TEST + char arping_cmd[128]; + char *pb, *pm, *px; + int num, i; + if (fdebug) printf("alert %s ip=%d.%d.%d.%d osip=%d.%d.%d.%d " + "mac=%02x:%02x:%02x:%02x:%02x:%02x " + "osmac=%02x:%02x:%02x:%02x:%02x:%02x\n", + alertname, + rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3], + osmyip[0], osmyip[1], osmyip[2], osmyip[3], + rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3], + rgdestmac[4], rgdestmac[5], + osmymac[0], osmymac[1], osmymac[2], osmymac[3], + osmymac[4], osmymac[5]); +#endif + if (!IpIsValid(rgdestip)) { /* if not user-specified with -A */ + if (IpIsValid(bmcdestip)) { /* use existing if valid */ + memcpy(rgdestip,bmcdestip,4); + if (MacIsValid(bmcdestmac)) + memcpy(rgdestmac,bmcdestmac,MAC_LEN); + } + else if ((strncmp(alertname,"localhost",9) == 0) ) + { /* snmpd.conf = localhost (self) is the SNMP alert destination */ + if (IpIsValid(osmyip)) + memcpy(rgdestip,osmyip,4); + if (!MacIsValid(rgdestmac)) { /* if not user-specified */ + // Get_Mac(rgdestip,rgdestmac,alertname); (wont work for local) + memcpy(rgdestmac,osmymac,MAC_LEN); + } + } /*endif local */ + } + if (!MacIsValid(rgdestmac)) /* if MAC not vaild or user-specified */ + { + /* Use arping to get MAC from alertname or IP */ + Get_Mac(rgdestip,rgdestmac,alertname); + } + } /*endif have alertname*/ + + return(rc); +} /* end Get_IPMac_Addr */ +#endif + +int ShowChanAcc(uchar bchan) +{ + LAN_RECORD LanRecord; + int ret = 0; + uchar access; + char *pstr; + uchar pb0, pb1; + + if (bchan == lan_ch) pstr = "lan"; + else if (bchan == ser_ch) pstr = "ser"; + else pstr = "?"; + ret = GetChanAcc(bchan, 0x40, &LanRecord); + if (fdebug) + printf(" GetChanAcc(%d), ret = %d, data = %02x %02x\n", + bchan,ret, LanRecord.data[0], LanRecord.data[1]); + pb0 = LanRecord.data[0]; + pb1 = LanRecord.data[1]; + if (fcanonical) + printf("Channel %d Access Mode %s%c ",bchan,pspace3,bdelim); + else + printf("Channel(%d=%s) Access Mode: %02x %02x : ",bchan,pstr,pb0,pb1); + access = pb0; + switch (access & 0x03) { + case 0: printf("Disabled, "); break; + case 1: printf("Pre-Boot, "); break; + case 2: printf("Always Avail, "); break; + case 3: printf("Shared, "); break; + } + if (access & 0x20) printf("PEF Alerts Disabled\n"); /*0*/ + else printf("PEF Alerts Enabled\n"); /*1*/ + return(ret); +} + +static int GetSessionInfo(uchar *rData, int sz) +{ + int rv, rlen; + uchar ccode; + uchar iData[5]; + + iData[0] = 0x00; /*get data for this session*/ + rlen = sz; + rv = ipmi_cmdraw(CMD_GET_SESSION_INFO,NETFN_APP, BMC_SA,PUBLIC_BUS,BMC_LUN, + iData,1,rData, &rlen, &ccode, fdebug); + if ((rv == 0) && (ccode != 0)) rv = ccode; + return(rv); +} + +static int GetPefCapabilities(uchar *bmax) +{ + int rv, rlen; + uchar ccode; + uchar rData[MAX_BUFFER_SIZE]; + + rlen = sizeof(rData); + rv = ipmi_cmdraw(0x10, NETFN_SEVT, BMC_SA,PUBLIC_BUS,BMC_LUN, + NULL,0,rData, &rlen, &ccode, fdebug); + if ((rv == 0) && (ccode != 0)) rv = ccode; + if ((rv == 0) && (bmax != NULL)) + *bmax = rData[2]; /*max num PEF table entries*/ + return(rv); +} + +int GetSerialOverLan( uchar chan, uchar bset, uchar block ) +{ + uchar requestData[24]; + uchar rData[MAX_BUFFER_SIZE]; + int rlen; + int status, i; + uchar ccode; + uchar enable_parm, auth_parm, baud_parm; + ushort getsolcmd; + uchar user; + + if (fIPMI20 && fSOL20) { + getsolcmd = GET_SOL_CONFIG2; + enable_parm = SOL_ENABLE_PARAM; + auth_parm = SOL_AUTHENTICATION_PARAM; + baud_parm = SOL_BAUD_RATE_PARAM; + } else { + getsolcmd = GET_SOL_CONFIG; + enable_parm = SOL_ENABLE_PARAM; + auth_parm = SOL_AUTHENTICATION_PARAM; + baud_parm = SOL_BAUD_RATE_PARAM; + chan = 0; /*override chan for IPMI 1.5*/ + } + if (!fcanonical) + printf("%s, GetSOL for channel %d ...\n",progname,chan); + + requestData[0] = chan; /*channel*/ + requestData[1] = enable_parm; + requestData[2] = bset; /*set*/ + requestData[3] = block; /*block*/ + rlen = sizeof(rData); + status = ipmi_cmd(getsolcmd, requestData,4, rData, &rlen,&ccode,fdebug); + if (status != 0) return(status); + if (ccode) { + if (ccode == 0xC1) { /* unsupported command */ + printf("Serial-Over-Lan not available on this platform\n"); + return(status); + } else { + printf("SOL Enable ccode = %x\n",ccode); + status = ccode; + } + } else { /*success*/ + if (fcanonical) { + printf("Channel %d SOL Enable %s",chan,pspace3); + } else { + printf("SOL Enable: "); + for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); + } + if (rData[1] == 0x01) printf("%c enabled\n",bdelim); + else printf("%c disabled\n",bdelim); + } + + if (!fcanonical) + { + requestData[0] = chan; + requestData[1] = auth_parm; + requestData[2] = bset; // selector + requestData[3] = block; // block + rlen = sizeof(rData); + status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug); + if (status != 0) return(status); + if (ccode) { + printf("SOL Auth ccode = %x\n",ccode); + status = ccode; + } else { /*success*/ + printf("SOL Auth: "); + for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); + printf(": "); + show_priv(rData[1]); /* priv level = User,Admin,... */ + printf("\n"); + } + + requestData[0] = chan; + requestData[1] = SOL_ACC_INTERVAL_PARAM; + requestData[2] = bset; + requestData[3] = block; + rlen = sizeof(rData); + status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug); + if (status != 0) return(status); + if (ccode) { + printf("SOL Accum Interval ccode = %x\n",ccode); + status = ccode; + } else { /*success*/ + printf("SOL Accum Interval: "); + for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); + printf(": %d msec\n",(rData[1] * 5)); + } + + requestData[0] = chan; + requestData[1] = SOL_RETRY_PARAM; + requestData[2] = bset; + requestData[3] = block; + rlen = sizeof(rData); + status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug); + if (status != 0) return(status); + if (ccode) { + printf("SOL Retry ccode = %x\n",ccode); + status = ccode; + } else { /*success*/ + printf("SOL Retry Interval: "); + for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); + printf(": %d msec\n",(rData[2] * 10)); + } + } + + if (!fRomley) + { + requestData[0] = chan; + requestData[1] = baud_parm; + requestData[2] = bset; + requestData[3] = block; + rlen = sizeof(rData); + status = ipmi_cmd(getsolcmd,requestData,4,rData, &rlen,&ccode,fdebug); + if (status != 0) return(status); + if (ccode) { + printf("SOL nvol Baud ccode = %x\n",ccode); + status = ccode; + } else { /*success*/ + uchar b; + if (fcanonical) { + printf("Channel %d SOL Baud Rate%s",chan,pspace3); + } else { + printf("SOL nvol Baud Rate: "); + for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); + } + /* if not user-specified and previously enabled, use existing */ + b = (rData[1] & 0x0f); + if ((fnewbaud == 0) && BaudValid(b)) { + sol_baud = b; + sol_bvalid = 1; + } + printf("%c %s\n",bdelim,Baud2Str(b)); + } + + if (!fcanonical) + { + requestData[0] = chan; + requestData[1] = SOL_VOL_BAUD_RATE_PARAM; /*0x06*/ + requestData[2] = bset; + requestData[3] = block; + rlen = sizeof(rData); + status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug); + if (status != 0) return(status); + if (ccode) { + printf("SOL vol Baud ccode = %x\n",ccode); + status = ccode; + } else { /*success*/ + printf("SOL vol Baud Rate: "); + for (i = 1; i < rlen; i++) printf("%02x ",rData[i]); + printf("%c %s\n",bdelim,Baud2Str(rData[1])); + } + } + } + if (fIPMI20) { + if (vend_id != VENDOR_IBM) { + /* IBM 0x00DC returns invalid cmd for SOL Payload commands. */ + if (!fcanonical) { + requestData[0] = chan; + rlen = sizeof(rData); + status = ipmi_cmdraw(GET_PAYLOAD_SUPPORT, NETFN_APP, + BMC_SA,PUBLIC_BUS,BMC_LUN, + requestData,1,rData, &rlen, &ccode, fdebug); + if ((status != 0) || (ccode != 0)) { + printf("SOL Payload Support error %d, ccode = %x\n",status,ccode); + if (status == 0) status = ccode; + } else { /*success*/ + printf("SOL Payload Support(%d): ",chan); + for (i = 0; i < rlen; i++) printf("%02x ",rData[i]); + printf("\n"); + } + } /*endif not canonical*/ + /* get Payload Access for 4 users, not just lan_user */ + for (user = 1; user <= show_users; user++) + { + /* mBMC doesn't support more than 1 user */ + if (fmBMC && (user > 1)) break; + /* IPMI 2.0 has >= 4 users */ + requestData[0] = chan; + requestData[1] = user; + rlen = sizeof(rData); + status = ipmi_cmdraw(GET_PAYLOAD_ACCESS, NETFN_APP, + BMC_SA,PUBLIC_BUS,BMC_LUN, + requestData,2,rData, &rlen, &ccode, fdebug); + if ((status != 0) || (ccode != 0)) { + printf("SOL Payload Access(%d,%d) error %d, ccode = %x\n", + chan,user,status,ccode); + if (status == 0) status = ccode; + } else { /*success*/ + if (fcanonical) { + printf("Channel %d SOL Payload Access(user%d)%s",chan,user, + pspace1); + } else { + printf("SOL Payload Access(%d,%d): ",chan,user); + for (i = 0; i < rlen; i++) printf("%02x ",rData[i]); + } + if ((rData[0] & 0x02) != 0) printf("%c enabled\n",bdelim); + else printf("%c disabled\n",bdelim); + } + } /*end user loop*/ + } /*endif not IBM*/ + } + + return(status); +} /*end GetSerialOverLan */ + +/* +ECHO SOL Config Enable +CMDTOOL 20 30 21 %1 01 01 + +ECHO SOL Authentication (Administrator) +CMDTOOL 20 30 21 %1 02 04 + +ECHO SOL Accumlate Interval and threshold +CMDTOOL 20 30 21 %1 03 06 14 + +ECHO SOL Retry Interval and threshold +CMDTOOL 20 30 21 %1 04 06 14 + +ECHO SOL non-volatile baud rate +CMDTOOL 20 30 21 %1 05 07 + +ECHO SOL volatile baud rate +CMDTOOL 20 30 21 %1 06 07 + +ECHO Set user Payload Access for user 1 +CMDTOOL 20 18 4c %1 01 02 00 00 00 + */ +int SetupSerialOverLan( int benable ) +{ + uchar requestData[24]; + uchar responseData[MAX_BUFFER_SIZE]; + int responseLength = MAX_BUFFER_SIZE; + int status; + uchar completionCode; + uchar enable_parm, auth_parm, baud_parm; + ushort setsolcmd; + ushort getsolcmd; + uchar bchan, b; + + if (fIPMI20 && fSOL20) { + setsolcmd = SET_SOL_CONFIG2; + getsolcmd = GET_SOL_CONFIG2; + enable_parm = SOL_ENABLE_PARAM; + auth_parm = SOL_AUTHENTICATION_PARAM; + baud_parm = SOL_BAUD_RATE_PARAM; + bchan = lan_ch; + } else { + setsolcmd = SET_SOL_CONFIG; + getsolcmd = GET_SOL_CONFIG; + enable_parm = SOL_ENABLE_PARAM; + auth_parm = SOL_AUTHENTICATION_PARAM; + baud_parm = SOL_BAUD_RATE_PARAM; + bchan = 0x00; /*override chan for IPMI 1.5*/ + } + memset(requestData, 0, sizeof(requestData)); /* zero-fill */ + requestData[0] = bchan; + requestData[1] = enable_parm; + if (benable == 0) + requestData[2] = SOL_DISABLE_FLAG; + else + requestData[2] = SOL_ENABLE_FLAG; + responseLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(setsolcmd, requestData,3,responseData, + &responseLength, &completionCode, fdebug); + if (status == ACCESS_OK) { + switch( completionCode ) { + case 0x00: /* success */ + break; + case 0xC1: /* unsupported command */ + SELprintf("SetupSerialOverLan: SOL not available on this platform\n"); + return 0; + default: /* other error */ + SELprintf("SetupSerialOverLan: SOL_ENABLE_PARAM ccode=%x\n", + completionCode); + return -1; + break; + } + } else { + SELprintf( "SET_SOL_CONFIG, enable SOL failed\n" ); + return -1; + } + if (benable == 0) return 0; + + requestData[0] = bchan; /* channel */ + requestData[1] = auth_parm; + requestData[2] = 0x00; /* set selector */ + requestData[3] = 0x00; /* block selector */ + responseLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(getsolcmd, requestData,4,responseData, + &responseLength, &completionCode, fdebug); + if (status == ACCESS_OK) { + if( completionCode ) { + SELprintf("SetupSerialOverLan: GET_SOL_AUTHENTICATION_PARAM code=%x\n", + completionCode); + + return -1; + } + } else { + SELprintf( "SOL_CONFIG, get SOL authentication failed\n" ); + return -1; + } + + if ((vend_id == VENDOR_SUPERMICROX) || + (vend_id == VENDOR_SUPERMICRO)) b = SOL_PRIVILEGE_LEVEL_OPERATOR; + else b = SOL_PRIVILEGE_LEVEL_USER; + requestData[0] = bchan; + requestData[1] = auth_parm; + requestData[2] = b | ( responseData[1] & 0x80 ); /* priv | enable */ + responseLength = MAX_BUFFER_SIZE; + status = ipmi_cmd(setsolcmd, requestData,3,responseData, + &responseLength, &completionCode, fdebug); + if (status == ACCESS_OK) { + if( completionCode ) { + SELprintf("SET_SOL_AUTHENTICATION_PARAM code=%x\n", + completionCode); + + return -1; + } + } else { + SELprintf( "SET_SOL_CONFIG, set SOL authentication failed\n" ); + return -1; + } + + requestData[0] = bchan; + requestData[1] = SOL_ACC_INTERVAL_PARAM; + requestData[2] = sol_accum[0]; //0x04; + requestData[3] = sol_accum[1]; //0x32; + responseLength = MAX_BUFFER_SIZE; + if (fdebug) SELprintf("Setting SOL AccumInterval\n"); + status = ipmi_cmd(setsolcmd, requestData,4,responseData, + &responseLength, &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + SELprintf("SET SOL AccumInterval ret=%d ccode=%x\n", + status,completionCode); + return -1; + } + + /* Some BMCs return sporadic errors for SOL params (e.g. Kontron)*/ + // if (vend_id == VENDOR_KONTRON) ; + // else + { + requestData[0] = bchan; + requestData[1] = SOL_RETRY_PARAM; + requestData[2] = sol_retry[0]; //0x06; + requestData[3] = sol_retry[1]; //0x14; + responseLength = MAX_BUFFER_SIZE; + if (fdebug) SELprintf("Setting SOL RetryInterval\n"); + status = ipmi_cmd(setsolcmd, requestData,4,responseData, + &responseLength, &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + SELprintf("SET SOL RetryInterval ret=%d ccode=%x\n", + status,completionCode); + return -1; + } + } + + if (fRomley) ; /* skip SOL BAUD */ + else { /* else SOL BAUD is used, so set it. */ + if (fnewbaud == 0) { /* no user-specified SOL baud */ + /* if sol_bvalid, sol_baud was set to existing value above */ + if (!sol_bvalid) { + status = GetSerEntry(7, (LAN_RECORD *)&responseData); + if (status == 0) { /* use Serial baud for SOL */ + sol_baud = responseData[1]; + if (fdebug) SELprintf("Serial Baud is %s\n",Baud2Str(sol_baud)); + } + } + } + requestData[0] = bchan; + requestData[1] = baud_parm; + requestData[2] = sol_baud; + responseLength = MAX_BUFFER_SIZE; + if (fdebug) SELprintf("Setting SOL BAUD to %s\n",Baud2Str(sol_baud)); + status = ipmi_cmd(setsolcmd, requestData,3,responseData, + &responseLength, &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + SELprintf("SET SOL BAUD ret=%d ccode=%x\n", status,completionCode); + return -1; + } + + requestData[0] = bchan; + requestData[1] = SOL_VOL_BAUD_RATE_PARAM; + requestData[2] = sol_baud; + responseLength = MAX_BUFFER_SIZE; + if (fdebug) + printf("Setting SOL vol BAUD to %s\n",Baud2Str(sol_baud)); + status = ipmi_cmd(setsolcmd, requestData,3,responseData, + &responseLength, &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + printf("SET SOL vol BAUD ret=%d ccode=%x\n",status,completionCode); + return -1; + } + } + + if (fIPMI20 && fSOL20) { + if (vend_id == VENDOR_KONTRON && lan_user == 1) { + if (fdebug) SELprintf("Skipping SOL Payload Access for user %d\n", + lan_user); + } else if (vend_id == VENDOR_IBM) { /*non-conformance*/ + if (fdebug) SELprintf("Skipping SOL Payload Access for user %d\n", + lan_user); + } else { + if (fdebug) SELprintf("Setting SOL Payload Access for user %d\n", + lan_user); + requestData[0] = bchan; + requestData[1] = lan_user; /*enable this user*/ + requestData[2] = 0x02; /*enable std 2.0 SOL*/ + requestData[3] = 0; + requestData[4] = 0; + requestData[5] = 0; + responseLength = MAX_BUFFER_SIZE; + status = ipmi_cmdraw(SET_PAYLOAD_ACCESS, NETFN_APP, + BMC_SA,PUBLIC_BUS,BMC_LUN, + requestData,6,responseData, &responseLength, + &completionCode, fdebug); + if (status != ACCESS_OK || completionCode) { + SELprintf("SET SOL Payload Access ret=%d ccode=%x\n", + status,completionCode); + return -1; + } + } + } + return 0; +} /*end SetupSerialOverLan */ + +static char *PefDesc(int idx, uchar stype) +{ + char *pdesc, *p; + static char mystr[60]; + int mylen = sizeof(mystr); + pdesc = &mystr[0]; + if (pefdesc != NULL) strcpy(pdesc,pefdesc[idx]); /* if Intel, pre-defined */ + else strcpy(pdesc,"reserved"); /* else set default to detect */ + if ((stype != 0) && (strcmp(pdesc,"reserved") == 0)) { + /* Dynamically set the pef desc string from the sensor type */ + switch(stype) { + case 0x01: strcpy(pdesc,"Temperature"); break; + case 0x02: strcpy(pdesc,"Voltage"); break; + case 0x04: strcpy(pdesc,"Fan"); break; + case 0x05: strcpy(pdesc,"Chassis"); break; + case 0x07: strcpy(pdesc,"BIOS"); break; + case 0x08: strcpy(pdesc,"Power Supply"); break; + case 0x09: strcpy(pdesc,"Power Unit"); break; + case 0x0c: strcpy(pdesc,"Memory"); break; + case 0x0f: strcpy(pdesc,"Boot"); break; + case 0x12: strcpy(pdesc,"System Restart"); break; + case 0x13: strcpy(pdesc,"NMI"); break; + case 0x23: strcpy(pdesc,"Watchdog"); break; + case 0x20: strcpy(pdesc,"OS Critical Stop"); break; + default: +#ifdef METACOMMAND + p = get_sensor_type_desc(stype); + if (p != NULL) { + strncpy(pdesc,p,mylen); + mystr[mylen-1] = 0; /*stringify*/ + } +#else + sprintf(pdesc,"Other[%02x]",stype); +#endif + break; + } + if (pef_array[idx-1][4] == PEF_SEV_OK) strcat(pdesc," OK"); + } + return(pdesc); +} + + +#ifdef METACOMMAND +int i_lan(int argc, char **argv) +#else +#ifdef WIN32 +int __cdecl +#else +int +#endif +main(int argc, char **argv) +#endif +{ + int ret; + PEF_RECORD PefRecord; + LAN_RECORD LanRecord; + int i, idx, j; + int c; + char *pstr; + uchar bset; + int ndest = 4; + int idest; + char mystr[80]; + char fpefok = 1; + uchar * pc; int sz; + char *pa; + char *pb; + + // progname = argv[0]; + printf("%s ver %s \n",progname,progver); + j = 0; freadonly = FLAG_INIT; + idx = argc; /*getopt loop counter*/ + /* available opt chars: y O Q + = ~ _ */ + while ((c = getopt(argc, argv,"a:b:cdef:gh:i:j:klm:n:op:q:rstu:v:w:xy:z#::A:B:C:DEF:G:H:I:J:K:L:M:N:OP:Q:R:S:T:U:V:X:YZ:?")) != EOF) { + switch(c) { + case 'a': /* alert dest number (usu 1 thru 4) */ + alertnum = atob(optarg); + if (alertnum > alertmax) alertnum = 1; + j++; + break; + case 'b': bAuth = htoi(optarg); j++; break; /*undocumented*/ + case 'c': fcanonical = 1; bdelim = BDELIM; break; + case 'd': fenable = 0; fdisable = 1; freadonly = 0; break; + case 'e': fenable = 1; fdisable = 0; freadonly = 0; break; + case 'f': i = atoi(optarg); /*set arp_ctl*/ + if (i < 0 || i > 3) printf("Invalid ARP control %d\n",i); + else { + arp_ctl = i; + fsetarp = 1; + j++; + } + break; + case 'l': fpefenable = 0; fenable = 2; + fdisable = 0; freadonly = 0; break; + case 'h': /* VLAN ID */ + i = atoi(optarg); + if (i > 4095) vlan_enable = 0; + else { + vlan_enable = 1; + vlan_id = (ushort)i; + } + j++; + break; + case 'y': /* OEM LAN Failover enable/disable */ + i = atoi(optarg); + if (i < 0) printf("Failover(-y) parameter is negative\n"); + else failover_enable = i; + j++; + break; + case 'Q': /* VLAN Priority */ + i = atoi(optarg); + if (i > 7 || i < 0) vlan_enable = 0; + else { + vlan_enable = 1; + vlan_prio = (uchar)i; + } + j++; + break; + case 'i': /* eth interface (ifname) */ + fsetifn = 1; + i = sizeof(ifname); + if (strlen(optarg) > (uint)i) optarg[i] = 0; + strcpy(ifname,optarg); + if (fdebug) printf("ifname = %s\n",ifname); + j++; + break; + case 'j': fCustomPEF = 1; /*custom 10 PEF bytes */ + fpefenable = 1; /* PEF is implied here */ + freadonly = 0; + memset(custPEF,0,sizeof(custPEF)); + custPEF[0] = htoi(&optarg[0]); /*action */ + custPEF[1] = htoi(&optarg[2]); /*policy */ + custPEF[2] = htoi(&optarg[4]); /*severity*/ + custPEF[3] = htoi(&optarg[6]); /*genid1 */ + custPEF[4] = htoi(&optarg[8]); /*genid2 */ + custPEF[5] = htoi(&optarg[10]); /*sensor_type*/ + custPEF[6] = htoi(&optarg[12]); /*sensor_num */ + custPEF[7] = htoi(&optarg[14]); /*evt_trigger*/ + custPEF[8] = htoi(&optarg[16]); /*data1offset*/ + custPEF[9] = htoi(&optarg[18]); /*data1mask */ + if (optarg[20] != 0) { + /* optionally get 8 extra PEF entry bytes */ + custPEF[10] = htoi(&optarg[20]); /*data1cmp1 */ + custPEF[11] = htoi(&optarg[22]); /*data1cmp2 */ + custPEF[12] = htoi(&optarg[24]); /*data2mask */ + custPEF[13] = htoi(&optarg[26]); /*data2cmp1 */ + custPEF[14] = htoi(&optarg[28]); /*data2cmp2 */ + custPEF[15] = htoi(&optarg[30]); /*data3mask */ + custPEF[16] = htoi(&optarg[32]); /*data3cmp1 */ + custPEF[17] = htoi(&optarg[34]); /*data3cmp2 */ + } + j++; + break; + case 'k': fSetPEFOks = 1; j++; break; /*configure PEF OK rules */ + case 'm': set_max_kcs_loops(atoi(optarg)); break; + case 'n': /* number/index in PEF table to insert new entry */ + fpefenable = 1; + pefnum = atob(optarg); + if (pefnum >= MAXPEF) { + pefnum = MAXPEF - 1; + fAdjustPefNum = 1; + } else fUserPefNum = 1; + j++; + break; + case 'o': fdisableSOL = 1; /*disable SOL only*/ + fpefenable = 0; /*no change to PEF*/ + freadonly = 0; + break; + case 'r': freadonly = 1; fenable = 0; break; + case 's': fgetser = 1; break; + case 't': ftestonly = 1; freadonly = 1; break; + case 'v': /* user access privilege level */ + i = atoi(optarg); + if (valid_priv(i)) lan_access = i & 0x0f; + else printf("Invalid privilege -v %d, using Admin\n",i); + j++; + break; + case 'w': i = atoi(optarg); /*set grat arp interval, in #sec*/ + if (i >= 0 && i < 256) arp_interval = i * 2; + else printf("Invalid arp interval -w %d, skipping\n",i); + break; + case 'x': fdebug = 1; break; + case 'z': flanstats = 1; break; + case 'D': lan_dhcp = 1; j++; break; + case 'O': flansecure = 1; j++; break; + case 'I': /* My BMC IP Address */ + fset_ip |= MYIP; + atoip(rgmyip,optarg); + j++; + break; + case 'M': /* My BMC MAC Address */ + atomac(rgmymac,optarg); + if (!MacIsValid(rgmymac)) printf("Invalid MAC for -M\n"); + j++; + break; + case 'S': /* Subnet IP Address */ + atoip(rgsubnet,optarg); + j++; + break; + case 'G': /* Gateway IP Address */ + fset_ip |= GWYIP; + atoip(rggwyip,optarg); + j++; + break; + case 'g': /* Secondary Gateway IP Address */ + fset_ip |= GWYIP; + atoip(rggwy2ip,optarg); + j++; + break; + case 'H': /* Gateway MAC Address */ + atomac(rggwymac,optarg); + if (!MacIsValid(rggwymac)) printf("Invalid MAC for -H\n"); + j++; + break; + case 'B': /* SOL Baud rate */ + fnewbaud = 1; + sol_baud = Str2Baud(optarg); + j++; + break; + case 'A': /* Alert Dest IP Address */ + fset_ip |= DESTIP; + /* allow name or ip here via Get_Mac() ? */ + atoip(rgdestip,optarg); + fpefenable = 1; /* PEF is implied here */ + j++; + break; + case 'X': /* Alert Dest MAC Address */ + atomac(rgdestmac,optarg); + if (!MacIsValid(rgdestmac)) printf("Invalid MAC for -X\n"); + fpefenable = 1; /* PEF is implied here */ + j++; + break; + case 'K': /* Kontron IPMI hostname */ + i = sizeof(rghostname); /*usu 18*/ + if (strlen(optarg) > (uint)i) optarg[i] = 0; + strcpy(rghostname,optarg); + j++; + break; + case 'C': /* Community String */ + fsetcommunity = 1; + i = sizeof(rgcommunity); /*usu 18*/ + if (strlen(optarg) > (uint)i) optarg[i] = 0; + strcpy(rgcommunity,optarg); + fpefenable = 1; /* PEF is implied here */ + j++; + break; + case 'u': /* username to set */ + myuser = strdup_(optarg); /*remote username */ + j++; + break; + case 'p': /* password to set */ + fpassword = 1; + if (strlen(optarg) > PSW_MAX) optarg[PSW_MAX] = 0; + strcpy(passwordData,optarg); + if (fdebug) printf("Password = %s\n",passwordData); + /* Hide password from 'ps' */ + memset(optarg, ' ', strlen(optarg)); + j++; + break; + case 'q': + case '#': + usernum = atob(optarg); + if (usernum > 15) usernum = 0; /*MAX_IPMI_USERS = 15*/ + j++; + break; + case 'L': + if (strcmp(optarg,"list") == 0) fshowchan = 1; + lan_ch_parm = atob(optarg); + if (lan_ch_parm > MAXCHAN) lan_ch_parm = PARM_INIT; /*invalid*/ + break; + case 'V': /* priv level */ + fprivset = 1; + case 'N': /* nodename */ + case 'U': /* remote username */ + case 'P': /* remote password */ + case 'R': /* remote password */ + case 'E': /* get password from IPMI_PASSWORD environment var */ + case 'F': /* force driver type */ + case 'T': /* auth type */ + case 'J': /* cipher suite */ + case 'Y': /* prompt for remote password */ + case 'Z': /* set local MC address */ + parse_lan_options(c,optarg,fdebug); + break; + default: + printf("Usage: %s [-abcdefghijklmnopq#rstuvwxyzBDQK]\n",progname); + printf(" \t [-a alertnum -i eth1 -n pefnum ]\n"); + printf(" \t [-I ipadr -M macadr -S subnet ]\n"); + printf(" \t [-G gwyip -H gwymac -L lan_channel_num]\n"); + printf(" \t [-A alertip -X alertmac -C community ]\n"); + printf(" \t [-g 2nd_gwyip -v priv -B sol_baud ]\n"); + printf(" \t [-j 10_bytes_custom_pef -b authmask ]\n"); + printf("where -c shows Canonical, simpler output format\n"); + printf(" -d Disables BMC LAN & PEF\n"); + printf(" -e Enables BMC LAN & PEF\n"); + printf(" -f set ARP Control to 1=grat, 2=resp, 3=both\n"); + printf(" -g secondary Gateway IP (-G=primary_gwy_ip)\n"); + printf(" -h VLAN ID (>=4096 to disable)\n"); + printf(" -j specify custom PEF rule (10 or 18 hex bytes)\n"); + printf(" -k add PEF oK rules, if PEF enable\n"); + printf(" -l Enables BMC LAN only, not PEF\n"); + printf(" -o disable Only SOL\n"); + printf(" -p password to set \n"); + printf(" -q/-# User number of LAN username_to_set\n"); + printf(" -r Read-only BMC LAN & PEF settings\n"); + printf(" -s Show some Serial settings also \n"); + printf(" -t Test if BMC LAN is already configured\n"); + printf(" -u username to set \n"); + printf(" -v access priVilege: 4=Admin,3=Operator,2=User\n"); + printf(" -w set Grat ARP Interval to specified # seconds\n"); + printf(" -x Show eXtra debug messages\n"); + printf(" -y OEM LAN Failover (1=enable,0=disable if Intel)\n"); + printf(" -z Show IPMI LAN statistics\n"); + printf(" -B Baud for SerialOverLan (19.2K,115.2K,...)\n"); + printf(" -D Use DHCP instead of static IP (-I for server)\n"); + printf(" -K (Kontron) IPMI hostname to set\n"); + printf(" -Q VLAN Priority (default =0)\n"); + printf(" -O Force LAN security: no null user, cipher 0 off\n"); + print_lan_opt_usage(0); + ret = ERR_USAGE; + goto do_exit; + } /*end switch*/ + nopts++; + } /*end while*/ + + if ((freadonly == FLAG_INIT) && (j > 0)) { + /* got some options implying set, but no -e -l -d option specified. */ + foptmsg = 1; /*show warning message later*/ + freadonly = 1; /*assume read only*/ + } + fipmilan = is_remote(); + if (fipmilan && !fprivset) + parse_lan_options('V',"4",0); /*even if freadonly request admin*/ + if ((fsetarp == 0) && ostype == OS_WINDOWS) + arp_ctl = 0x03; /*grat arp & arp resp enabled */ + + ret = GetDeviceID( &LanRecord); + if (ret != 0) { + goto do_exit; + } else { /* success */ + uchar ipmi_maj, ipmi_min; + ipmi_maj = LanRecord.data[4] & 0x0f; + ipmi_min = LanRecord.data[4] >> 4; + show_devid( LanRecord.data[2], LanRecord.data[3], ipmi_maj, ipmi_min); + if (ipmi_maj == 0) fIPMI10 = 1; + else if (ipmi_maj == 1 && ipmi_min < 5) fIPMI10 = 1; + else fIPMI10 = 0; /* >= IPMI 1.5 is ok */ + if (ipmi_maj >= 2) fIPMI20 = 1; + if (fIPMI20) show_users = 5; + else show_users = 3; + if (fIPMI10) { + printf("This IPMI v%d.%d system does not support PEF records.\n", + ipmi_maj,ipmi_min); + /* Wont handle PEF, but continue and look for BMC LAN anyway */ + // fIPMI10 = 1; + // ipmi_close_(); + // exit(1); + } + prod_id = LanRecord.data[9] + (LanRecord.data[10] << 8); + vend_id = LanRecord.data[6] + (LanRecord.data[7] << 8) + + (LanRecord.data[8] << 16); + /* check Device ID response for Manufacturer ID = 0x0322 (NSC) */ + if (vend_id == VENDOR_NSC) { /* NSC = 0x000322 */ + fmBMC = 1; /*NSC miniBMC*/ + if (pefnum == 12) pefnum = 10; /* change CritStop pefnum to 0x0a */ + pefdesc = &pefdesc2[0]; /*mini-BMC PEF*/ + pefmax = 30; + fsharedMAC = 1; /* shared MAC with OS */ + } else if (vend_id == VENDOR_LMC) { /* LMC (on SuperMicro) = 0x000878 */ + pefdesc = NULL; /* unknown, see PefDesc() */ + if (pefnum == 12) pefnum = 15; /* change CritStop pefnum */ + pefmax = 16; + fsharedMAC = 0; /* not-shared BMC LAN port */ + } else if (vend_id == VENDOR_INTEL) { /* Intel = 0x000157 */ + pefdesc = &pefdesc1[0]; /*default Intel PEF*/ + pefmax = 20; /*default Intel PEF*/ + switch(prod_id) { + case 0x4311: /* Intel NSI2U w SE7520JR23 */ + fmBMC = 1; /* Intel miniBMC*/ + if (pefnum == 12) pefnum = 14; /* change CritStop pefnum */ + pefdesc = &pefdesc2[0]; /*mini-BMC PEF*/ + pefmax = 30; + fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ + break; + case 0x0022: /* Intel TIGI2U w SE7520JR23 +IMM*/ + fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ + gcm_ch = 3; /* IMM GCM port, dedicated MAC */ + show_users = 4; + break; + case 0x000C: /*TSRLT2*/ + case 0x001B: /*TIGPR2U*/ + /* fmBMC=0; Intel Sahalee BMC*/ + fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */ + break; + case 0x0026: /*S5000 Bridgeport*/ + case 0x0028: /*S5000PAL Alcolu*/ + case 0x0029: /*S5000PSL StarLake*/ + case 0x0811: /*S5000PHB TIGW1U */ + /* fmBMC=0; Intel Sahalee ESB2 BMC*/ + fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ + gcm_ch = 3; + parm7 = &iparm7[0]; /*TTL=30*/ + break; + case 0x003E: /*NSN2U or CG2100 Urbanna*/ + fiBMC = 1; /* Intel iBMC */ + fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ + // gcm_ch = 3; + parm7 = &iparm7[0]; /*TTL=30*/ + if (fsetarp == 0) + arp_ctl = 0x02; /*grat arp disabled, arp resp enabled */ + arp_interval = 0x00; /*0 sec, since grat arp disabled */ + sol_accum[0] = 0x0c; /*Intel defaults*/ + sol_accum[1] = 0x60; /*Intel defaults*/ + sol_retry[0] = 0x07; /*Intel defaults*/ + sol_retry[1] = 0x32; /*Intel defaults*/ + set_max_kcs_loops(URNLOOPS); /*longer for SetLan cmds (default 300)*/ + break; + case 0x0107: /* Intel Caneland*/ + fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ + gcm_ch = 3; + break; + case 0x0100: /*Tiger2 ia64*/ + /* for ia64 set chan_pefon, chan_pefoff accordingly*/ + chan_pefon = CHAN_ACC_PEFON64; + chan_pefoff = CHAN_ACC_PEFOFF64; + /* fall through */ + default: /* else other Intel */ + /* fmBMC = 0; * Intel Sahalee BMC*/ + if (fIPMI20) fsharedMAC = 0; /* recent, not-shared BMC MAC */ + else fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */ + break; + } /*end switch*/ + if (is_romley(vend_id,prod_id)) fRomley = 1; + if (is_grantley(vend_id,prod_id)) fGrantley = 1; + if (fRomley) { + fiBMC = 1; /* Intel iBMC */ + fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */ + set_max_kcs_loops(URNLOOPS); /*longer for SetLan (default 300)*/ + fipv6 = 1; + if (fsetarp == 0) arp_ctl = 0x03; /*default to both for Romley*/ + } + } else { /* else other vendors */ + if (fIPMI20) fsharedMAC = 0; /* recent, not-shared BMC MAC */ + else fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */ + pefdesc = NULL; /* unknown, see PefDesc() */ + if (pefnum == 12) pefnum = 15; /* change CritStop pefnum to 15? */ + pefmax = 20; + if (!fUserPefNum) fAdjustPefNum = 1; + } + if (fmBMC) show_users = 1; /* mBMC doesn't support more than 1 user */ + } + + if (fshowchan) { + ret = show_channels(); + exit(ret); + } + + ret = GetPefCapabilities(&bset); + if ((ret == 0) && (bset <= MAXPEF)) pefmax = bset; + + /* Get the BMC LAN channel & match it to an OS eth if. */ + i = GetBmcEthDevice(lan_ch_parm,&lan_ch); + if (i == -2) { /* no lan channels found (see lan_ch) */ + if (lan_ch_parm == PARM_INIT) + printf("This system does not support IPMI LAN channels.\n"); + else /*specified a LAN channel*/ + printf("BMC channel %d does not support IPMI LAN.\n",lan_ch_parm); + ret = LAN_ERR_NOTSUPPORT; + goto do_exit; + } else if (i < 0) { /* mac not found, use platform defaults */ + i = 0; /* default to eth0, lan_ch set already. */ + if (vend_id == VENDOR_INTEL) { + if ((prod_id == 0x001B) || (prod_id == 0x000c)) { + /* Intel TIGPR2U or TSRLT2 defaults are special */ + if (lan_ch_parm == 6) + { i = 0; lan_ch = 6; } + else { i = 1; lan_ch = 7; } + ser_ch = 1; + } + } + } + if ((i == gcm_ch) && (gcm_ch != PARM_INIT) && (lan_ch_parm == PARM_INIT)) { + /* Has a GCM, defaulted to it, and user didn't specify -L */ + /* Need this to avoid picking channel 3, the IMM/RMM GCM channel. */ + lan_ch = 1; /*default BMC LAN channel*/ + // i = 0; /*default eth0 (was eth1) */ + } + if (fsetifn == 0) { /*not user specified, use the detected one*/ + // if (lan_ch == gcm_ch) strcpy(ifname,"gcm"); + sprintf(ifname,"%s%d",ifpattn,i); /*eth%d*/ + } + if (fdebug) printf("lan_ch = %d, ifname = %s\n",lan_ch,ifname); + + /* set the lan_user appropriately */ + if (myuser == NULL) { /* if no -u param */ + if (ipmi_reserved_user(vend_id, 1)) lan_user = 2; + else if (flansecure) lan_user = 2; + else lan_user = 1; /*use default null user */ + } else if (usernum != 0) lan_user = usernum; /*use -q specified usernum*/ + /* else use default lan_user (=2) if -u and not -q */ + + if (ftestonly) { /*test only if BMC LAN is configured or not */ + /* TODO: test gcm also, if present */ + ret = GetLanEntry(4, 0, &LanRecord); /*ip addr src*/ + if (ret == 0) { + if ((LanRecord.data[0] == SRC_BIOS) || + (LanRecord.data[0] == SRC_DHCP)) ret = 0; /* DHCP, so ok */ + else { /*static IP*/ + ret = GetLanEntry(3, 0, &LanRecord); /* ip address */ + if (ret == 0) { + if (!IpIsValid(LanRecord.data)) { + printf("invalid BMC IP address\n"); + ret = 1; /* invalid ip */ + } else ret = GetLanEntry(12, 0, &LanRecord); /*gateway ip*/ + if (ret == 0) { + if (!IpIsValid(LanRecord.data)) { + printf("invalid gateway ip\n"); + ret = 2; /*invalid gwy ip*/ + } else ret = GetLanEntry(13, 0, &LanRecord); + if (ret == 0) { + if (!MacIsValid(&LanRecord.data[0])) { + printf("invalid gateway mac\n"); + ret = 3; /*invalid gwy mac */ + } + } + } + } + } + } /*endif GetLanEntry ok*/ + if (ret == 0) printf("BMC LAN already configured\n"); + else printf("BMC LAN not configured\n"); + goto do_exit; + } /*endif ftestonly*/ + + memset(SessInfo,0,sizeof(SessInfo)); + ret = GetSessionInfo(SessInfo,sizeof(SessInfo)); + // rlen = sizeof(SessInfo)); ret = get_session_info(0,0,SessInfo,&rlen); + if (fdebug) printf("GetSessionInfo ret=%d, data: %02x %02x %02x %02x \n", + ret,SessInfo[0],SessInfo[1],SessInfo[2],SessInfo[3]); + if (!freadonly && fipmilan) { /* setting LAN params, and using IPMI LAN */ + if (SessInfo[2] > 1) { /* another session is active also */ + printf("Another session is also active, cannot change IPMI LAN settings now.\n"); + ret = ERR_NOT_ALLOWED; + goto do_exit; + } + } + + if (!fIPMI10) { + if (fcanonical) + { /* canonical/simple output */ + ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord); + if (ret != 0) ndest = 0; + else { /*success*/ + j = LanRecord.data[0]; + mystr[0] = 0; + if (j == 0) strcat(mystr,"none "); + else { + if (j & 0x01) strcat(mystr,"PEFenable "); + if (j & 0x02) strcat(mystr,"DoEventMsgs "); + if (j & 0x04) strcat(mystr,"Delay "); + if (j & 0x08) strcat(mystr,"AlertDelay "); + } + printf("PEF Control %s%c %s\n",pspace4,bdelim,mystr); + } + } else { /* normal/full output */ + ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord); + if (ret == 0 && (LanRecord.data[0] != 0)) { + fpefok = 1; + bmcpefctl = LanRecord.data[0]; + } else { /* skip PEF rules/params if disabled */ + printf("PEF Control %s%c %s\n",pspace4,bdelim,"none "); + ndest = 0; + fpefok = 0; + } + + if (fpefok) { + printf("%s, GetPefEntry ...\n",progname); + for (idx = 1; idx <= pefmax; idx++) + { + ret = GetPefEntry( 0x06, (ushort)idx, &PefRecord); + if (ret == 0) { // Show the PEF record + pc = (uchar *)&PefRecord; + sz = 21; // sizeof(PEF_RECORD) = 21 + if (PefRecord.sensor_type == 0) { + if (idx <= pefnum) + printf("PEFilter(%02d): empty\n",idx); + memcpy(pef_array[idx-1], &PefRecord, sz); + if (fAdjustPefNum) pefnum = (char)idx; + } else { + memcpy(pef_array[idx-1], &PefRecord, sz); + if (PefRecord.fconfig & 0x80) pb = "enabled"; + else pb = "disabled"; + i = PefRecord.rec_id; + switch(PefRecord.action) { + case 0x01: pa = "alert"; break; + case 0x02: pa = "poweroff"; break; + case 0x04: pa = "reset"; break; + case 0x08: pa = "powercycle"; break; + case 0x10: pa = "OEMaction"; break; + case 0x20: pa = "NMI"; break; + default: pa = "no action"; + } + printf("PEFilter(%02d): %02x %s event - %s for %s\n", + idx, PefRecord.sensor_type, + PefDesc(i,PefRecord.sensor_type), pb,pa); + } + if (fdebug) { /* show raw PEFilter record */ + pc = &PefRecord.rec_id; + printf("raw PEF(%.2d): ",pc[0]); + for (i = 0; i < sz; i++) printf("%02x ",pc[i]); + printf("\n"); + } + } else { + printf("GetPefEntry(%d), ret = %d\n",idx,ret); + if (ret == 0xC1) { /*PEF is not supported, so skip the rest. */ + fpefok = 0; + ndest = 0; /* if no PEF, no alerts & no alert dest */ + break; + } + } + } + } /*endif fpefok*/ + if (fpefok) { + if (fdebug) ShowPef(); + ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord); + if (ret == 0) { + j = LanRecord.data[0]; + mystr[0] = 0; + if (j & 0x01) strcat(mystr,"PEFenable "); + if (j & 0x02) strcat(mystr,"DoEventMsgs "); + if (j & 0x04) strcat(mystr,"Delay "); + if (j & 0x08) strcat(mystr,"AlertDelay "); + printf("PEF Control: %02x : %s\n",j, mystr); + } + ret = GetPefEntry(0x02, 0,(PEF_RECORD *)&LanRecord); + if (ret == 0) { + j = LanRecord.data[0]; + mystr[0] = 0; + if (j & 0x01) strcat(mystr,"Alert "); + if (j & 0x02) strcat(mystr,"PwrDn "); + if (j & 0x04) strcat(mystr,"Reset "); + if (j & 0x08) strcat(mystr,"PwrCyc "); + if (j & 0x10) strcat(mystr,"OEM "); + if (j & 0x20) strcat(mystr,"DiagInt "); + printf("PEF Actions: %02x : %s\n",j, mystr); + } + ret = GetPefEntry(0x03, 0,(PEF_RECORD *)&LanRecord); + if (ret == 0) printf("PEF Startup Delay: %02x : %d sec\n", + LanRecord.data[0],LanRecord.data[0]); + if (!fmBMC) { + ret = GetPefEntry(0x04, 0,(PEF_RECORD *)&LanRecord); + if (ret == 0) printf("PEF Alert Startup Delay: %02x: %d sec\n", + LanRecord.data[0],LanRecord.data[0]); + /* fmBMC gets cc=0x80 here */ + } + /* note that ndest should be read from lan param 17 below. */ + for (i = 1; i <= ndest; i++) + { + ret = GetPefEntry(0x09, (ushort)i,(PEF_RECORD *)&LanRecord); + if (ret == 0) { + mystr[0] = 0; + j = LanRecord.data[2]; + if (LanRecord.data[1] & 0x08) { + sprintf(mystr,"Chan[%d] Dest[%d] ",((j & 0xf0) >> 4),(j & 0x0f)); + strcat(mystr,"Enabled "); + } else strcpy(mystr,"Disabled "); + printf("PEF Alert Policy[%d]: %02x %02x %02x %02x : %s\n",i, + LanRecord.data[0], LanRecord.data[1], + LanRecord.data[2], LanRecord.data[3],mystr); + } + } /*endfor ndest*/ + } /*endif fpefok*/ + } /*endif not canonical*/ + + if (fpefenable && !freadonly) { /* fenable or fdisable */ + if (fSetPEFOks) pefadd = 5; + else pefadd = 2; + sz = (pefnum - 1) + pefadd + fCustomPEF; + printf("\n%s, SetPefEntry(1-%d) ...\n",progname,sz); + if (fdebug) printf("pefnum = %d, pefmax = %d\n",pefnum,pefmax); + for (idx = 1; idx <= pefmax; idx++) + { + // Set & Enable all PEF records + memset(&PefRecord.rec_id,0,sizeof(PEF_RECORD)); + PefRecord.rec_id = (uchar)idx; /* next record, or user-specified */ + if (idx < pefnum) { /* pefnum defaults to 12.(0x0c) */ + if (pef_array[idx-1][7] == 0) /*empty pef record, set to default*/ + memcpy(&PefRecord.rec_id,pef_defaults[idx-1],sizeof(PEF_RECORD)); + else { /* set config however it was previously */ + memcpy(&PefRecord.rec_id,pef_array[idx-1],sizeof(PEF_RECORD)); + if (PefRecord.severity == 0) + PefRecord.severity = pef_defaults[idx-1][4]; + } + } else if ((idx == pefnum) && /* new OS Crit Stop entry */ + (PefRecord.sensor_type == 0)) { + // Set PEF values for 0x20, OS Critical Stop event + PefRecord.severity = PEF_SEV_CRIT; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x20; /* OS Critical Stop */ + PefRecord.sensor_no = 0xff; + PefRecord.event_trigger = 0x6f; + PefRecord.data1 = 0xff; + PefRecord.mask1 = 0x00; + } else if ((idx == pefnum+1) && /* new Power Redundancy entry */ + (PefRecord.sensor_type == 0)) { + // Set PEF values for 0x09/0x02/0x0b/0x41, Power Redundancy Lost + PefRecord.severity = PEF_SEV_WARN; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x09; /* Power Unit */ + PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ + PefRecord.event_trigger = 0x0b; /* event trigger */ + PefRecord.data1 = 0x02; /* 02 -> 41=Redundancy Lost */ + PefRecord.mask1 = 0x00; + } else if (fSetPEFOks && idx == (pefnum+2)) { + PefRecord.severity = PEF_SEV_OK; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x09; /* Power Unit, Redund OK */ + PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ + PefRecord.event_trigger = 0x0b; /* event trigger */ + PefRecord.data1 = 0x01; /* 01 -> 40=Redundancy OK */ + PefRecord.mask1 = 0x00; + } else if (fSetPEFOks && idx == (pefnum+3)) { + PefRecord.severity = PEF_SEV_OK; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x01; /* Temp OK */ + PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ + PefRecord.event_trigger = 0x81; /* event trigger */ + PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */ + PefRecord.mask1 = 0x0a; + } else if (fSetPEFOks && idx == (pefnum+4)) { + PefRecord.severity = PEF_SEV_OK; + PefRecord.genid1 = 0xff; + PefRecord.genid2 = 0xff; + PefRecord.sensor_type = 0x02; /* Voltage OK */ + PefRecord.sensor_no = 0xff; /* usu 01 or 02 */ + PefRecord.event_trigger = 0x81; /* event trigger */ + PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */ + PefRecord.mask1 = 0x0a; + } else if (fCustomPEF && idx == (pefnum+pefadd)) { + /* user entered 10 or 18 PEF entry bytes */ + PefRecord.action = custPEF[0]; + PefRecord.policy = custPEF[1]; + PefRecord.severity = custPEF[2]; + PefRecord.genid1 = custPEF[3]; + PefRecord.genid2 = custPEF[4]; + PefRecord.sensor_type = custPEF[5]; + PefRecord.sensor_no = custPEF[6]; + PefRecord.event_trigger = custPEF[7]; + PefRecord.data1 = custPEF[8]; + PefRecord.mask1 = custPEF[9]; + memcpy(&PefRecord.action,custPEF,18); + } else { + memcpy(&PefRecord.rec_id,pef_array[idx-1],sizeof(PEF_RECORD)); + if (PefRecord.sensor_type == 0) continue; /* if reserved, skip it */ + } + if (fdebug && (PefRecord.rec_id != idx)) { + /* memcpy from pef_defaults or pef_array clobbered rec_id */ + printf("Warning: SetPef idx=%d, rec_id=%d\n",idx,PefRecord.rec_id); + PefRecord.rec_id = (uchar)idx; /*fix it*/ + } + if (fdisable) { + /* Disable all PEF rules */ + if (idx >= pefnum) PefRecord.fconfig = 0x00; /*disabled, software*/ + else PefRecord.fconfig = 0x40; /*disabled, preset */ + PefRecord.action = 0x00; + PefRecord.policy = 0x00; + } else { /*fenable*/ + if (PefRecord.sensor_type != 0) { /* not an empty PEF entry */ + /* Enable all non-empty PEF rules */ + if (fCustomPEF && (idx == (pefnum+pefadd))) { + PefRecord.action = custPEF[0]; + PefRecord.policy = custPEF[1]; + } else { + PefRecord.action = 0x01; /*Alert*/ + PefRecord.policy = 0x01; /*see Alert Policy #1*/ + } + if (idx < pefnum) { /* special handling for presets, 1 thru 11 */ + PefRecord.fconfig = 0x80; /* enabled, software */ + ret = SetPefEntry(&PefRecord); + if (fdebug) + printf("SetPefEntry(%d/80) ret=%d\n",PefRecord.rec_id,ret); + // if (ret != 0) { nerrs++; lasterr = ret; } + // else ngood++; + PefRecord.fconfig = 0xC0; /* enabled, preset */ + } else { + PefRecord.fconfig = 0x80; /* enabled, software */ + } + } /*endif not empty*/ + } + { // Show the new PEF record before setting it. + pc = (uchar *)&PefRecord; + sz = 21; + printf("PEFilter(%d): ",PefRecord.rec_id); + for (i = 0; i < sz; i++) printf("%02x ",pc[i]); + printf("\n"); + } + ret = SetPefEntry(&PefRecord); + if (fdebug) + printf("SetPefEntry(%d) ret = %d\n", PefRecord.rec_id,ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } /*end for*/ + } + } /*end if not fIPMI10*/ + + if (!fcanonical) + printf("\n%s, GetLanEntry for channel %d ...\n",progname,lan_ch); + idest = 1; + for (idx = 0; idx < NLAN; idx++) + { + int ival; + if (fcanonical && (canon_param[idx] == 0)) continue; + if (idx == 8 || idx == 9) continue; /* not implemented */ + ival = lanparams[idx].cmd; + if (ival >= 96 && ival <= 98) continue; /* not implemented */ + if (ival >= 102 && ival <= 108) { /*custom IPv6 parameters*/ + if (fipv6 == 0) continue; /*skip these*/ + } + if (ival == 194 && vend_id == VENDOR_KONTRON) { /*oem hostname parm*/ + lanparams[idx].sz = 36; + strcpy(lanparams[idx].desc,"IPMI Hostname"); + } else if (ival >= 192 && ival <= 194) { /*custom DHCP parameters*/ + if (vend_id != VENDOR_INTEL) continue; + if (fmBMC || fiBMC || fcanonical) continue; /*skip these*/ + } + if (ival >= 20 && ival <= 25) { + if (!fIPMI20) continue; /*VLAN params 20-25, fIPMI20 only/opt*/ + } + if ((ndest == 0) && (ival >= 18 && ival <= 19)) continue; /*skip dest*/ + if (ival == 11) { /*grat arp interval*/ + if (vend_id == VENDOR_SUPERMICROX) continue; + if (vend_id == VENDOR_SUPERMICRO) continue; + } + if (ival == 14 || ival == 15) { /*secondary gateway is optional*/ + if (vend_id == VENDOR_KONTRON) continue; + } + if (ival == 201) { /*Get Channel Access*/ + ret = ShowChanAcc(lan_ch); + } else { + if (ival == 18 || ival == 19) { /*dest params*/ + if (ndest == 0) continue; /*skip if ndest==0 */ + bset = (uchar)idest; /* dest id = 1 thru n */ + } else bset = 0; + ret = GetLanEntry((uchar)ival, bset, &LanRecord); + } + if (ret == 0) { // Show the LAN record + pc = (uchar *)&LanRecord; + sz = lanparams[idx].sz; + if (ival == 18) { /*skip if invalid dest type param*/ + if ((idest > 1) && (pc[2] == 0)) { idest = 1; continue; } + } else if (ival == 19) { /*skip if invalid dest addr param*/ + if ((idest > 1) && !IpIsValid(&pc[3])) { idest = 1; continue; } + } + if (ival == 201) ; /* did it above */ + else { + if (fcanonical) { + if ((ival == 19) && (idest > 1)) ; /*skip it*/ + else { + j = strlen_(lanparams[idx].desc); + // (ival < 7) || (ival == 19) || ival == 102) + if (j <= 12) pstr = pspace3; + else pstr = pspace2; + printf("Channel %d %s %s%c ",lan_ch, + lanparams[idx].desc,pstr,bdelim); + } + } else + printf("Lan Param(%d) %s: ",ival,lanparams[idx].desc); + } + if (ival == 1) { + authmask = pc[0]; /* auth type support mask */ + /* if (fmBMC) authmask is usually 0x15, else 0x14 */ + } else if (ival == 3) { + if (IpIsValid(pc)) memcpy(bmcmyip,pc,4); + } else if (ival == 5) { + if (MacIsValid(pc)) memcpy(bmcmymac,pc,MAC_LEN); + } else if (ival == 6) { + if (SubnetIsValid(pc)) memcpy(bmcsubnet,pc,4); + /* else if invalid, leave default as 255.255.255.0 */ + //} else if (ival == 7) { + // if (pc[0] >= 30) memcpy(bparm7,pc,3); + } else if (ival == 17) { /* num dest */ + ndest = pc[0]; /* save the number of destinations */ + } else if (ival == 12) { /* gateway addr */ + if (IpIsValid(pc)) memcpy(bmcgwyip,pc,4); + } else if (ival == 13) { /* gateway mac */ + if (MacIsValid(pc)) memcpy(bmcgwymac,pc,MAC_LEN); + } else if (ival == 19) { /* dest addr */ + if (IpIsValid(&pc[3])) memcpy(bmcdestip,&pc[3],4); + if (MacIsValid(&pc[7])) memcpy(bmcdestmac,&pc[7],MAC_LEN); + } else if (ival == 22) { /*Cipher Suite Support*/ + nciphers = pc[0]; + } + /* now start to display data */ + if (ival == 16) { printf("%s \n",pc); /* string */ + } else if (ival == 194 && vend_id == VENDOR_KONTRON) { + printf("%s \n",pc); /* string */ + } else if (ival == 201) { ; /* did it above */ + } else { /* print results for all other ival's */ + pstr = ""; /*interpreted meaning*/ + if (fcanonical) { + switch(ival) { + case 4: /*param 4, ip src*/ + if (pc[0] == SRC_STATIC) pstr = "Static"; /*0x01*/ + else if (pc[0] == SRC_DHCP) pstr = "DHCP"; /*0x02*/ + else if (pc[0] == SRC_BIOS) pstr = "BIOS"; /*0x03*/ + else pstr = "Other"; + printf("%s\n",pstr); + break; + case 5: /*param 5, mac addr*/ + case 13: /*param 6, def gwy mac*/ + printf("%02x:%02x:%02x:%02x:%02x:%02x\n", + pc[0], pc[1], pc[2], pc[3], pc[4], pc[5]); + break; + case 3: /*param 4, ip address*/ + case 6: /*param 6, subnet mask*/ + case 12: /*param 12, def gwy ip*/ + case 14: /*param 14, sec gwy ip*/ + case 192: /*param 192, DHCP svr ip*/ + printf("%d.%d.%d.%d\n",pc[0], pc[1], pc[2], pc[3]); + break; + case 19: /*param 19, dest address*/ + if (idest == 1) { + printf("IP=%d.%d.%d.%d " + "MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", + pc[3], pc[4], pc[5], pc[6], + pc[7], pc[8], pc[9], pc[10], pc[11], pc[12]); + } + break; + case 102: /*param 102, IPv6 enable*/ + if (pc[0] == 0x01) printf("enabled\n"); + else printf("disabled\n"); + break; + default: + printf("%02x \n",pc[0]); + break; + } + } else { /*not canonical */ + if (ival == 3 || ival == 6 || ival == 12 || ival == 14 + || ival == 192) { + printf("%d.%d.%d.%d",pc[0], pc[1], pc[2], pc[3]); + } else if (ival == 23) { /*Cipher Suites*/ + for (i = 1; i <= nciphers; i++) { + if (pc[i] == 0) ncipher0 = pc[i]; + printf("%2d ",pc[i]); + } + } else if (ival == 24) { /*Cipher Suite Privi Levels*/ + j = 0; + for (i = 1; i < 9; i++) { + char c1, c2; + char *p; + p = parse_priv((pc[i] & 0x0f)); + c1 = p[0]; + p = parse_priv((pc[i] & 0xf0) >> 4); + c2 = p[0]; + rgciphers[j++] = (pc[i] & 0x0f); + rgciphers[j++] = ((pc[i] & 0xf0) >> 4); + if ((i*2) >= nciphers) c2 = ' '; + printf(" %c %c ",c1,c2); + if ((i*2) > nciphers) break; + } +} else + for (i = 0; i < sz; i++) +{ + /* print in hex, decimal, or string, based on ival */ + if (ival == 1) { /* Auth type support */ + pstr = &mystr[0]; + getauthstr(authmask,pstr); + printf("%02x ",authmask); + } else if (ival == 4) { /* IP addr source */ + if (pc[i] == SRC_STATIC) pstr = "Static"; /*0x01*/ + else if (pc[i] == SRC_DHCP) pstr = "DHCP"; /*0x02*/ + else if (pc[i] == SRC_BIOS) pstr = "BIOS"; /*0x03*/ + else pstr = "Other"; + printf("%02x ",pc[i]); + } else if (ival == 10) { /* grat ARP */ + mystr[0] = 0; + if (pc[i] == 0) strcat(mystr,"ARP disabled "); + else if (pc[i] & 0x01) strcat(mystr,"Grat-ARP enabled"); + else strcat(mystr,"Grat-ARP disabled"); + if (pc[i] & 0x02) strcat(mystr,", ARP-resp enabled"); + pstr = &mystr[0]; + printf("%02x ",pc[i]); + } else if (ival == 11) { /* grat ARP interval */ + float f; + f = (float)pc[i] / (float)2; /*500msec increments*/ + sprintf(mystr,"%.1f sec",f); + pstr = &mystr[0]; + printf("%02x ",pc[i]); + } else if (ival == 19) { /* dest addr */ + if (i > 2 && i < 7) { + char *sepstr; + if (i == 3) printf("["); + if (i == 6) sepstr = "] "; + else if (i >=3 && i < 6) sepstr = "."; + else sepstr = " "; + printf("%d%s",pc[i],sepstr); /* IP address in dec */ + } + else printf("%02x ",pc[i]); /* show mac/etc. in hex */ + } + else printf("%02x ",pc[i]); /* show in hex */ + } /*end for*/ +if (ival == 2) { /*Auth type enables*/ + pstr = &mystr[0]; + i = 0; + if (lan_ch > 0) i = lan_ch - 1; + getauthstr(pc[i],pstr); +} + if (pstr[0] != 0) printf(": %s\n",pstr); + else printf("\n"); + } /*end-else not canonical*/ + } /*end-else others*/ + if (ival == 18 || ival == 19) { +if (idest < ndest) { + idest++; + idx--; /* repeat this param*/ +} else idest = 1; + } + } else { /* ret != 0 */ + if (ival >= 20 && ival <= 25) { /*if errors, optional*/ + if (fdebug) printf("GetLanEntry(%d), ret = %d\n",ival,ret); + } else + printf("GetLanEntry(%d), ret = %d\n",ival,ret); + if (ival == 17) ndest = 0; /*error getting num dest*/ + } + } /*end for*/ + if (fRomley || fGrantley) { /*get LAN Failover param*/ + uchar b; + ret = lan_failover_intel(0xFF,(uchar *)&b); + if (ret != 0) + printf("Intel Lan Failover, ret = %d\n",ret); + else { + if (b == 1) pstr = "enabled"; + else pstr = "disabled"; + if (fcanonical) + printf("Intel Lan Failover %s%c %s\n", + pspace3, bdelim,pstr); + else printf("Intel Lan Failover %s%c %02x %c %s\n", + pspace2, bdelim,b,bdelim,pstr); + } + } + if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) { + ret = oem_supermicro_get_lan_port(&bset); + if (ret == 0) { + pstr = oem_supermicro_lan_port_string(bset); + if (fcanonical) + printf("SuperMicro Lan Interface %s%c %s\n", + pspace2, bdelim,pstr); + else printf("SuperMicro Lan Interface %c %02x %c %s\n", + bdelim,bset,bdelim,pstr); + } else { + if (fdebug) printf("oem_supermicro_get_lan_port error %d\n",ret); + ret = 0; /*may not be supported on all smc plaforms*/ + } + } + // if (fmBMC) lan_access = 0x04; /*Admin*/ + // else lan_access = 0x04; /*Admin*/ + if (!fIPMI10) { /* Get SOL params */ + ret = GetSerialOverLan(lan_ch,0,0); + if (ret != 0) printf("GetSOL error %d\n",ret); + } + for (i = 1; i <= show_users; i++) + GetUser((uchar)i,lan_ch); + + if (fgetser && !fcanonical) { + printf("\n%s, GetSerEntry ...\n",progname); + if (fmBMC) /* mBMC doesn't support serial */ + printf("No serial channel support on this platform\n"); + else + for (idx = 0; idx < NSER; idx++) { + int ival; + // if (idx == 9) continue; /* not implemented */ + ival = serparams[idx].cmd; + if (ival == 201) { + ret = GetChanAcc(ser_ch, 0x40, &LanRecord); + } else { + ret = GetSerEntry((uchar)ival, &LanRecord); + } + if (ret == 0) { // Show the SER record + pc = (uchar *)&LanRecord; + sz = serparams[idx].sz; + printf("Serial Param(%d) %s: ",ival,serparams[idx].desc); + if (idx == 10) { /* modem init string */ + pc[sz] = 0; + printf("%02x %s\n",pc[0],&pc[1]); + } + else if ((idx >= 11 && idx <= 13) || idx == 15) { /* strings */ + printf("%s\n",pc); + } + else { + for (i = 0; i < sz; i++) { +printf("%02x ",pc[i]); /* show in hex */ +} + printf("\n"); + } /*end else*/ + } + } /*end for*/ + } /*endif fgetser*/ + + if (!freadonly) /* Set IPMI LAN enable/disable params. */ + { + if (fipmilan) /* Sets not valid via ipmi_lan if same channel. */ + printf("\nWarning: Setting LAN %d params while using a LAN channel.\n", lan_ch); + + { + if (fenable && (fsharedMAC==0) && !lan_dhcp) { + /* must have an IP from -I option */ + if (!IpIsValid(rgmyip)) { /* if not user-specified */ + if (IpIsValid(bmcmyip)) { + memcpy(rgmyip,bmcmyip,4); + if (fdebug) printf("Using current IP %d.%d.%d.%d\n", + bmcmyip[0], bmcmyip[1], + bmcmyip[2], bmcmyip[3]); + } else { + printf("\nNot shared BMC LAN, must specify a unique " + "IP address via -I\n"); + ret = ERR_BAD_PARAM; + goto do_exit; + } + } + } + /* Set LAN parameters. fenable or fdisable */ + printf("\n%s, SetLanEntry for channel %d ...\n",progname,lan_ch); + /* use ifname to resolve MAC addresses below */ + if (fdisable) { + if (!fIPMI10) { + ret = DisablePef(alertnum); + printf("DisablePef, ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } +else ngood++; + } + if (lan_user != 0) { + j = DisableUser(lan_user,lan_ch); /*disable this lan user*/ + printf("DisableUser(%d), ret = %d\n",lan_user,j); + if (j != 0) { nerrs++; lasterr = j; } + else ngood++; + } + LanRecord.data[0] = 0x01; /* static IP address source */ + ret = SetLanEntry(4, &LanRecord, 1); + printf("SetLanEntry(4), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + /* clear the BMC IP address */ + memset(&LanRecord,0,4); + ret = SetLanEntry(3, &LanRecord, 4); + printf("SetLanEntry(3), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + /* clear the gateway IP address */ + memset(&LanRecord,0,4); + ret = SetLanEntry(12, &LanRecord, 4); + printf("SetLanEntry(12), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + /* clear the gateway MAC address */ + memset(&LanRecord,0,6); + ret = SetLanEntry(13, &LanRecord, 6); + printf("SetLanEntry(13), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } else if (fdisableSOL) { + ret = SetupSerialOverLan(0); /*disable*/ + SELprintf("SetupSerialOverLan: ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } else { /*fenable*/ + uchar chanctl; + if (bmcpefctl != 0) chanctl = chan_pefon; /*previously on*/ + else chanctl = chan_pefoff; + ret = SetChanAcc(lan_ch, 0x80, chanctl); + if (fdebug) printf("SetChanAcc(lan/active), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + ret = SetChanAcc(lan_ch, 0x40, chanctl); + if (fdebug) printf("SetChanAcc(lan/nonvol), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + if (flansecure) { + j = DisableUser(0,lan_ch); /*disable the default null user*/ + printf("DisableUser(0), ret = %d\n",j); + } + ret = SetUser(lan_user,myuser,passwordData,lan_ch); + printf("SetUser(%d), ret = %d\n",lan_user,ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + if (fdisable && (vend_id == VENDOR_SUPERMICROX + || vend_id == VENDOR_SUPERMICRO) ) { + failover_enable = 0; /*dedicated*/ + ret = oem_supermicro_set_lan_port(failover_enable); + printf("Set SuperMicro Lan port to %s, ret = %d\n", + oem_supermicro_lan_port_string(failover_enable),ret); + if (ret != 0) { nerrs++; lasterr = ret; } + } + + if (fdisable || fdisableSOL) { +// if (nerrs > 0) printf("Warning: %d errors occurred\n",nerrs); + goto do_exit; + } + + if (authmask == 0) authmask = 0x17; /*if none from GetLanEntry(1)*/ + LanRecord.data[0] = (bAuth & authmask); /*Callback level*/ + LanRecord.data[1] = (bAuth & authmask); /*User level */ + LanRecord.data[2] = (bAuth & authmask); /*Operator level*/ + LanRecord.data[3] = (bAuth & authmask); /*Admin level */ + LanRecord.data[4] = 0; /*OEM level*/ + if (fdebug) printf("SetLanEntry(2): %02x %02x %02x %02x %02x\n", + LanRecord.data[0],LanRecord.data[1],LanRecord.data[2], + LanRecord.data[3],LanRecord.data[4]); + ret = SetLanEntry(2, &LanRecord, 5); + printf("SetLanEntry(2), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + + /* Get the values to use from Linux eth0, etc. */ + ret = Get_IPMac_Addr(); + if (lan_dhcp) { /* use DHCP */ + LanRecord.data[0] = SRC_DHCP; /* BMC running DHCP */ + /* = SRC_BIOS; * address source = BIOS using DHCP */ + ret = SetLanEntry(4, &LanRecord, 1); + printf("SetLanEntry(4), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + if (MacIsValid(rgmymac)) { + memcpy(&LanRecord,rgmymac,6); + ret = SetLanEntry(5, &LanRecord, 6); + if (ret == 0x82) { /*BMC may not allow the MAC to be set*/ + if (fdebug) + printf("SetLanEntry(5), ret = %x cannot modify MAC\n",ret); + } else { + printf("SetLanEntry(5), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + } + + /* DHCP also relates to OEM LAN params 192, 193, 194 */ + if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) + { /*DHCP params 192-194 are Intel only*/ + if (IpIsValid(rgmyip)) + { + /* Set DHCP Server IP in param 192 from -I param. */ + memcpy(&LanRecord,rgmyip,4); + ret = SetLanEntry(192, &LanRecord, 4); + printf("SetLanEntry(192), ret = %d\n",ret); + if (!MacIsValid(rgdhcpmac)) /* if MAC not set yet */ + ret = Get_Mac(rgmyip,rgdhcpmac,NULL); + if (ret == 0) { + memcpy(&LanRecord,rgdhcpmac,MAC_LEN); + ret = SetLanEntry(193, &LanRecord, MAC_LEN); + printf("SetLanEntry(193), ret = %d\n",ret); + } + } + LanRecord.data[0] = 0x01; /*enable DHCP*/ + ret = SetLanEntry(194, &LanRecord, 1); + printf("SetLanEntry(194), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + } else { /* use static IP */ + printf("LAN%d (%s)\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", +lan_ch,ifname, rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3], +rgmymac[0], rgmymac[1], rgmymac[2], rgmymac[3], +rgmymac[4], rgmymac[5]); + if (IpIsValid(rgmyip)) { + if (lan_ch != gcm_ch) { /*skip if gcm*/ + LanRecord.data[0] = 0x00; /*disable grat arp while setting IP*/ + ret = SetLanEntry(10, &LanRecord, 1); + if (fdebug) printf("SetLanEntry(10,0), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + } + LanRecord.data[0] = 0x01; /* static IP address source */ + ret = SetLanEntry(4, &LanRecord, 1); + printf("SetLanEntry(4), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + memcpy(&LanRecord,rgmyip,4); + ret = SetLanEntry(3, &LanRecord, 4); + printf("SetLanEntry(3), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + if (MacIsValid(rgmymac)) { + memcpy(&LanRecord,rgmymac,6); + ret = SetLanEntry(5, &LanRecord, 6); + if (ret == 0x82) { + + /* Do not show anything, not an error if BMC does not + allow the BMC MAC to be changed. */ + if (fdebug) + + printf("SetLanEntry(5), ret = %x cannot modify MAC\n",ret); + } else { + + printf("SetLanEntry(5), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + } + if (!SubnetIsValid(rgsubnet)) /* not specified, use previous */ + memcpy(rgsubnet,bmcsubnet,4); + memcpy(&LanRecord,rgsubnet,4); + ret = SetLanEntry(6, &LanRecord, 4); + printf("SetLanEntry(6), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + if (vend_id != VENDOR_PEPPERCON) { + /* may want to check bparm7 here */ + LanRecord.data[0] = parm7[0]; /*IPv4 header, TTL */ + LanRecord.data[1] = parm7[1]; /*IPv4 header, Flags */ + LanRecord.data[2] = parm7[2]; /*IPv4 hdr, Precedence/Service */ + ret = SetLanEntry(7, &LanRecord, 3); + printf("SetLanEntry(7), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + /* if lan_ch == 3, gcm gets error setting grat arp (ccode=0xCD) */ + if (lan_ch != gcm_ch) { /*skip if gcm*/ + /* 01=enable grat arp, 02=enable arp resp, 03=both */ + LanRecord.data[0] = arp_ctl; /*grat arp*/ + ret = SetLanEntry(10, &LanRecord, 1); + printf("SetLanEntry(10,%x), ret = %d\n",arp_ctl,ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + LanRecord.data[0] = arp_interval; /*grat arp interval*/ + ret = SetLanEntry(11, &LanRecord, 1); + printf("SetLanEntry(11), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) { + LanRecord.data[0] = 0x00; /*disable DHCP*/ + ret = SetLanEntry(194, &LanRecord, 1); + printf("SetLanEntry(194), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + } else { /* error, don't continue */ + printf("Missing IP Address, can't continue. Use -I to specify\n"); + ret = ERR_BAD_PARAM; + goto do_exit; + } + if (vend_id == VENDOR_KONTRON && rghostname[0] != 0) { + /* set the IPMI Hostname if specified */ + sz = strlen_(rghostname); + /* LanRecord is larger than rghostname, bounds ok */ + strncpy((char *)&LanRecord.data,rghostname,sz); + ret = SetLanEntry(194, &LanRecord, sz); + printf("SetLanEntry(194), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else { + LanRecord.data[0] = 0x31; + ret = SetLanEntry(195, &LanRecord, 1); /*re-read hostname*/ + // printf("SetLanEntry(195), ret = %d\n",ret); + // if (ret != 0) { nerrs++; lasterr = ret; } + } + } + if (IpIsValid(rggwyip)) { + if (!MacIsValid(rggwymac)) /* if gwy MAC not set by user */ + ret = Get_Mac(rggwyip,rggwymac,NULL); + printf("gateway \tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", + rggwyip[0], rggwyip[1], rggwyip[2], rggwyip[3], + rggwymac[0], rggwymac[1], rggwymac[2], rggwymac[3], + rggwymac[4], rggwymac[5]); + if (!SubnetIsSame(rgmyip,rggwyip,rgsubnet)) { + printf("WARNING: IP Address and Gateway are not on the same subnet," +" setting Gateway to previous value\n"); + memcpy(rggwyip,bmcgwyip,4); + memcpy(rggwymac,bmcgwymac,6); + } + + /* Set the Default Gateway IP & MAC */ + memcpy(&LanRecord,rggwyip,4); + ret = SetLanEntry(12, &LanRecord, 4); + printf("SetLanEntry(12), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + if (!MacIsValid(rggwymac)) { /* if gwy MAC not resolved */ + printf(" Warning: Gateway MAC address was not resolved! " + "Check %s interface, use -i ethN, or use -H gwymac.\n", + ifname); + memcpy(&LanRecord,bmcgwymac,6); + } else { + memcpy(&LanRecord,rggwymac,6); + } + ret = SetLanEntry(13, &LanRecord, 6); + printf("SetLanEntry(13), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + if (IpIsValid(rggwy2ip)) { + if (!MacIsValid(rggwy2mac)) /* if gwy2 MAC not set by user */ + ret = Get_Mac(rggwy2ip,rggwy2mac,NULL); + /* Set the Secondary Gateway IP & MAC */ + memcpy(&LanRecord,rggwy2ip,4); + ret = SetLanEntry(14, &LanRecord, 4); + printf("SetLanEntry(14), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + memcpy(&LanRecord,rggwy2mac,6); + ret = SetLanEntry(15, &LanRecord, 6); + printf("SetLanEntry(15), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + } /* end-else static IP */ + if (flansecure) { /* disable cipher 0 */ + char c1, c2; + memset(&LanRecord,0,12); + j = 1; + for (i = 0; i < nciphers; i+=2) { + c1 = rgciphers[i]; + c2 = rgciphers[i+1]; + /* 0x0f may be vendor-specific, 0x00 = Reserved/Unused */ + if (i == ncipher0) c1 = 0x00; + if ((i+1) == ncipher0) c2 = 0x00; + LanRecord.data[j++] = (c2 << 4) | c1; + } + ret = SetLanEntry(24, &LanRecord, 9); + printf("SetLanEntry(24) disable cipher0, ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + ret = SetupSerialOverLan(1); /*enable*/ + SELprintf("SetupSerialOverLan: ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + if (!IpIsValid(rgdestip) && IpIsValid(bmcdestip)) { + memcpy(rgdestip,bmcdestip,4); + if (fdebug) printf("Using current dest IP %d.%d.%d.%d\n", + bmcdestip[0], bmcdestip[1], + bmcdestip[2], bmcdestip[3]); + } + if (ndest == 0) { + if (fdebug) printf("ndest==0, anum=%d rgdestip=%d.%d.%d.%d\n", + alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3]); + printf("alert dest \tnot supported\n"); + } else if (!IpIsValid(rgdestip)) { + printf("alert dest \taddress not specified\n"); + } else { /* valid alert dest ip */ + if (!MacIsValid(rgdestmac)) /* if dest MAC not set by user */ + ret = Get_Mac(rgdestip,rgdestmac,NULL); /*try to resolve MAC */ + if (!MacIsValid(rgdestmac)) { /* if dest MAC not resolved */ + printf(" Warning: Alert mac address was not resolved!" + " Check %s interface or use -i.\n",ifname); + /* use existing BMC alert dest mac (as best guess) */ + memcpy(rgdestmac,bmcdestmac,6); + } + /* show destination data */ + printf("alert dest %d\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", + alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3], + rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3], + rgdestmac[4], rgdestmac[5]); + printf("snmp community \t%s\n",rgcommunity); + /* Only need the SNMP community if there is an Alert Destination */ + memset(&LanRecord.data[0], 0, 18); /* make sure zero-filled */ + strcpy((char *)&LanRecord.data[0],rgcommunity); + ret = SetLanEntry(16, &LanRecord, 18); + printf("SetLanEntry(16), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + /* Set Alert Destination Type */ + LanRecord.data[0] = alertnum; /* dest id = 1 */ + LanRecord.data[1] = 0x00; /* dest type = PET, no ack */ + LanRecord.data[2] = 0x01; /* ack timeout / retry interval */ + LanRecord.data[3] = 0x00; /* no retries */ + // LanRecord.data[4] = 0x69; + ret = SetLanEntry(18, &LanRecord, 4); + printf("SetLanEntry(18), ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + { + /* Set the Alert Destination IP & MAC (param 19) */ + LanRecord.data[0] = alertnum; /* dest id = 1 */ + LanRecord.data[1] = 0x00; + LanRecord.data[2] = 0x00; + memcpy(&LanRecord.data[3],rgdestip,4); + memcpy(&LanRecord.data[7],rgdestmac,6); + ret = SetLanEntry(19, &LanRecord, 13); + printf("SetLanEntry(19), ret = %d\n", ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + } /*endif valid alert*/ + + /* Now enable PEF since we have an Alert destination. */ + if (!fdisable && !fIPMI10 && fpefenable) { /*fpefenable*/ + ret = EnablePef(alertnum); + printf("EnablePef, ret = %d\n",ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + /* ChanAcc changed, so show it again */ + j = ShowChanAcc(lan_ch); + } + + if ((vlan_enable != PARM_INIT) && (fIPMI20)) { + if (vlan_enable == 0) { /*disable vlan*/ + LanRecord.data[0] = 0x00; + LanRecord.data[1] = 0x00; + ret = SetLanEntry(20, &LanRecord, 2); + printf("SetLanEntry(20,disable) ret = %d\n", ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } else { /*vlan_enable == 1, enable vlan with id */ + LanRecord.data[0] = (vlan_id & 0x00ff); + LanRecord.data[1] = ((vlan_id & 0x0f00) >> 8) | 0x80; + ret = SetLanEntry(20, &LanRecord, 2); + printf("SetLanEntry(20,%d), ret = %d\n", vlan_id,ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + LanRecord.data[0] = vlan_prio; + ret = SetLanEntry(21, &LanRecord, 1); + printf("SetLanEntry(21), ret = %d\n", ret); + if (ret != 0) { nerrs++; lasterr = ret; } + else ngood++; + } + } + if (failover_enable != PARM_INIT) { + if (fRomley || fGrantley) { + if (failover_enable > 1) failover_enable = 0; /*default*/ + ret = lan_failover_intel(failover_enable,(uchar *)&i); + printf("Set Intel Lan Failover (%d), ret = %d\n", + failover_enable,ret); + if (ret != 0) { nerrs++; lasterr = ret; } + } else if (vend_id == VENDOR_SUPERMICROX + || vend_id == VENDOR_SUPERMICRO) { + if (failover_enable > 2) failover_enable = 2; /*default*/ + ret = oem_supermicro_set_lan_port(failover_enable); + printf("Set SuperMicro Lan port to %s, ret = %d\n", + oem_supermicro_lan_port_string(failover_enable),ret); + if (ret != 0) { nerrs++; lasterr = ret; } + } + } /*endif failover specified*/ + } /*end-else not via ipmi_lan*/ + } /*endif not readonly*/ + + if (flanstats) + { /* get BMC LAN Statistics */ +#ifdef METACOMMAND + j = get_lan_stats(lan_ch); +#else + uchar idata[2]; + uchar rdata[20]; + int rlen; + uchar cc; + idata[0] = lan_ch; + idata[1] = 0x00; /*do not clear stats*/ + rlen = sizeof(rdata); + j = ipmi_cmd(GET_LAN_STATS, idata,2, rdata,&rlen, &cc, fdebug); + if (j == 0) { /*show BMC LAN stats*/ + ushort *rw; + rw = (ushort *)&rdata[0]; + printf("IPMI LAN channel %d statistics: \n",lan_ch); + printf(" \tReceived IP Packets = %d\n",rw[0]); + printf(" \tRecvd IP Header errors = %d\n",rw[1]); + printf(" \tRecvd IP Address errors = %d\n",rw[2]); + printf(" \tRecvd IP Fragments = %d\n",rw[3]); + printf(" \tTransmitted IP Packets = %d\n",rw[4]); + printf(" \tReceived UDP Packets = %d\n",rw[5]); + printf(" \tReceived Valid RMCP Pkts = %d\n",rw[6]); + printf(" \tReceived UDP Proxy Pkts = %d\n",rw[7]); + printf(" \tDropped UDP Proxy Pkts = %d\n",rw[8]); + } +#endif + } + +do_exit: + ipmi_close_(); + if (foptmsg) { + if (fset_ip != 0) + printf("WARNING: IP address options were specified, but no -e,-l,-d option.\n"); + else + printf("WARNING: %d options were specified, but no -e,-l,-d option.\n", +nopts); + printf("Read-only usage assumed.\n"); + } + if (nerrs > 0) { + printf("Warning: %d ok, %d errors occurred, last error = %d\n",ngood,nerrs,lasterr); + ret = lasterr; + } + // show_outcome(progname,ret); + return(ret); +} /* end main()*/ + +/* end ilan.c */ diff --git a/util/ipicmg.c b/util/ipicmg.c index b0f1a03..8019a3f 100644 --- a/util/ipicmg.c +++ b/util/ipicmg.c @@ -81,7 +81,7 @@ /* Global data */ static char * progname = "ipicmg"; -static char * progver = "3.02"; +static char * progver = "3.03"; static char fdebug = 0; static char fset_mc = 0; static uint8_t g_bus = PUBLIC_BUS; diff --git a/util/ipmiutil.c b/util/ipmiutil.c index 5fec907..26b156a 100644 --- a/util/ipmiutil.c +++ b/util/ipmiutil.c @@ -57,11 +57,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "ipmiutil.h" static char *progname = "ipmiutil"; -static char *progver = "3.02"; +static char *progver = "3.03"; // static char fdebug = 0; /*int ipmiutil(int argc, char **argv); */ -#define NSUBCMDS 28 +#define NSUBCMDS 29 static struct { int idx; char tag[16]; @@ -95,6 +95,7 @@ static struct { { 22, "sunoem", i_sunoem, "Sun OEM functions" }, { 23, "delloem",i_delloem, "Dell OEM functions" }, { 24, "tsol", i_tsol, "Tyan SOL console start/stop session" }, + { 28, "user", i_user, "list or modify IPMI LAN users" }, { 27, "wdt", i_wdt, "show/set/reset the watchdog timer" } }; diff --git a/util/ipmiutil.h b/util/ipmiutil.h index 39b5ecb..025727c 100644 --- a/util/ipmiutil.h +++ b/util/ipmiutil.h @@ -62,5 +62,6 @@ int i_ekanalyzer(int argc, char **argv); int i_tsol(int argc, char **argv); int i_dcmi(int argc, char **argv); int i_smcoem(int argc, char **argv); +int i_user(int argc, char **argv); #endif // IPMIUTIL_H_ diff --git a/util/ipmiutil.mak b/util/ipmiutil.mak index c3963a0..7595067 100644 --- a/util/ipmiutil.mak +++ b/util/ipmiutil.mak @@ -86,7 +86,7 @@ E_OBJ=$(TMP_D)\ipmiutil.obj \ $(TMP_D)\iekanalyzer.obj $(TMP_D)\ifru_picmg.obj \
$(TMP_D)\oem_kontron.obj $(TMP_D)\ihpm.obj $(TMP_D)\ifwum.obj \
$(TMP_D)\oem_fujitsu.obj $(TMP_D)\oem_intel.obj $(TMP_D)\oem_lenovo.obj \
- $(TMP_D)\oem_asus.obj \
+ $(TMP_D)\oem_asus.obj $(TMP_D)\iuser.obj \
$(TMP_D)\oem_sun.obj $(TMP_D)\oem_dell.obj $(TMP_D)\oem_hp.obj \
$(TMP_D)\oem_supermicro.obj $(TMP_D)\itsol.obj $(TMP_D)\idcmi.obj \
$(TMP_D)\oem_quanta.obj $(TMP_D)\oem_newisys.obj $(CMD_OBJ) mem_if.obj
@@ -310,6 +310,9 @@ $(TMP_D)\ihpm.obj: ihpm.c $(TMP_D)\idcmi.obj: idcmi.c
$(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\idcmi.obj idcmi.c
+$(TMP_D)\iuser.obj: iuser.c
+ $(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\iuser.obj iuser.c
+
$(TMP_D)\oem_fujitsu.obj: oem_fujitsu.c
$(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\oem_fujitsu.obj oem_fujitsu.c
diff --git a/util/ipmiutil64.mak b/util/ipmiutil64.mak index 6c8825e..cfd1719 100644 --- a/util/ipmiutil64.mak +++ b/util/ipmiutil64.mak @@ -86,7 +86,7 @@ E_OBJ=$(TMP_D)\ipmiutil.obj \ $(TMP_D)\iekanalyzer.obj $(TMP_D)\ifru_picmg.obj \
$(TMP_D)\oem_kontron.obj $(TMP_D)\ihpm.obj $(TMP_D)\ifwum.obj \
$(TMP_D)\oem_fujitsu.obj $(TMP_D)\oem_intel.obj $(TMP_D)\oem_lenovo.obj \
- $(TMP_D)\oem_asus.obj \
+ $(TMP_D)\oem_asus.obj $(TMP_D)\iuser.obj \
$(TMP_D)\oem_sun.obj $(TMP_D)\oem_dell.obj $(TMP_D)\oem_hp.obj \
$(TMP_D)\oem_supermicro.obj $(TMP_D)\itsol.obj $(TMP_D)\idcmi.obj \
$(TMP_D)\oem_quanta.obj $(TMP_D)\oem_newisys.obj $(CMD_OBJ) mem_if.obj
@@ -310,6 +310,9 @@ $(TMP_D)\ihpm.obj: ihpm.c $(TMP_D)\idcmi.obj: idcmi.c
$(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\idcmi.obj idcmi.c
+$(TMP_D)\iuser.obj: iuser.c
+ $(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\iuser.obj iuser.c
+
$(TMP_D)\oem_fujitsu.obj: oem_fujitsu.c
$(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\oem_fujitsu.obj oem_fujitsu.c
diff --git a/util/ireset.c b/util/ireset.c index 434676f..45133fe 100644 --- a/util/ireset.c +++ b/util/ireset.c @@ -108,7 +108,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* * Global variables */ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "ireset"; static uchar ipmi_maj; static uchar ipmi_min; diff --git a/util/isel.c b/util/isel.c index 83752eb..a1d4fdb 100644 --- a/util/isel.c +++ b/util/isel.c @@ -162,7 +162,7 @@ typedef struct #define RDATA_OFFSET 13 //byte offset to the record event data static char *progname = "isel"; -static char *progver = "3.02"; +static char *progver = "3.03"; #ifdef WIN32 #define IDXFILE "sel.idx" static char idxfile[80] = IDXFILE; diff --git a/util/iseltime.c b/util/iseltime.c index ba0013d..3aa9f27 100644 --- a/util/iseltime.c +++ b/util/iseltime.c @@ -6,6 +6,7 @@ * 05/11/09 Andy Cress v1.0 - created * 07/23/10 Andy Cress v1.1 - always show System time also * 08/20/10 Andy Cress v1.2 - show/set RTC time also if Linux + * 03/16/17 Andy Cress 3.03 - show/set UTC offset also */ /*M* Copyright (c) 2013, Andy Cress @@ -72,16 +73,45 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define GET_SELTIME 0x48 #define SET_SELTIME 0x49 +#define GET_SELUTC 0x5C +#define SET_SELUTC 0x5D /* * Global variables */ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "iseltime"; static char fdebug = 0; static char fset = 0; static uchar ipmi_maj = 0; static uchar ipmi_min = 0; +static int get_sel_utc(uchar *rdata, int rlen) +{ + uchar idata[4]; + uchar ccode; + int ret; + ret = ipmi_cmdraw(GET_SELUTC, NETFN_STOR, BMC_SA, PUBLIC_BUS, BMC_LUN, + idata, 0, rdata, &rlen, &ccode, fdebug); + if (ret == 0 && ccode != 0) ret = ccode; + return(ret); +} /*end get_sel_utc()*/ + +static int set_sel_utc(short offset) +{ + uchar idata[4]; + uchar rdata[16]; + int rlen = 8; + int ret; + uchar ccode; + + idata[0] = (uchar)(offset & 0x00ff); + idata[1] = (uchar)((offset >> 8) & 0x00ff); + ret = ipmi_cmdraw(SET_SELUTC, NETFN_STOR, BMC_SA, PUBLIC_BUS, BMC_LUN, + idata, 2, rdata, &rlen, &ccode, fdebug); + if (ret == 0 && ccode != 0) ret = ccode; + return(ret); +} /*end set_sel_utc()*/ + static int get_sel_time(uchar *rdata, int rlen) { uchar idata[4]; @@ -142,15 +172,15 @@ time_t utc2local(time_t t) void show_time(time_t etime, int doutc) { char buf[TIMESTR_SZ]; - int bufsz = TIMESTR_SZ; + int bufsz = TIMESTR_SZ; time_t t; - strcpy(buf,"00/00/00 00:00:00"); + strcpy(buf,"00/00/00 00:00:00"); if (doutc) t = utc2local(etime); else t = etime; - strftime(buf,bufsz, "%x %H:%M:%S", gmtime(&t)); /*or "%x %T"*/ + strftime(buf,bufsz, "%x %H:%M:%S", gmtime(&t)); /*or "%x %T"*/ printf("%s\n",buf); - return; + return; } #ifdef METACOMMAND @@ -168,6 +198,7 @@ main(int argc, char **argv) uchar devrec[20]; uchar timebuf[4]; time_t ltime1, ltime2, ltime3; + short offset; int c; #if defined (EFI) @@ -214,11 +245,19 @@ main(int argc, char **argv) #endif } + offset = 0; + rv = get_sel_utc((uchar *)&offset,2); + if (fdebug) printf("get_sel_utc: ret=%x offset=%d\n",rv,offset); + if (rv == 0) { + /* TODO: get system UTC offset */ + rv = set_sel_utc(offset); + printf("set_sel_utc(%d): ret=%x\n",offset,rv); + } rv = get_sel_time(&timebuf[0],4); if (rv != 0) { - printf("get_sel_time error: ret = %x\n",rv); - ipmi_close_(); - exit(1); + printf("get_sel_time error: ret = %x\n",rv); + ipmi_close_(); + exit(1); } time(<ime2); printf("Current System time: "); show_time(ltime2,1); diff --git a/util/isensor.c b/util/isensor.c index 7dd746e..3de3d38 100644 --- a/util/isensor.c +++ b/util/isensor.c @@ -255,7 +255,7 @@ char *decode_entity_id(int id) { * Global Data ************************/ static char *progname = "isensor"; -static char *progver = "3.02"; +static char *progver = "3.03"; #ifdef WIN32 static char savefile[] = "%ipmiutildir%\\thresholds.cmd"; #else diff --git a/util/iserial.c b/util/iserial.c index 14de25c..8bed75c 100644 --- a/util/iserial.c +++ b/util/iserial.c @@ -155,7 +155,7 @@ typedef struct /* * Global variables */ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "iserial"; static int vend_id = 0; static int prod_id = 0; diff --git a/util/isol.c b/util/isol.c index 6fc13f8..8bd5a2f 100644 --- a/util/isol.c +++ b/util/isol.c @@ -165,7 +165,7 @@ void dbglog( char *pattn, ... ); /*local prototype*/ /* * Global variables */ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "isol"; static char fdebug = 0; static char fpicmg = 0; diff --git a/util/itsol.c b/util/itsol.c index 540b73b..8d5ba1b 100644 --- a/util/itsol.c +++ b/util/itsol.c @@ -98,7 +98,7 @@ int gettimeofday(struct timeval *tv, struct timezone *tz); extern int verbose; extern char fdebug; /*from ipmicmd.c*/ static char * progname = "itsol"; -static char * progver = "3.02"; +static char * progver = "3.03"; static uchar g_bus = PUBLIC_BUS; static uchar g_sa = BMC_SA; static uchar g_lun = BMC_LUN; diff --git a/util/iuser.c b/util/iuser.c new file mode 100644 index 0000000..7cbe661 --- /dev/null +++ b/util/iuser.c @@ -0,0 +1,298 @@ +/* + * iuser.c + * Handle IPMI user command functions + * + * Change history: + * 03/22/2017 ARCress - included in source tree + * + *----------------------------------------------------------------------* +The BSD License + +Copyright (c) 2017, Andy Cress. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a.. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b.. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + c.. Neither the name of Intel Corporation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *----------------------------------------------------------------------*/ +#ifdef WIN32 +#include <windows.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "getopt.h" +#else +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <time.h> +#if defined(HPUX) +/* getopt is defined in stdio.h */ +#elif defined(MACOS) +/* getopt is defined in unistd.h */ +#include <unistd.h> +#else +#include <getopt.h> +#endif +#endif +#include "ipmicmd.h" + +/* global variables */ +static char * progname = "iuser"; +static char * progver = "3.03"; +static char fdebug = 0; +static char fcanonical = 0; +static char bdelim = '|'; +static uchar g_bus = PUBLIC_BUS; +static uchar g_sa = BMC_SA; +static uchar g_lun = BMC_LUN; +static uchar g_addrtype = ADDR_SMI; +extern int verbose; /*see ipmilanplus.c*/ + +extern void lprintf(int level, const char * format, ...); /*ipmilanplus.c*/ + +int GetUserInfo(uchar unum, uchar chan, uchar *enab, uchar *priv, char *uname, char fdebug); +int SetPasswd(int unum, char *uname, char *upswd, uchar chan, uchar priv); +int GetBmcEthDevice(uchar lan_parm, uchar *pchan); +char *parse_priv(uchar c); + +static void printf_user_usage(void) +{ + printf("ipmiutil user Commands:\n"); + printf("\tuser list [channel]\n"); + printf("\tuser enable <user_num> [channel]\n"); + printf("\tuser disable <user_num>\n"); + printf("\tuser set <user_num> name <username> \n"); + printf("\tuser set <user_num> password <password> \n"); + printf("\tuser set <user_num> priv <priv_level> [channel]\n"); + printf("\t\twhere priv_level: 4=Admin, 3=Operator, 2=User\n"); +} + +/* ipmi_user_list - print out info for users + * + * @intf: ipmi inteface + * @argc: argument count + * @argv: argument list + * returns 0 on success, -1 on error + */ +static int ipmi_user_list(void * intf, int argc, char ** argv) +{ + int i,ret = 0; + int rv = -1; + uchar num = 1; + uchar chan = 1; + uchar enab, priv; + char uname[21]; + char *privstr; + + if (argv[0] != NULL) chan = atoi(argv[0]); + else i = GetBmcEthDevice(0xFF, &chan); + while (ret == 0) { + uname[0] = '\0'; + ret = GetUserInfo(num, chan, &enab, &priv, uname, fdebug); + if (ret == 0) { + privstr = parse_priv(priv); + if (fcanonical) + printf("User %2d %c chan=%d %c %8s %c %8s %c %s\n", + num,bdelim,chan,bdelim,(enab? "enabled": "disabled"), + bdelim,privstr,bdelim,uname); + else + printf("User %2d: chan=%d \t%8s \t%8s \t%s\n", + num,chan,(enab? "enabled": "disabled"),privstr,uname); + rv = 0; + } + num++; + } + return(rv); +} + +/* ipmi_user_enable_disable - enable/disable BMC functions + * + * @intf: ipmi inteface + * @enable: whether to enable or disable + * @argc: argument count + * @argv: argument list + * + * returns 0 on success, -1 on error + */ +static int +ipmi_user_enable_disable(void * intf, int enable, int argc, char ** argv) +{ + int i, ret = -1; + uchar unum, chan, enab; + uchar priv = 3; + char uname[21] = {'\0'}; + + if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { + printf_user_usage(); + return ERR_USAGE; + } + if (argv[0] == NULL) { printf_user_usage(); return ERR_USAGE; } + unum = atoi(argv[0]); + + if (argv[1] != NULL) chan = atoi(argv[1]); + else i = GetBmcEthDevice(0xFF, &chan); + + if (enable == 0) { + ret = DisableUser(unum, chan); + } else { + ret = GetUserInfo(unum, chan, &enab, &priv, uname, fdebug); + ret = SetPasswd(unum, uname, NULL, chan, priv); + } + return ret; +} + +/* ipmi_user_reset - reset firmware user to enable everything + * + * @intf: ipmi inteface + * @argc: argument count + * @argv: argument list + * + * returns 0 on success, -1 on error + */ +static int +ipmi_user_set(void * intf, int argc, char ** argv) +{ + int ret = -1; + int i, func = -1; + char *uname = NULL; + char *upass = NULL; + uchar unum, chan, enab, dummy; + uchar priv = 3; + char name[21] = {'\0'}; + + if ((argc < 2) || (argc > 0 && strncmp(argv[0], "help", 4) == 0)) { + printf_user_usage(); + return ERR_USAGE; + } + if ((argv[1] == NULL) || (argv[2] == NULL)) { + printf_user_usage(); + return ERR_USAGE; + } + unum = atoi(argv[0]); + if (strncmp(argv[1], "name", 4) == 0) { + func = 1; + uname = argv[2]; + } else if (strncmp(argv[1], "password", 8) == 0) { + func = 2; + upass = argv[2]; + } else if (strncmp(argv[1], "priv", 4) == 0) { + func = 3; + priv = atoi(argv[2]); + } else { + printf_user_usage(); + return(ERR_USAGE); + } + if (argv[3] != NULL) chan = atoi(argv[3]); + else i = GetBmcEthDevice(0xFF, &chan); + + switch(func) { + case 1: /*set name*/ + ret = GetUserInfo(unum, chan, &enab, &priv, name, fdebug); + ret = SetPasswd(unum, uname, upass, chan, priv); + break; + case 2: /*set password*/ + ret = GetUserInfo(unum, chan, &enab, &priv, name, fdebug); + if (ret == 0) uname = name; + ret = SetPasswd(unum, uname, upass, chan, priv); + break; + case 3: /*set priv*/ + ret = GetUserInfo(unum, chan, &enab, &dummy, name, fdebug); + if (ret == 0) uname = name; + ret = SetPasswd(unum, uname, upass, chan, priv); + break; + } + return ret; +} + +#ifdef METACOMMAND +int i_user(int argc, char **argv) +#else +#ifdef WIN32 +int __cdecl +#else +int +#endif +main(int argc, char **argv) +#endif +{ + void *intf = NULL; + int rc = 0; + int c, i; + char *s1; + + printf("%s ver %s\n", progname,progver); + + while ( (c = getopt( argc, argv,"cm:T:V:J:EYF:P:N:R:U:Z:x?")) != EOF ) + switch (c) { + case 'c': fcanonical = 1; break; + case 'm': /* specific IPMB MC, 3-byte address, e.g. "409600" */ + g_bus = htoi(&optarg[0]); /*bus/channel*/ + g_sa = htoi(&optarg[2]); /*device slave address*/ + g_lun = htoi(&optarg[4]); /*LUN*/ + g_addrtype = ADDR_IPMB; + if (optarg[6] == 's') { + g_addrtype = ADDR_SMI; s1 = "SMI"; + } else { g_addrtype = ADDR_IPMB; s1 = "IPMB"; } + ipmi_set_mc(g_bus,g_sa,g_lun,g_addrtype); + printf("Use MC at %s bus=%x sa=%x lun=%x\n", + s1,g_bus,g_sa,g_lun); + break; + case 'x': fdebug = 1; verbose = 1; + break; /* debug messages */ + case 'N': /* nodename */ + case 'U': /* remote username */ + case 'P': /* remote password */ + case 'R': /* remote password */ + case 'E': /* get password from IPMI_PASSWORD environment var */ + case 'F': /* force driver type */ + case 'T': /* auth type */ + case 'J': /* cipher suite */ + case 'V': /* priv level */ + case 'Y': /* prompt for remote password */ + case 'Z': /* set local MC address */ + parse_lan_options(c,optarg,fdebug); + break; + case '?': + print_lan_opt_usage(0); + printf_user_usage(); + return ERR_USAGE; + break; + } + for (i = 0; i < optind; i++) { argv++; argc--; } + + if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { + printf_user_usage(); + } else if (strncmp(argv[0], "list", 4) == 0) { + rc = ipmi_user_list(intf, argc-1, &(argv[1])); + } else if (strncmp(argv[0], "enable", 6) == 0) { + rc = ipmi_user_enable_disable(intf, 1, argc-1, &(argv[1])); + } else if (strncmp(argv[0], "disable", 7) == 0) { + rc = ipmi_user_enable_disable(intf, 0, argc-1, &(argv[1])); + } else if (strncmp(argv[0], "set", 3) == 0) { + rc = ipmi_user_set(intf, argc-1, &(argv[1])); + } else { + printf_user_usage(); + rc = ERR_BAD_PARAM; + } + ipmi_close_(); + return rc; +} diff --git a/util/iwdt.c b/util/iwdt.c index 89f4c52..820d57b 100644 --- a/util/iwdt.c +++ b/util/iwdt.c @@ -100,7 +100,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* * Global variables */ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "iwdt"; static char fdebug = 0; static char fdontlog = 0; diff --git a/util/oem_dell.c b/util/oem_dell.c index c806e94..f8caf9a 100644 --- a/util/oem_dell.c +++ b/util/oem_dell.c @@ -132,7 +132,7 @@ char NIC_Selection_Mode_String_12g[] [50] = { "shared with failover all loms" }; -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "idelloem"; static int verbose = 0; static char fdebug = 0; diff --git a/util/oem_hp.c b/util/oem_hp.c index 4c5b4f9..b7f7d07 100644 --- a/util/oem_hp.c +++ b/util/oem_hp.c @@ -83,10 +83,17 @@ int decode_sensor_hp(uchar *sdr,uchar *reading,char *pstring, int slen) strncpy(pstring,"na",slen); /*oem*/ rv = 0; } else { - if ((reading[2] & 0x40) == 0x40) { /*Init/Unavail state*/ - strncpy(pstring,"Init",slen); +#ifdef OLD + int vend, prod; + get_mfgid(&vend,&prod); + /* This was an anomaly for an older HP DL380 but is no longer valid */ + if ((prod == 0x2000) && ((reading[2] & 0x40) == 0x40)) { + /*custom Init/Unavail state if DL380*/ + strncpy(pstring,"Init",slen); rv = 0; - } else if (evtype == 0x6f) { /*evtype==0x6f special*/ + } else +#endif + if (evtype == 0x6f) { /*evtype==0x6f special*/ pstr = "DiscreteEvt"; if (stype == 0x08) { /*Power Supply presence*/ if (reading[2] & 0x01) pstr = "Present"; diff --git a/util/oem_sun.c b/util/oem_sun.c index 5cedc34..1d25301 100644 --- a/util/oem_sun.c +++ b/util/oem_sun.c @@ -109,7 +109,7 @@ static const struct valstr sunoem_led_mode_optvals[] = { /* global variables */ static char * progname = "isunoem"; -static char * progver = "3.02"; +static char * progver = "3.03"; static char fdebug = 0; static uchar g_bus = PUBLIC_BUS; static uchar g_sa = BMC_SA; diff --git a/util/oem_supermicro.c b/util/oem_supermicro.c index d1d1da7..165bf88 100644 --- a/util/oem_supermicro.c +++ b/util/oem_supermicro.c @@ -68,7 +68,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. void set_loglevel(int level); /*prototype */ extern char fsm_debug; /*mem_if.c*/ -static char * progver = "3.02"; +static char * progver = "3.03"; static char * progname = "ismcoem"; static int verbose = 0; static char fdebug = 0; |