4
* MontaVista IPMI code, a simple curses UI for IPMI
6
* Author: MontaVista Software, Inc.
7
* Corey Minyard <minyard@mvista.com>
10
* Copyright 2002,2003,2004 MontaVista Software Inc.
12
* This program is free software; you can redistribute it and/or
13
* modify it under the terms of the GNU Lesser General Public License
14
* as published by the Free Software Foundation; either version 2 of
15
* the License, or (at your option) any later version.
18
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
19
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
24
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
26
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
27
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
* You should have received a copy of the GNU Lesser General Public
30
* License along with this program; if not, write to the Free
31
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
47
#include <OpenIPMI/selector.h>
48
#include <OpenIPMI/ipmi_err.h>
49
#include <OpenIPMI/ipmi_msgbits.h>
50
#include <OpenIPMI/ipmi_mc.h>
51
#include <OpenIPMI/ipmiif.h>
52
#include <OpenIPMI/ipmi_ui.h>
53
#include <OpenIPMI/ipmi_fru.h>
54
#include <OpenIPMI/ipmi_pef.h>
55
#include <OpenIPMI/ipmi_lanparm.h>
56
#include <OpenIPMI/ipmi_pet.h>
57
#include <OpenIPMI/ipmi_conn.h>
58
#include <OpenIPMI/ipmi_debug.h>
59
#include <OpenIPMI/internal/ipmi_mc.h>
61
#include <OpenIPMI/internal/ipmi_malloc.h>
62
#include <OpenIPMI/internal/ipmi_event.h>
64
#include "ui_keypad.h"
65
#include "ui_command.h"
77
int display_pad_top_line;
82
ipmi_domain_id_t domain_id;
84
extern os_handler_t ipmi_ui_cb_handlers;
86
ipmi_pef_config_t *pef_config;
87
ipmi_lanparm_t *lanparm;
88
ipmi_lan_config_t *lanparm_config;
90
static int full_screen;
91
struct termios old_termios;
94
#define STATUS_WIN_LINES 2
95
#define STATUS_WIN_COLS COLS
96
#define STATUS_WIN_TOP 0
97
#define STATUS_WIN_LEFT 0
99
#define CMD_WIN_LINES 3
100
#define CMD_WIN_COLS COLS
101
#define CMD_WIN_LEFT 0
102
#define CMD_WIN_TOP (LINES-CMD_WIN_LINES)
104
#define DISPLAY_WIN_LINES (LINES - STATUS_WIN_LINES - CMD_WIN_LINES - 2)
105
#define DISPLAY_WIN_COLS (COLS/2-1)
106
#define DISPLAY_WIN_TOP (STATUS_WIN_LINES+1)
107
#define DISPLAY_WIN_LEFT 0
108
#define DISPLAY_WIN_RIGHT (COLS/2-2)
109
#define DISPLAY_WIN_BOTTOM (CMD_WIN_TOP-2)
110
#define NUM_DISPLAY_LINES 1024
112
#define LOG_WIN_LINES (LINES - STATUS_WIN_LINES - CMD_WIN_LINES - 2)
113
#define LOG_WIN_COLS (COLS-(COLS/2))
114
#define LOG_WIN_LEFT (COLS/2)
115
#define LOG_WIN_RIGHT (COLS-1)
116
#define LOG_WIN_TOP (STATUS_WIN_LINES+1)
117
#define LOG_WIN_BOTTOM (CMD_WIN_TOP-2)
118
#define NUM_LOG_LINES 1024
120
#define TOP_LINE STATUS_WIN_LINES
121
#define BOTTOM_LINE (LINES-CMD_WIN_LINES-1)
122
#define MID_COL (COLS/2-1)
123
#define MID_LINES (LINES - STATUS_WIN_LINES - CMD_WIN_LINES - 2)
125
enum scroll_wins_e { LOG_WIN_SCROLL, DISPLAY_WIN_SCROLL };
127
enum scroll_wins_e curr_win = LOG_WIN_SCROLL;
129
/* The current thing display in the display pad. */
131
DISPLAY_NONE, DISPLAY_SENSOR, DISPLAY_SENSORS,
132
DISPLAY_CONTROLS, DISPLAY_CONTROL, DISPLAY_ENTITIES, DISPLAY_MCS,
134
DISPLAY_RSP, DISPLAY_SDRS, HELP, EVENTS, DISPLAY_ENTITY, DISPLAY_FRU
136
ipmi_sensor_id_t curr_sensor_id;
137
ipmi_control_id_t curr_control_id;
138
typedef struct pos_s {int y; int x; } pos_t;
139
typedef struct thr_pos_s
146
thr_pos_t threshold_positions[6];
151
pos_t discr_assert_enab;
152
pos_t discr_deassert_enab;
154
ipmi_entity_id_t curr_entity_id;
156
static char *line_buffer = NULL;
157
static int line_buffer_max = 0;
158
static int line_buffer_pos = 0;
160
sel_timer_t *redisplay_timer;
163
conv_from_spaces(char *name)
173
conv_to_spaces(char *name)
183
log_pad_refresh(int newlines)
186
if (log_pad_top_line < 0)
187
log_pad_top_line = 0;
189
if (log_pad_top_line > (NUM_LOG_LINES - LOG_WIN_LINES))
190
log_pad_top_line = NUM_LOG_LINES - LOG_WIN_LINES;
192
if (log_pad_top_line != (NUM_LOG_LINES - LOG_WIN_LINES)) {
193
/* We are not at the bottom, so hold the same position. */
194
log_pad_top_line -= newlines;
198
LOG_WIN_TOP, LOG_WIN_LEFT,
199
LOG_WIN_BOTTOM, LOG_WIN_RIGHT);
205
vlog_pad_out(char *format, va_list ap)
208
vw_printw(log_pad, format, ap);
214
log_pad_out(char *format, ...)
218
va_start(ap, format);
219
vlog_pad_out(format, ap);
224
display_pad_refresh(void)
227
if (display_pad_top_line >= NUM_DISPLAY_LINES)
228
display_pad_top_line = NUM_DISPLAY_LINES;
230
if (display_pad_top_line < 0)
231
display_pad_top_line = 0;
233
prefresh(display_pad,
234
display_pad_top_line, 0,
235
DISPLAY_WIN_TOP, DISPLAY_WIN_LEFT,
236
DISPLAY_WIN_BOTTOM, DISPLAY_WIN_RIGHT);
242
display_pad_clear(void)
244
display_pad_top_line = 0;
247
wmove(display_pad, 0, 0);
252
display_pad_clear_nomove(void)
256
wmove(display_pad, 0, 0);
261
display_pad_out(char *format, ...)
265
va_start(ap, format);
267
vw_printw(display_pad, format, ap);
274
cmd_win_out(char *format, ...)
278
va_start(ap, format);
280
vw_printw(cmd_win, format, ap);
287
cmd_win_refresh(void)
296
get_uchar(char **toks, unsigned char *val, char *errstr)
300
str = strtok_r(NULL, " \t\n", toks);
303
cmd_win_out("No %s given\n", errstr);
306
*val = strtoul(str, &tmpstr, 16);
307
if (*tmpstr != '\0') {
309
cmd_win_out("Invalid %s given\n", errstr);
317
get_uint(char **toks, unsigned int *val, char *errstr)
321
str = strtok_r(NULL, " \t\n", toks);
324
cmd_win_out("No %s given\n", errstr);
327
*val = strtoul(str, &tmpstr, 16);
328
if (*tmpstr != '\0') {
330
cmd_win_out("Invalid %s given\n", errstr);
338
get_ip_addr(char **toks, struct in_addr *ip_addr, char *errstr)
342
char *str, *tmpstr, *istr;
346
str = strtok_r(NULL, " \t\n", toks);
349
cmd_win_out("No %s given\n", errstr);
354
for (i=0; i<4; i++) {
355
istr = strtok_r(str, ".", &ntok);
359
cmd_win_out("%s: invalid IP address\n", errstr);
362
val = strtoul(istr, &tmpstr, 10);
363
if (*tmpstr != '\0') {
365
cmd_win_out("%s: Invalid IP address\n", errstr);
368
addr = (addr << 8) | val;
371
ip_addr->s_addr = htonl(addr);
376
get_mac_addr(char **toks, unsigned char *mac_addr, char *errstr)
378
char *str, *tmpstr, *istr;
382
str = strtok_r(NULL, " \t\n", toks);
385
cmd_win_out("No %s given\n", errstr);
389
for (i=0; i<6; i++) {
390
istr = strtok_r(str, ":", &ntok);
394
cmd_win_out("%s: invalid IP address\n", errstr);
397
mac_addr[i] = strtoul(istr, &tmpstr, 16);
398
if (*tmpstr != '\0') {
400
cmd_win_out("%s: Invalid IP address\n", errstr);
411
wmove(main_win, TOP_LINE, 0);
412
whline(main_win, 0, COLS);
413
wmove(main_win, BOTTOM_LINE, 0);
414
whline(main_win, 0, COLS);
415
wmove(main_win, TOP_LINE, MID_COL);
416
wvline(main_win, ACS_TTEE, 1);
417
wmove(main_win, TOP_LINE+1, MID_COL);
418
wvline(main_win, 0, MID_LINES);
419
wmove(main_win, TOP_LINE+1+MID_LINES, MID_COL);
420
wvline(main_win, ACS_BTEE, 1);
425
ui_vlog(char *format, enum ipmi_log_type_e log_type, va_list ap)
430
gettimeofday(&now, NULL);
433
int x = 0, y = 0, old_x = 0, old_y = 0;
434
int max_x, max_y, i, j;
436
/* Generate the output to the dummy pad to see how many lines we
438
getyx(dummy_pad, old_y, old_x);
442
wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec);
443
wprintw(dummy_pad, "INFO: ");
446
case IPMI_LOG_WARNING:
447
wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec);
448
wprintw(dummy_pad, "WARN: ");
451
case IPMI_LOG_SEVERE:
452
wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec);
453
wprintw(dummy_pad, "SEVR: ");
457
wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec);
458
wprintw(dummy_pad, "FATL: ");
461
case IPMI_LOG_ERR_INFO:
462
wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec);
463
wprintw(dummy_pad, "EINF: ");
466
case IPMI_LOG_DEBUG_START:
470
wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec);
471
wprintw(dummy_pad, "DEBG: ");
474
case IPMI_LOG_DEBUG_CONT:
477
case IPMI_LOG_DEBUG_END:
480
vw_printw(dummy_pad, format, ap);
482
wprintw(dummy_pad, "\n");
483
getyx(dummy_pad, y, x);
486
for (j=old_x; j<x; j++)
487
waddch(log_pad, mvwinch(dummy_pad, y, j));
489
getmaxyx(dummy_pad, max_y, max_x);
490
for (j=old_x; j<max_x; j++)
491
waddch(log_pad, mvwinch(dummy_pad, old_y, j));
492
for (i=old_y+1; i<y; i++) {
493
for (j=0; j<max_x; j++)
494
waddch(log_pad, mvwinch(dummy_pad, i, j));
497
waddch(log_pad, mvwinch(dummy_pad, y, j));
500
wmove(dummy_pad, 0, x);
506
log_pad_out("%d.%6.6d: ", now.tv_sec, now.tv_usec);
507
log_pad_out("INFO: ");
510
case IPMI_LOG_WARNING:
511
log_pad_out("%d.%6.6d: ", now.tv_sec, now.tv_usec);
512
log_pad_out("WARN: ");
515
case IPMI_LOG_SEVERE:
516
log_pad_out("%d.%6.6d: ", now.tv_sec, now.tv_usec);
517
log_pad_out("SEVR: ");
521
log_pad_out("%d.%6.6d: ", now.tv_sec, now.tv_usec);
522
log_pad_out("FATL: ");
525
case IPMI_LOG_ERR_INFO:
526
log_pad_out("%d.%6.6d: ", now.tv_sec, now.tv_usec);
527
log_pad_out("EINF: ");
530
case IPMI_LOG_DEBUG_START:
534
log_pad_out("%d.%6.6d: ", now.tv_sec, now.tv_usec);
535
log_pad_out("DEBG: ");
538
case IPMI_LOG_DEBUG_CONT:
541
case IPMI_LOG_DEBUG_END:
545
vlog_pad_out(format, ap);
554
ui_log(char *format, ...)
560
gettimeofday(&now, NULL);
562
va_start(ap, format);
565
/* Generate the output to the dummy pad to see how many lines we
567
wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec);
568
vw_printw(dummy_pad, format, ap);
569
getyx(dummy_pad, y, x);
570
wmove(dummy_pad, 0, x);
572
va_start(ap, format);
575
log_pad_out("%ld.%6.6ld: ", now.tv_sec, now.tv_usec);
576
vlog_pad_out(format, ap);
583
leave(int rv, char *format, ...)
589
sel_stop_timer(redisplay_timer);
590
sel_free_timer(redisplay_timer);
596
tcsetattr(0, TCSADRAIN, &old_termios);
597
fcntl(0, F_SETFL, old_flags);
602
ipmi_pef_free_config(pef_config);
606
ipmi_pef_destroy(pef, NULL, NULL);
609
if (lanparm_config) {
610
ipmi_lan_free_config(lanparm_config);
611
lanparm_config = NULL;
614
ipmi_lanparm_destroy(lanparm, NULL, NULL);
619
ipmi_mem_free(line_buffer);
621
command_free(commands);
624
sel_free_selector(ui_sel);
626
va_start(ap, format);
627
vfprintf(stderr, format, ap);
630
ipmi_debug_malloc_cleanup();
635
leave_err(int err, char *format, ...)
642
tcsetattr(0, TCSADRAIN, &old_termios);
643
fcntl(0, F_SETFL, old_flags);
646
sel_free_selector(ui_sel);
648
va_start(ap, format);
649
vfprintf(stderr, format, ap);
652
if (IPMI_IS_OS_ERR(err)) {
653
fprintf(stderr, ": %s\n", strerror(IPMI_GET_OS_ERR(err)));
655
fprintf(stderr, ": IPMI Error %2.2x\n", IPMI_GET_IPMI_ERR(err));
658
ipmi_debug_malloc_cleanup();
667
mvwin(stat_win, STATUS_WIN_TOP, STATUS_WIN_LEFT);
668
wresize(stat_win, STATUS_WIN_LINES, STATUS_WIN_COLS);
672
wresize(display_pad, DISPLAY_WIN_LINES, DISPLAY_WIN_COLS);
674
mvwin(cmd_win, CMD_WIN_TOP, CMD_WIN_LEFT);
675
wresize(cmd_win, CMD_WIN_LINES, CMD_WIN_COLS);
679
wresize(log_pad, NUM_LOG_LINES, LOG_WIN_COLS);
680
wresize(dummy_pad, NUM_LOG_LINES, LOG_WIN_COLS);
685
display_pad_refresh();
689
void handle_user_char(int c)
691
int err = keypad_handle_key(keymap, c, NULL);
693
ui_log("Got error on char 0x%x 0%o %d\n", c, c, c);
697
user_input_ready(int fd, void *data)
711
count = read(0, &rc, 1);
713
handle_user_char(rc);
718
normal_char(int key, void *cb_data)
722
if (line_buffer_pos >= line_buffer_max) {
723
char *new_line = ipmi_mem_alloc(line_buffer_max+10+1);
726
line_buffer_max += 10;
728
memcpy(new_line, line_buffer, line_buffer_pos);
729
ipmi_mem_free(line_buffer);
731
line_buffer = new_line;
733
line_buffer[line_buffer_pos] = key;
743
end_of_line(int key, void *cb_data)
750
line_buffer[line_buffer_pos] = '\0';
752
err = command_handle(commands, line_buffer, NULL);
754
cmd_win_out("Invalid command: %s\n> ", line_buffer);
763
backspace(int key, void *cb_data)
765
if (line_buffer_pos == 0)
769
cmd_win_out("\b \b");
775
key_up(int key, void *cb_data)
781
key_down(int key, void *cb_data)
787
key_right(int key, void *cb_data)
793
key_left(int key, void *cb_data)
799
key_ppage(int key, void *cb_data)
801
if (curr_win == LOG_WIN_SCROLL) {
802
log_pad_top_line -= (LOG_WIN_LINES-1);
804
} else if (curr_win == DISPLAY_WIN_SCROLL) {
805
display_pad_top_line -= (DISPLAY_WIN_LINES-1);
806
display_pad_refresh();
812
key_npage(int key, void *cb_data)
814
if (curr_win == LOG_WIN_SCROLL) {
815
log_pad_top_line += (LOG_WIN_LINES-1);
817
} else if (curr_win == DISPLAY_WIN_SCROLL) {
818
display_pad_top_line += (DISPLAY_WIN_LINES-1);
819
display_pad_refresh();
824
static int leave_count = 0;
827
final_leave(void *cb_data)
830
if (leave_count == 0)
835
leave_cmder(ipmi_domain_t *domain, void *cb_data)
839
rv = ipmi_domain_close(domain, final_leave, NULL);
845
key_leave(int key, void *cb_data)
847
ipmi_domain_iterate_domains(leave_cmder, NULL);
848
if (leave_count == 0)
855
key_resize(int key, void *cb_data)
862
key_set_display(int key, void *cb_data)
864
curr_win = DISPLAY_WIN_SCROLL;
869
key_set_log(int key, void *cb_data)
871
curr_win = LOG_WIN_SCROLL;
875
/* Includes 3 3-byte fields (entity id, entity instance, and slave
876
address) and 1 2-byte field (channel) and three periods and the nil
877
char at the end and possible a leading "r" for device-relative. */
878
#define MAX_ENTITY_LOC_SIZE 16
880
/* Convert an entity to a locator for the entity. This is either:
881
<num>.<num> for an absolute entity, or
882
r<num>.<num>.<num>.<num> for a device-relative entity. */
884
get_entity_loc(ipmi_entity_t *entity, char *str, int strlen)
888
id = ipmi_entity_convert_to_id(entity);
889
if (id.entity_instance >= 0x60)
890
snprintf(str, strlen, "r%d.%d.%d.%d",
894
id.entity_instance - 0x60);
896
snprintf(str, strlen, "%d.%d",
903
entities_handler(ipmi_entity_t *entity,
907
char loc[MAX_ENTITY_LOC_SIZE];
909
enum ipmi_dlr_type_e type;
910
static char *ent_types[] = { "unknown", "mc", "fru",
911
"generic", "invalid" };
913
type = ipmi_entity_get_type(entity);
914
if (type > IPMI_ENTITY_GENERIC)
915
type = IPMI_ENTITY_GENERIC + 1;
916
curr_entity_id = ipmi_entity_convert_to_id(entity);
917
ipmi_entity_get_id(entity, name, 32);
918
if (strlen(name) == 0)
919
strncpy(name, ipmi_entity_get_entity_id_string(entity), 33);
920
if (ipmi_entity_is_present(entity))
923
present = "not present";
924
display_pad_out(" %s (%s) %s %s\n",
925
get_entity_loc(entity, loc, sizeof(loc)),
927
ent_types[type], present);
931
entities_cmder(ipmi_domain_t *domain, void *cb_data)
934
display_pad_clear_nomove();
937
display_pad_out("Entities:\n");
938
ipmi_domain_iterate_entities(domain, entities_handler, NULL);
939
display_pad_refresh();
943
entities_cmd(char *cmd, char **toks, void *cb_data)
947
rv = ipmi_domain_pointer_cb(domain_id, entities_cmder, NULL);
949
cmd_win_out("Unable to convert domain id to a pointer\n");
952
curr_display_type = DISPLAY_ENTITIES;
956
typedef void (*entity_handler_cb)(ipmi_entity_t *entity,
961
int id, instance, found;
962
int channel, address;
963
entity_handler_cb handler;
964
char **toks, **toks2;
969
entity_searcher(ipmi_entity_t *entity,
972
struct ent_rec *info = cb_data;
975
id = ipmi_entity_convert_to_id(entity);
976
if ((info->id == id.entity_id)
977
&& (info->instance == id.entity_instance)
978
&& (info->address == id.address)
979
&& (info->channel == id.channel))
982
info->handler(entity, info->toks, info->toks2, info->cb_data);
987
entity_finder_d(ipmi_domain_t *domain, void *cb_data)
989
ipmi_domain_iterate_entities(domain, entity_searcher, cb_data);
993
entity_finder(char *cmd, char **toks,
994
entity_handler_cb handler,
999
char *id_name, *instance_name, *toks2, *estr;
1002
ent_name = strtok_r(NULL, " \t\n", toks);
1004
cmd_win_out("No entity given\n");
1008
if (ent_name[0] == 'r') {
1009
/* Device-relative address. */
1011
name = strtok_r(ent_name+1, ".", &toks2);
1012
info.channel = strtoul(name, &estr, 0);
1013
if (*estr != '\0') {
1014
cmd_win_out("Invalid entity channel given\n");
1018
name = strtok_r(NULL, ".", &toks2);
1019
info.address = strtoul(name, &estr, 0);
1020
if (*estr != '\0') {
1021
cmd_win_out("Invalid entity address given\n");
1025
id_name = strtok_r(NULL, ".", &toks2);
1029
id_name = strtok_r(ent_name, ".", &toks2);
1031
instance_name = strtok_r(NULL, ".", &toks2);
1032
if (!instance_name) {
1033
cmd_win_out("Invalid entity given\n");
1036
info.id = strtoul(id_name, &estr, 0);
1037
if (*estr != '\0') {
1038
cmd_win_out("Invalid entity id given\n");
1041
info.instance = strtoul(instance_name, &estr, 0);
1042
if (*estr != '\0') {
1043
cmd_win_out("Invalid entity instance given\n");
1046
if (ent_name[0] == 'r')
1047
info.instance += 0x60;
1051
info.handler = handler;
1052
info.cb_data = cb_data;
1054
info.toks2 = &toks2;
1056
rv = ipmi_domain_pointer_cb(domain_id, entity_finder_d, &info);
1058
if (ent_name[0] == 'r')
1059
cmd_win_out("Entity r%d.%d.%d.%d not found\n",
1060
info.channel, info.address, info.id,
1061
info.instance-0x60);
1063
cmd_win_out("Entity %d.%d not found\n", info.id, info.instance);
1072
entity_iterate_handler(ipmi_entity_t *o,
1073
ipmi_entity_t *entity,
1077
char loc[MAX_ENTITY_LOC_SIZE];
1079
ipmi_entity_get_id(entity, name, 32);
1081
display_pad_out(" %s (%s)\n",
1082
get_entity_loc(entity, loc, sizeof(loc)),
1087
entity_handler(ipmi_entity_t *entity,
1094
char ename[IPMI_ENTITY_NAME_LEN];
1095
char loc[MAX_ENTITY_LOC_SIZE];
1096
enum ipmi_dlr_type_e type;
1097
static char *ent_types[] = { "unknown", "mc", "fru",
1098
"generic", "invalid" };
1100
display_pad_clear();
1101
type = ipmi_entity_get_type(entity);
1102
if (type > IPMI_ENTITY_GENERIC)
1103
type = IPMI_ENTITY_GENERIC + 1;
1104
curr_entity_id = ipmi_entity_convert_to_id(entity);
1105
ipmi_entity_get_id(entity, name, 32);
1106
if (ipmi_entity_is_present(entity))
1107
present = "present";
1109
present = "not present";
1110
display_pad_out("Entity %s (%s) %s\n",
1111
get_entity_loc(entity, loc, sizeof(loc)),
1114
ipmi_entity_get_name(entity, ename, sizeof(ename));
1115
display_pad_out(" name = %s\n", ename);
1117
display_pad_out(" type = %s\n", ent_types[type]);
1118
display_pad_out(" entity id string = %s\n",
1119
ipmi_entity_get_entity_id_string(entity));
1120
display_pad_out(" is%s fru\n",
1121
ipmi_entity_get_is_fru(entity) ? "" : " not");
1122
display_pad_out(" present sensor%s always there\n",
1123
ipmi_entity_get_presence_sensor_always_there(entity)
1125
if (ipmi_entity_get_is_child(entity)) {
1126
display_pad_out(" Parents:\n");
1127
ipmi_entity_iterate_parents(entity, entity_iterate_handler, NULL);
1129
if (ipmi_entity_get_is_parent(entity)) {
1130
display_pad_out(" Children:\n");
1131
ipmi_entity_iterate_children(entity, entity_iterate_handler, NULL);
1135
case IPMI_ENTITY_MC:
1136
display_pad_out(" channel = 0x%x\n", ipmi_entity_get_channel(entity));
1137
display_pad_out(" lun = 0x%x\n", ipmi_entity_get_lun(entity));
1138
display_pad_out(" oem = 0x%x\n", ipmi_entity_get_oem(entity));
1139
display_pad_out(" slave_address = 0x%x\n",
1140
ipmi_entity_get_slave_address(entity));
1141
display_pad_out(" ACPI_system_power_notify_required = 0x%x\n",
1142
ipmi_entity_get_ACPI_system_power_notify_required(entity));
1143
display_pad_out(" ACPI_device_power_notify_required = 0x%x\n",
1144
ipmi_entity_get_ACPI_device_power_notify_required(entity));
1145
display_pad_out(" controller_logs_init_agent_errors = 0x%x\n",
1146
ipmi_entity_get_controller_logs_init_agent_errors(entity));
1147
display_pad_out(" log_init_agent_errors_accessing = 0x%x\n",
1148
ipmi_entity_get_log_init_agent_errors_accessing(entity));
1149
display_pad_out(" global_init = 0x%x\n",
1150
ipmi_entity_get_global_init(entity));
1151
display_pad_out(" chassis_device = 0x%x\n",
1152
ipmi_entity_get_chassis_device(entity));
1153
display_pad_out(" bridge = 0x%x\n",
1154
ipmi_entity_get_bridge(entity));
1155
display_pad_out(" IPMB_event_generator = 0x%x\n",
1156
ipmi_entity_get_IPMB_event_generator(entity));
1157
display_pad_out(" IPMB_event_receiver = 0x%x\n",
1158
ipmi_entity_get_IPMB_event_receiver(entity));
1159
display_pad_out(" FRU_inventory_device = 0x%x\n",
1160
ipmi_entity_get_FRU_inventory_device(entity));
1161
display_pad_out(" SEL_device = 0x%x\n",
1162
ipmi_entity_get_SEL_device(entity));
1163
display_pad_out(" SDR_repository_device = 0x%x\n",
1164
ipmi_entity_get_SDR_repository_device(entity));
1165
display_pad_out(" sensor_device = 0x%x\n",
1166
ipmi_entity_get_sensor_device(entity));
1169
case IPMI_ENTITY_FRU:
1170
display_pad_out(" channel = 0x%x\n", ipmi_entity_get_channel(entity));
1171
display_pad_out(" lun = 0x%x\n", ipmi_entity_get_lun(entity));
1172
display_pad_out(" oem = 0x%x\n", ipmi_entity_get_oem(entity));
1173
display_pad_out(" access_address = 0x%x\n",
1174
ipmi_entity_get_access_address(entity));
1175
display_pad_out(" private_bus_id = 0x%x\n",
1176
ipmi_entity_get_private_bus_id(entity));
1177
display_pad_out(" device_type = 0x%x\n",
1178
ipmi_entity_get_device_type(entity));
1179
display_pad_out(" device_modifier = 0x%x\n",
1180
ipmi_entity_get_device_modifier(entity));
1181
display_pad_out(" is_logical_fru = 0x%x\n",
1182
ipmi_entity_get_is_logical_fru(entity));
1183
display_pad_out(" fru_device_id = 0x%x\n",
1184
ipmi_entity_get_fru_device_id(entity));
1187
case IPMI_ENTITY_GENERIC:
1188
display_pad_out(" channel = 0x%x\n", ipmi_entity_get_channel(entity));
1189
display_pad_out(" lun = 0x%x\n", ipmi_entity_get_lun(entity));
1190
display_pad_out(" oem = 0x%x\n", ipmi_entity_get_oem(entity));
1191
display_pad_out(" access_address = 0x%x\n",
1192
ipmi_entity_get_access_address(entity));
1193
display_pad_out(" private_bus_id = 0x%x\n",
1194
ipmi_entity_get_private_bus_id(entity));
1195
display_pad_out(" device_type = 0x%x\n",
1196
ipmi_entity_get_device_type(entity));
1197
display_pad_out(" device_modifier = 0x%x\n",
1198
ipmi_entity_get_device_modifier(entity));
1199
display_pad_out(" slave_address = 0x%x\n",
1200
ipmi_entity_get_slave_address(entity));
1201
display_pad_out(" address_span = 0x%x\n",
1202
ipmi_entity_get_address_span(entity));
1208
display_pad_refresh();
1212
entity_cmd(char *cmd, char **toks, void *cb_data)
1214
entity_finder(cmd, toks, entity_handler, NULL);
1215
curr_display_type = DISPLAY_ENTITY;
1221
hs_get_act_time_cb(ipmi_entity_t *ent,
1226
char loc[MAX_ENTITY_LOC_SIZE];
1229
ui_log("Could not get hot-swap act time: error 0x%x\n", err);
1233
ui_log("Hot-swap activate time for %s is %lld\n",
1234
get_entity_loc(ent, loc, sizeof(loc)), val);
1238
hs_get_act_time_handler(ipmi_entity_t *entity,
1245
rv = ipmi_entity_get_auto_activate_time(entity, hs_get_act_time_cb, NULL);
1247
cmd_win_out("Could not get auto-activate: error 0x%x\n", rv);
1251
hs_get_act_time(char *cmd, char **toks, void *cb_data)
1253
entity_finder(cmd, toks, hs_get_act_time_handler, NULL);
1258
hs_set_act_time_cb(ipmi_entity_t *ent,
1263
ui_log("Could not get hot-swap act time: error 0x%x\n", err);
1265
ui_log("hot-swap act time set\n");
1269
hs_set_act_time_handler(ipmi_entity_t *entity,
1275
unsigned int timeout;
1277
if (get_uint(toks, &timeout, "Hot swap activate time"))
1280
rv = ipmi_entity_set_auto_activate_time(entity, timeout,
1281
hs_set_act_time_cb, NULL);
1283
cmd_win_out("Could not set auto-activate: error 0x%x\n", rv);
1287
hs_set_act_time(char *cmd, char **toks, void *cb_data)
1289
entity_finder(cmd, toks, hs_set_act_time_handler, NULL);
1294
hs_get_deact_time_cb(ipmi_entity_t *ent,
1299
char loc[MAX_ENTITY_LOC_SIZE];
1302
ui_log("Could not get hot-swap deact time: error 0x%x\n", err);
1306
ui_log("Hot-swap deactivate time for %s is %lld\n",
1307
get_entity_loc(ent, loc, sizeof(loc)), val);
1311
hs_get_deact_time_handler(ipmi_entity_t *entity,
1318
rv = ipmi_entity_get_auto_deactivate_time(entity, hs_get_deact_time_cb, NULL);
1320
cmd_win_out("Could not get auto-deactivate: error 0x%x\n", rv);
1324
hs_get_deact_time(char *cmd, char **toks, void *cb_data)
1326
entity_finder(cmd, toks, hs_get_deact_time_handler, NULL);
1331
hs_set_deact_time_cb(ipmi_entity_t *ent,
1336
ui_log("Could not get hot-swap deact time: error 0x%x\n", err);
1338
ui_log("hot-swap deact time set\n");
1342
hs_set_deact_time_handler(ipmi_entity_t *entity,
1348
unsigned int timeout;
1350
if (get_uint(toks, &timeout, "Hot swap deactivate time"))
1353
rv = ipmi_entity_set_auto_deactivate_time(entity, timeout,
1354
hs_set_deact_time_cb, NULL);
1356
cmd_win_out("Could not set auto-deactivate: error 0x%x\n", rv);
1360
hs_set_deact_time(char *cmd, char **toks, void *cb_data)
1362
entity_finder(cmd, toks, hs_set_deact_time_handler, NULL);
1367
hs_activation_request_cb(ipmi_entity_t *ent,
1372
ui_log("Could not activate entity: error 0x%x\n", err);
1374
ui_log("entity activated\n");
1378
hs_activation_request_handler(ipmi_entity_t *entity,
1385
rv = ipmi_entity_set_activation_requested(entity,
1386
hs_activation_request_cb,
1389
cmd_win_out("Could not set activation requested: error 0x%x\n", rv);
1393
hs_activation_request(char *cmd, char **toks, void *cb_data)
1395
entity_finder(cmd, toks, hs_activation_request_handler, NULL);
1400
hs_activate_cb(ipmi_entity_t *ent,
1405
ui_log("Could not activate entity: error 0x%x\n", err);
1407
ui_log("entity activated\n");
1411
hs_activate_handler(ipmi_entity_t *entity,
1418
rv = ipmi_entity_activate(entity, hs_activate_cb, NULL);
1420
cmd_win_out("Could not activate entity: error 0x%x\n", rv);
1424
hs_activate(char *cmd, char **toks, void *cb_data)
1426
entity_finder(cmd, toks, hs_activate_handler, NULL);
1431
hs_deactivate_cb(ipmi_entity_t *ent,
1436
ui_log("Could not deactivate entity: error 0x%x\n", err);
1438
ui_log("entity deactivated\n");
1442
hs_deactivate_handler(ipmi_entity_t *entity,
1449
rv = ipmi_entity_deactivate(entity, hs_deactivate_cb, NULL);
1451
cmd_win_out("Could not deactivate entity: error 0x%x\n", rv);
1455
hs_deactivate(char *cmd, char **toks, void *cb_data)
1457
entity_finder(cmd, toks, hs_deactivate_handler, NULL);
1462
hs_state_cb(ipmi_entity_t *ent,
1464
enum ipmi_hot_swap_states state,
1468
ui_log("Could not get hot-swap state: error 0x%x\n", err);
1470
ui_log("Hot-swap state is %s\n", ipmi_hot_swap_state_name(state));
1474
hs_state_handler(ipmi_entity_t *entity,
1481
rv = ipmi_entity_get_hot_swap_state(entity, hs_state_cb, NULL);
1483
cmd_win_out("Could not get entity state: error 0x%x\n", rv);
1487
hs_state(char *cmd, char **toks, void *cb_data)
1489
entity_finder(cmd, toks, hs_state_handler, NULL);
1494
hs_check_ent(ipmi_entity_t *entity, void *cb_data)
1496
ipmi_entity_check_hot_swap_state(entity);
1500
hs_check_cmder(ipmi_domain_t *domain, void *cb_data)
1502
ipmi_domain_iterate_entities(domain, hs_check_ent, NULL);
1506
hs_check_cmd(char *cmd, char **toks, void *cb_data)
1510
rv = ipmi_domain_pointer_cb(domain_id, hs_check_cmder, NULL);
1512
cmd_win_out("Unable to convert domain id to a pointer\n");
1522
sensors_handler(ipmi_entity_t *entity, ipmi_sensor_t *sensor, void *cb_data)
1526
char loc[MAX_ENTITY_LOC_SIZE];
1528
ipmi_sensor_get_id(sensor, name, 33);
1529
strcpy(name2, name);
1530
conv_from_spaces(name2);
1531
display_pad_out(" %s.%s - %s\n",
1532
get_entity_loc(entity, loc, sizeof(loc)),
1537
found_entity_for_sensors(ipmi_entity_t *entity,
1542
char loc[MAX_ENTITY_LOC_SIZE];
1544
curr_display_type = DISPLAY_SENSORS;
1545
display_pad_clear();
1546
display_pad_out("Sensors for entity %s:\n",
1547
get_entity_loc(entity, loc, sizeof(loc)));
1548
ipmi_entity_iterate_sensors(entity, sensors_handler, NULL);
1549
display_pad_refresh();
1553
sensors_cmd(char *cmd, char **toks, void *cb_data)
1555
entity_finder(cmd, toks, found_entity_for_sensors, NULL);
1559
struct sensor_info {
1564
/* Has this sensor been displayed yet? */
1565
int sensor_displayed;
1567
/* Decrement whenever the sensor is not displayed and data is
1568
recevied, when this hits zero it's time to display. */
1569
int sensor_ops_to_read_count;
1571
/* Return value from ipmi_states_get or ipmi_reading_get. */
1572
int sensor_read_err;
1574
/* Values from ipmi_reading_get. */
1575
enum ipmi_value_present_e sensor_value_present;
1576
unsigned int sensor_raw_val;
1579
/* Values from ipmi_states_get and ipmi_reading_get. */
1580
ipmi_states_t *sensor_states;
1582
/* Values from ipmi_sensor_event_enables_get. */
1583
int sensor_event_states_err;
1584
ipmi_event_state_t *sensor_event_states;
1586
/* Values from ipmi_thresholds_get */
1587
int sensor_read_thresh_err;
1588
ipmi_thresholds_t *sensor_thresholds;
1591
display_sensor(ipmi_entity_t *entity, ipmi_sensor_t *sensor)
1593
char loc[MAX_ENTITY_LOC_SIZE];
1595
char sname[IPMI_SENSOR_NAME_LEN];
1598
if (sensor_displayed)
1601
sensor_ops_to_read_count--;
1602
if (sensor_ops_to_read_count > 0)
1605
sensor_displayed = 1;
1607
ipmi_sensor_get_name(sensor, sname, sizeof(sname));
1609
ipmi_sensor_get_id(sensor, name, 33);
1610
display_pad_clear();
1612
conv_from_spaces(name);
1613
display_pad_out("Sensor %s.%s:\n",
1614
get_entity_loc(entity, loc, sizeof(loc)),
1616
if (ipmi_sensor_get_ignore_if_no_entity(sensor))
1617
display_pad_out(" ignore if entity not present\n");
1619
display_pad_out(" still there if entity not present\n");
1620
display_pad_out(" name = %s\n", sname);
1621
display_pad_out(" value = ");
1622
getyx(display_pad, value_pos.y, value_pos.x);
1623
if (!ipmi_entity_is_present(entity)
1624
&& ipmi_sensor_get_ignore_if_no_entity(sensor))
1626
display_pad_out("not present");
1628
if (sensor_read_err) {
1629
display_pad_out("unreadable");
1630
} else if (ipmi_sensor_get_event_reading_type(sensor)
1631
== IPMI_EVENT_READING_TYPE_THRESHOLD)
1633
if (sensor_value_present == IPMI_BOTH_VALUES_PRESENT)
1634
display_pad_out("%f (%2.2x)", sensor_val, sensor_raw_val);
1635
else if (sensor_value_present == IPMI_RAW_VALUE_PRESENT)
1636
display_pad_out("0x%x (RAW)", sensor_raw_val);
1638
display_pad_out("unreadable");
1641
for (i=0; i<15; i++) {
1643
val = ipmi_is_state_set(sensor_states, i);
1644
display_pad_out("%d", val != 0);
1648
display_pad_out("\n Events = ");
1649
getyx(display_pad, enabled_pos.y, enabled_pos.x);
1650
if (sensor_event_states_err)
1651
display_pad_out("? ");
1654
global_enable = ipmi_event_state_get_events_enabled
1655
(sensor_event_states);
1657
display_pad_out("enabled");
1659
display_pad_out("disabled");
1661
display_pad_out("\n Scanning = ");
1662
getyx(display_pad, scanning_pos.y, scanning_pos.x);
1663
if (sensor_event_states_err)
1664
display_pad_out("? ");
1666
int scanning_enable;
1667
scanning_enable = ipmi_event_state_get_scanning_enabled
1668
(sensor_event_states);
1669
if (scanning_enable)
1670
display_pad_out("enabled");
1672
display_pad_out("disabled");
1674
display_pad_out("\n Hysteresis = ");
1675
switch (ipmi_sensor_get_hysteresis_support(sensor)) {
1676
case IPMI_HYSTERESIS_SUPPORT_NONE: display_pad_out("none"); break;
1677
case IPMI_HYSTERESIS_SUPPORT_READABLE: display_pad_out("readable"); break;
1678
case IPMI_HYSTERESIS_SUPPORT_SETTABLE: display_pad_out("settable"); break;
1679
case IPMI_HYSTERESIS_SUPPORT_FIXED: display_pad_out("fixed"); break;
1680
default: display_pad_out("invalid"); break;
1682
display_pad_out("\n");
1683
display_pad_out(" sensor type = %s (0x%2.2x)\n",
1684
ipmi_sensor_get_sensor_type_string(sensor),
1685
ipmi_sensor_get_sensor_type(sensor));
1686
display_pad_out(" event/reading type = %s (0x%2.2x)\n",
1687
ipmi_sensor_get_event_reading_type_string(sensor),
1688
ipmi_sensor_get_event_reading_type(sensor));
1690
if (ipmi_sensor_get_event_reading_type(sensor)
1691
== IPMI_EVENT_READING_TYPE_THRESHOLD)
1693
enum ipmi_thresh_e t;
1696
display_pad_out(" units = %s%s",
1697
ipmi_sensor_get_base_unit_string(sensor),
1698
ipmi_sensor_get_rate_unit_string(sensor));
1699
switch(ipmi_sensor_get_modifier_unit_use(sensor)) {
1700
case IPMI_MODIFIER_UNIT_BASE_DIV_MOD:
1701
display_pad_out("/%s",
1702
ipmi_sensor_get_modifier_unit_string(sensor));
1705
case IPMI_MODIFIER_UNIT_BASE_MULT_MOD:
1706
display_pad_out("*%s",
1707
ipmi_sensor_get_modifier_unit_string(sensor));
1710
case IPMI_MODIFIER_UNIT_NONE:
1713
display_pad_out("\n");
1715
rv = ipmi_sensor_get_nominal_reading(sensor, &val);
1716
if (!rv) display_pad_out(" nominal = %f\n", val);
1718
rv = ipmi_sensor_get_normal_min(sensor, &val);
1719
if (!rv) display_pad_out(" normal_min = %f\n", val);
1721
rv = ipmi_sensor_get_normal_max(sensor, &val);
1722
if (!rv) display_pad_out(" normal_max = %f\n", val);
1724
rv = ipmi_sensor_get_sensor_min(sensor, &val);
1725
if (!rv) display_pad_out(" sensor_min = %f\n", val);
1727
rv = ipmi_sensor_get_sensor_max(sensor, &val);
1728
if (!rv) display_pad_out(" sensor_max = %f\n", val);
1730
display_pad_out("Thresholds:\n");
1731
for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++){
1732
int settable, readable;
1734
int assert_sup[2], deassert_sup[2];
1735
int anything_set = 0;
1737
ipmi_sensor_threshold_settable(sensor, t, &settable);
1738
anything_set |= settable;
1739
ipmi_sensor_threshold_readable(sensor, t, &readable);
1740
anything_set |= readable;
1741
for (i=0; i<=1; i++) {
1742
ipmi_sensor_threshold_event_supported(
1743
sensor, t, i, IPMI_ASSERTION, &(assert_sup[i]));
1744
anything_set |= assert_sup[i];
1745
ipmi_sensor_threshold_event_supported(
1746
sensor, t, i, IPMI_DEASSERTION, &(deassert_sup[i]));
1747
anything_set |= deassert_sup[i];
1750
display_pad_out(" %s:", ipmi_get_threshold_string(t));
1751
threshold_positions[t].set = 1;
1752
display_pad_out("\n available: ");
1753
if (readable) display_pad_out("R");
1754
else display_pad_out(" ");
1755
if (settable) display_pad_out("W");
1756
else display_pad_out(" ");
1757
if (assert_sup[0]) display_pad_out("L^");
1758
else display_pad_out(" ");
1759
if (deassert_sup[0]) display_pad_out("Lv");
1760
else display_pad_out(" ");
1761
if (assert_sup[1]) display_pad_out("H^");
1762
else display_pad_out(" ");
1763
if (deassert_sup[1]) display_pad_out("Hv");
1764
else display_pad_out(" ");
1765
display_pad_out("\n enabled: ");
1767
threshold_positions[t].enabled.y,
1768
threshold_positions[t].enabled.x);
1769
if (sensor_event_states_err)
1770
display_pad_out("? ");
1772
if (ipmi_is_threshold_event_set(sensor_event_states, t,
1775
display_pad_out("L^");
1777
display_pad_out(" ");
1778
if (ipmi_is_threshold_event_set(sensor_event_states, t,
1781
display_pad_out("Lv");
1783
display_pad_out(" ");
1784
if (ipmi_is_threshold_event_set(sensor_event_states, t,
1787
display_pad_out("H^");
1789
display_pad_out(" ");
1790
if (ipmi_is_threshold_event_set(sensor_event_states, t,
1793
display_pad_out("HV");
1795
display_pad_out(" ");
1798
display_pad_out("\n value: ");
1800
threshold_positions[t].value.y,
1801
threshold_positions[t].value.x);
1802
if (sensor_read_thresh_err)
1803
display_pad_out("?");
1806
rv = ipmi_threshold_get(sensor_thresholds, t, &val);
1808
display_pad_out("?", val);
1810
display_pad_out("%f", val);
1812
display_pad_out("\n out of range: ");
1814
threshold_positions[t].oor.y,
1815
threshold_positions[t].oor.x);
1816
if (!sensor_read_err) {
1817
if (ipmi_is_threshold_out_of_range(sensor_states, t))
1818
display_pad_out("true ");
1820
display_pad_out("false");
1822
display_pad_out("\n");
1824
threshold_positions[t].set = 0;
1831
/* A discrete sensor. */
1832
display_pad_out("\n Assertion: ");
1833
display_pad_out("\n available: ");
1834
for (i=0; i<15; i++) {
1835
ipmi_sensor_discrete_event_supported(sensor,
1839
display_pad_out("%d", val != 0);
1841
display_pad_out("\n enabled: ");
1842
getyx(display_pad, discr_assert_enab.y, discr_assert_enab.x);
1843
if (sensor_event_states_err)
1844
display_pad_out("?");
1846
for (i=0; i<15; i++) {
1847
val = ipmi_is_discrete_event_set(sensor_event_states,
1849
display_pad_out("%d", val != 0);
1853
display_pad_out("\n Deasertion: ");
1854
display_pad_out("\n available: ");
1855
for (i=0; i<15; i++) {
1856
ipmi_sensor_discrete_event_supported(sensor,
1860
display_pad_out("%d", val != 0);
1862
display_pad_out("\n enabled: ");
1863
getyx(display_pad, discr_deassert_enab.y, discr_deassert_enab.x);
1864
if (sensor_event_states_err)
1865
display_pad_out("?");
1867
for (i=0; i<15; i++) {
1868
val = ipmi_is_discrete_event_set(sensor_event_states,
1869
i, IPMI_DEASSERTION);
1870
display_pad_out("%d", val != 0);
1873
display_pad_out("\n");
1876
display_pad_refresh();
1880
read_sensor(ipmi_sensor_t *sensor,
1882
enum ipmi_value_present_e value_present,
1883
unsigned int raw_val,
1885
ipmi_states_t *states,
1888
ipmi_sensor_id_t sensor_id;
1889
enum ipmi_thresh_e t;
1892
if (sensor_displayed) {
1893
wmove(display_pad, value_pos.y, value_pos.x);
1894
display_pad_out("unreadable: %x", err);
1895
display_pad_refresh();
1897
curr_display_type = DISPLAY_NONE;
1902
sensor_id = ipmi_sensor_convert_to_id(sensor);
1903
if (!((curr_display_type == DISPLAY_SENSOR)
1904
&& (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0)))
1907
if (sensor_displayed) {
1908
wmove(display_pad, value_pos.y, value_pos.x);
1909
if (value_present == IPMI_BOTH_VALUES_PRESENT)
1910
display_pad_out("%f (%2.2x)", val, raw_val);
1911
else if (value_present == IPMI_RAW_VALUE_PRESENT)
1912
display_pad_out("0x%x (RAW)", raw_val);
1914
display_pad_out("unreadable");
1916
for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++) {
1917
if (threshold_positions[t].set) {
1919
threshold_positions[t].oor.y,
1920
threshold_positions[t].oor.x);
1921
if (ipmi_is_threshold_out_of_range(states, t))
1922
display_pad_out("true ");
1924
display_pad_out("false");
1927
display_pad_refresh();
1929
sensor_read_err = err;
1930
sensor_value_present = value_present;
1931
sensor_raw_val = raw_val;
1934
ipmi_copy_states(sensor_states, states);
1935
display_sensor(ipmi_sensor_get_entity(sensor), sensor);
1941
read_thresholds(ipmi_sensor_t *sensor,
1943
ipmi_thresholds_t *th,
1946
ipmi_sensor_id_t sensor_id;
1947
enum ipmi_thresh_e t;
1951
sensor_id = ipmi_sensor_convert_to_id(sensor);
1952
if (!((curr_display_type == DISPLAY_SENSOR)
1953
&& (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0)))
1956
if (sensor_displayed) {
1958
for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++)
1960
if (threshold_positions[t].set) {
1962
threshold_positions[t].value.y,
1963
threshold_positions[t].value.x);
1964
display_pad_out("?");
1968
for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++) {
1969
if (threshold_positions[t].set) {
1970
rv = ipmi_threshold_get(th, t, &val);
1972
threshold_positions[t].value.y,
1973
threshold_positions[t].value.x);
1975
display_pad_out("?", val);
1977
display_pad_out("%f", val);
1981
display_pad_refresh();
1983
sensor_read_thresh_err = err;
1985
ipmi_copy_thresholds(sensor_thresholds, th);
1986
display_sensor(ipmi_sensor_get_entity(sensor), sensor);
1991
read_thresh_event_enables(ipmi_sensor_t *sensor,
1993
ipmi_event_state_t *states,
1996
ipmi_sensor_id_t sensor_id;
1997
enum ipmi_thresh_e t;
1999
int scanning_enable;
2001
sensor_id = ipmi_sensor_convert_to_id(sensor);
2002
if (!((curr_display_type == DISPLAY_SENSOR)
2003
&& (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0)))
2006
if (sensor_displayed) {
2010
global_enable = ipmi_event_state_get_events_enabled(states);
2011
scanning_enable = ipmi_event_state_get_scanning_enabled(states);
2012
wmove(display_pad, enabled_pos.y, enabled_pos.x);
2014
display_pad_out("? ");
2015
else if (global_enable)
2016
display_pad_out("enabled");
2018
display_pad_out("disabled");
2020
wmove(display_pad, scanning_pos.y, scanning_pos.x);
2022
display_pad_out("? ");
2023
else if (scanning_enable)
2024
display_pad_out("enabled");
2026
display_pad_out("disabled");
2028
if (ipmi_sensor_get_event_support(sensor)
2029
!= IPMI_EVENT_SUPPORT_PER_STATE)
2032
for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++) {
2033
if (threshold_positions[t].set) {
2035
threshold_positions[t].enabled.y,
2036
threshold_positions[t].enabled.x);
2038
display_pad_out("? ");
2041
display_pad_out(" ");
2042
if (ipmi_is_threshold_event_set(states, t,
2045
display_pad_out("L^");
2047
display_pad_out(" ");
2048
if (ipmi_is_threshold_event_set(states, t,
2051
display_pad_out("Lv");
2053
display_pad_out(" ");
2054
if (ipmi_is_threshold_event_set(states, t,
2057
display_pad_out("H^");
2059
display_pad_out(" ");
2060
if (ipmi_is_threshold_event_set(states, t,
2063
display_pad_out("HV");
2065
display_pad_out(" ");
2070
display_pad_refresh();
2072
sensor_event_states_err = err;
2074
ipmi_copy_event_state(sensor_event_states, states);
2075
display_sensor(ipmi_sensor_get_entity(sensor), sensor);
2080
read_discrete_event_enables(ipmi_sensor_t *sensor,
2082
ipmi_event_state_t *states,
2085
ipmi_sensor_id_t sensor_id;
2089
int scanning_enable;
2091
sensor_id = ipmi_sensor_convert_to_id(sensor);
2092
if (!((curr_display_type == DISPLAY_SENSOR)
2093
&& (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0)))
2096
if (sensor_displayed) {
2097
global_enable = ipmi_event_state_get_events_enabled(states);
2098
scanning_enable = ipmi_event_state_get_scanning_enabled(states);
2100
wmove(display_pad, enabled_pos.y, enabled_pos.x);
2102
display_pad_out("? ");
2103
else if (global_enable)
2104
display_pad_out("enabled");
2106
display_pad_out("disabled");
2108
wmove(display_pad, scanning_pos.y, scanning_pos.x);
2110
display_pad_out("? ");
2111
else if (scanning_enable)
2112
display_pad_out("enabled");
2114
display_pad_out("disabled");
2116
if (ipmi_sensor_get_event_support(sensor)
2117
!= IPMI_EVENT_SUPPORT_PER_STATE)
2121
wmove(display_pad, discr_assert_enab.y, discr_assert_enab.x);
2122
display_pad_out("?");
2123
wmove(display_pad, discr_deassert_enab.y, discr_deassert_enab.x);
2124
display_pad_out("?");
2126
wmove(display_pad, discr_assert_enab.y, discr_assert_enab.x);
2127
for (i=0; i<15; i++) {
2128
val = ipmi_is_discrete_event_set(states, i, IPMI_ASSERTION);
2129
display_pad_out("%d", val != 0);
2131
wmove(display_pad, discr_deassert_enab.y, discr_deassert_enab.x);
2132
for (i=0; i<15; i++) {
2133
val = ipmi_is_discrete_event_set(states, i, IPMI_DEASSERTION);
2134
display_pad_out("%d", val != 0);
2138
display_pad_refresh();
2140
sensor_event_states_err = err;
2142
ipmi_copy_event_state(sensor_event_states, states);
2143
display_sensor(ipmi_sensor_get_entity(sensor), sensor);
2148
read_states(ipmi_sensor_t *sensor,
2150
ipmi_states_t *states,
2153
ipmi_sensor_id_t sensor_id;
2157
sensor_id = ipmi_sensor_convert_to_id(sensor);
2158
if (!((curr_display_type == DISPLAY_SENSOR)
2159
&& (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0)))
2162
if (sensor_displayed) {
2163
wmove(display_pad, value_pos.y, value_pos.x);
2165
display_pad_out("?");
2167
for (i=0; i<15; i++) {
2168
val = ipmi_is_state_set(states, i);
2169
display_pad_out("%d", val != 0);
2172
display_pad_refresh();
2174
sensor_read_err = err;
2176
ipmi_copy_states(sensor_states, states);
2177
display_sensor(ipmi_sensor_get_entity(sensor), sensor);
2182
redisplay_sensor(ipmi_sensor_t *sensor, void *cb_data)
2185
ipmi_entity_t *entity;
2187
entity = ipmi_sensor_get_entity(sensor);
2191
if (!ipmi_entity_is_present(entity)
2192
&& ipmi_sensor_get_ignore_if_no_entity(sensor))
2194
wmove(display_pad, value_pos.y, value_pos.x);
2195
display_pad_out("not present");
2199
if (ipmi_sensor_get_event_reading_type(sensor)
2200
== IPMI_EVENT_READING_TYPE_THRESHOLD)
2202
rv = ipmi_sensor_get_reading(sensor, read_sensor, NULL);
2204
ui_log("redisplay_sensor: Unable to get sensor reading: 0x%x\n",
2207
switch (ipmi_sensor_get_threshold_access(sensor))
2209
case IPMI_THRESHOLD_ACCESS_SUPPORT_READABLE:
2210
case IPMI_THRESHOLD_ACCESS_SUPPORT_SETTABLE:
2211
rv = ipmi_sensor_get_thresholds(sensor, read_thresholds, NULL);
2213
ui_log("Unable to get threshold values: 0x%x\n", rv);
2220
switch (ipmi_sensor_get_event_support(sensor))
2222
case IPMI_EVENT_SUPPORT_PER_STATE:
2223
case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR:
2224
rv = ipmi_sensor_get_event_enables(sensor,
2225
read_thresh_event_enables,
2228
ui_log("Unable to get event values: 0x%x\n", rv);
2235
rv = ipmi_sensor_get_states(sensor, read_states, NULL);
2237
ui_log("Unable to get sensor reading: 0x%x\n", rv);
2239
switch (ipmi_sensor_get_event_support(sensor))
2241
case IPMI_EVENT_SUPPORT_PER_STATE:
2242
case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR:
2243
rv = ipmi_sensor_get_event_enables(sensor,
2244
read_discrete_event_enables,
2247
ui_log("Unable to get event values: 0x%x\n", rv);
2257
sensor_handler(ipmi_entity_t *entity, ipmi_sensor_t *sensor, void *cb_data)
2260
struct sensor_info *sinfo = cb_data;
2264
ipmi_sensor_get_id(sensor, name, 33);
2265
if (strcmp(name, sinfo->name) == 0) {
2267
curr_display_type = DISPLAY_SENSOR;
2268
curr_sensor_id = ipmi_sensor_convert_to_id(sensor);
2270
sensor_displayed = 0;
2271
sensor_ops_to_read_count = 1;
2272
if (! ipmi_entity_is_present(entity)
2273
&& ipmi_sensor_get_ignore_if_no_entity(sensor))
2277
if (ipmi_sensor_get_event_reading_type(sensor)
2278
== IPMI_EVENT_READING_TYPE_THRESHOLD)
2281
sensor_ops_to_read_count++;
2282
rv = ipmi_sensor_get_reading(sensor, read_sensor, NULL);
2284
ui_log("Unable to get sensor reading: 0x%x\n", rv);
2286
switch (ipmi_sensor_get_threshold_access(sensor))
2288
case IPMI_THRESHOLD_ACCESS_SUPPORT_READABLE:
2289
case IPMI_THRESHOLD_ACCESS_SUPPORT_SETTABLE:
2290
sensor_ops_to_read_count++;
2291
rv = ipmi_sensor_get_thresholds(sensor, read_thresholds,
2294
ui_log("Unable to get threshold values: 0x%x\n", rv);
2301
switch (ipmi_sensor_get_event_support(sensor))
2303
case IPMI_EVENT_SUPPORT_PER_STATE:
2304
case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR:
2305
sensor_ops_to_read_count++;
2306
rv = ipmi_sensor_get_event_enables
2308
read_thresh_event_enables,
2311
ui_log("Unable to get event values: 0x%x\n", rv);
2320
sensor_ops_to_read_count++;
2321
rv = ipmi_sensor_get_states(sensor, read_states, NULL);
2323
ui_log("Unable to get sensor reading: 0x%x\n", rv);
2325
switch (ipmi_sensor_get_event_support(sensor))
2327
case IPMI_EVENT_SUPPORT_PER_STATE:
2328
case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR:
2329
sensor_ops_to_read_count++;
2330
rv = ipmi_sensor_get_event_enables
2332
read_discrete_event_enables,
2335
ui_log("Unable to get event values: 0x%x\n", rv);
2343
display_sensor(entity, sensor);
2345
display_pad_refresh();
2350
found_entity_for_sensor(ipmi_entity_t *entity,
2355
struct sensor_info sinfo;
2357
sinfo.name = strtok_r(NULL, "", toks2);
2359
cmd_win_out("Invalid sensor given\n");
2362
conv_to_spaces(sinfo.name);
2365
ipmi_entity_iterate_sensors(entity, sensor_handler, &sinfo);
2367
char loc[MAX_ENTITY_LOC_SIZE];
2369
conv_from_spaces(sinfo.name);
2370
cmd_win_out("Sensor %s.%s not found\n",
2371
get_entity_loc(entity, loc, sizeof(loc)),
2378
sensor_cmd(char *cmd, char **toks, void *cb_data)
2380
entity_finder(cmd, toks, found_entity_for_sensor, NULL);
2384
typedef struct events_enable_info_s
2386
ipmi_event_state_t *states;
2387
} events_enable_info_t;
2390
events_enable_done(ipmi_sensor_t *sensor,
2395
ui_log("Error setting events enable: 0x%x", err);
2399
events_enable(ipmi_sensor_t *sensor, void *cb_data)
2401
events_enable_info_t *info = cb_data;
2404
rv = ipmi_sensor_set_event_enables(sensor, info->states,
2405
events_enable_done, NULL);
2407
ui_log("Error sending events enable: 0x%x", rv);
2408
ipmi_mem_free(info);
2412
events_enable_cmd(char *cmd, char **toks, void *cb_data)
2414
events_enable_info_t *info;
2415
unsigned char enable;
2420
info = ipmi_mem_alloc(sizeof(*info));
2422
cmd_win_out("Out of memory\n");
2426
info->states = ipmi_mem_alloc(ipmi_event_state_size());
2427
if (!info->states) {
2428
ipmi_mem_free(info);
2429
cmd_win_out("Out of memory\n");
2433
ipmi_event_state_init(info->states);
2435
if (get_uchar(toks, &enable, "events"))
2437
ipmi_event_state_set_events_enabled(info->states, enable);
2439
if (get_uchar(toks, &enable, "scanning"))
2441
ipmi_event_state_set_scanning_enabled(info->states, enable);
2443
enptr = strtok_r(NULL, " \t\n", toks);
2445
cmd_win_out("No assertion mask given\n");
2448
for (i=0; enptr[i]!='\0'; i++) {
2449
if (enptr[i] == '1')
2450
ipmi_discrete_event_set(info->states, i, IPMI_ASSERTION);
2451
else if (enptr[i] == '0')
2452
ipmi_discrete_event_clear(info->states, i, IPMI_ASSERTION);
2454
cmd_win_out("Invalid assertion value\n");
2459
enptr = strtok_r(NULL, " \t\n", toks);
2461
cmd_win_out("No deassertion mask given\n");
2464
for (i=0; enptr[i]!='\0'; i++) {
2465
if (enptr[i] == '1')
2466
ipmi_discrete_event_set(info->states, i, IPMI_DEASSERTION);
2467
else if (enptr[i] == '0')
2468
ipmi_discrete_event_clear(info->states, i, IPMI_DEASSERTION);
2470
cmd_win_out("Invalid deassertion value\n");
2475
rv = ipmi_sensor_pointer_cb(curr_sensor_id, events_enable, info);
2477
cmd_win_out("Unable to get sensor pointer: 0x%x\n", rv);
2478
ipmi_mem_free(info);
2484
controls_handler(ipmi_entity_t *entity, ipmi_control_t *control, void *cb_data)
2486
char loc[MAX_ENTITY_LOC_SIZE];
2490
ipmi_control_get_id(control, name, 33);
2491
strcpy(name2, name);
2492
conv_from_spaces(name2);
2493
display_pad_out(" %s.%s - %s\n",
2494
get_entity_loc(entity, loc, sizeof(loc)),
2499
found_entity_for_controls(ipmi_entity_t *entity,
2504
char loc[MAX_ENTITY_LOC_SIZE];
2506
curr_display_type = DISPLAY_CONTROLS;
2507
display_pad_clear();
2508
display_pad_out("Controls for entity %s:\n",
2509
get_entity_loc(entity, loc, sizeof(loc)));
2510
ipmi_entity_iterate_controls(entity, controls_handler, NULL);
2511
display_pad_refresh();
2515
controls_cmd(char *cmd, char **toks, void *cb_data)
2517
entity_finder(cmd, toks, found_entity_for_controls, NULL);
2521
int control_displayed;
2522
int control_ops_to_read_count;
2523
int control_read_err;
2524
int *normal_control_vals;
2525
ipmi_light_setting_t *light_control_val;
2526
int id_control_length;
2527
unsigned char *id_control_vals;
2530
display_control(ipmi_entity_t *entity, ipmi_control_t *control)
2532
char loc[MAX_ENTITY_LOC_SIZE];
2535
char cname[IPMI_CONTROL_NAME_LEN];
2539
if (control_displayed)
2542
control_ops_to_read_count--;
2543
if (control_ops_to_read_count > 0)
2546
control_displayed = 1;
2548
ipmi_control_get_id(control, name, 33);
2549
curr_control_id = ipmi_control_convert_to_id(control);
2551
display_pad_clear();
2553
conv_from_spaces(name);
2554
display_pad_out("Control %s.%s:\n",
2555
get_entity_loc(entity, loc, sizeof(loc)),
2557
if (ipmi_control_get_ignore_if_no_entity(control))
2558
display_pad_out(" ignore if entity not present\n");
2560
display_pad_out(" still there if entity not present\n");
2561
ipmi_control_get_name(control, cname, sizeof(cname));
2562
display_pad_out(" name = %s\n", cname);
2563
control_type = ipmi_control_get_type(control);
2564
display_pad_out(" type = %s (%d)\n",
2565
ipmi_control_get_type_string(control), control_type);
2566
num_vals = ipmi_control_get_num_vals(control);
2567
switch (control_type) {
2568
case IPMI_CONTROL_LIGHT:
2569
case IPMI_CONTROL_RELAY:
2570
case IPMI_CONTROL_ALARM:
2571
case IPMI_CONTROL_RESET:
2572
case IPMI_CONTROL_ONE_SHOT_RESET:
2573
case IPMI_CONTROL_POWER:
2574
case IPMI_CONTROL_FAN_SPEED:
2575
case IPMI_CONTROL_OUTPUT:
2576
case IPMI_CONTROL_ONE_SHOT_OUTPUT:
2577
display_pad_out(" num entities = %d\n", num_vals);
2580
case IPMI_CONTROL_DISPLAY:
2581
case IPMI_CONTROL_IDENTIFIER:
2584
display_pad_out(" value = ");
2585
getyx(display_pad, value_pos.y, value_pos.x);
2587
if (! ipmi_control_is_readable(control)) {
2588
display_pad_out("not readable");
2589
} else if (control_read_err) {
2590
/* Nothing to do. */
2592
switch (control_type) {
2593
case IPMI_CONTROL_LIGHT:
2594
if (ipmi_control_light_set_with_setting(control)) {
2595
if (light_control_val) {
2596
ipmi_light_setting_t *setting = light_control_val;
2597
for (i=0; i<num_vals; ) {
2598
int color, on, off, lc;
2599
ipmi_light_setting_get_color(setting, i, &color);
2600
ipmi_light_setting_get_on_time(setting, i, &on);
2601
ipmi_light_setting_get_off_time(setting, i, &off);
2602
ipmi_light_setting_in_local_control(setting, i,
2604
wmove(display_pad, value_pos.y+i, value_pos.x);
2605
display_pad_out("0x%x 0x%x 0x%x %s",
2607
lc ? "local cnt": " ");
2610
display_pad_out("\n ");
2612
ipmi_free_light_settings(light_control_val);
2613
light_control_val = NULL;
2615
display_pad_out("error reading values");
2621
case IPMI_CONTROL_RELAY:
2622
case IPMI_CONTROL_ALARM:
2623
case IPMI_CONTROL_RESET:
2624
case IPMI_CONTROL_ONE_SHOT_RESET:
2625
case IPMI_CONTROL_POWER:
2626
case IPMI_CONTROL_FAN_SPEED:
2627
case IPMI_CONTROL_OUTPUT:
2628
case IPMI_CONTROL_ONE_SHOT_OUTPUT:
2629
if (normal_control_vals) {
2630
for (i=0; i<num_vals; ) {
2631
display_pad_out("%d (0x%x)", normal_control_vals[i],
2632
normal_control_vals[i]);
2635
display_pad_out("\n ");
2637
ipmi_mem_free(normal_control_vals);
2638
normal_control_vals = NULL;
2640
display_pad_out("error reading values");
2644
case IPMI_CONTROL_DISPLAY:
2647
case IPMI_CONTROL_IDENTIFIER:
2648
if (id_control_vals) {
2649
for (i=0; i<id_control_length;) {
2650
display_pad_out("0x%2.2x\n", id_control_vals[i]);
2653
display_pad_out("\n ");
2655
ipmi_mem_free(id_control_vals);
2656
id_control_vals = NULL;
2658
display_pad_out("error reading values");
2663
display_pad_out("\n");
2665
display_pad_refresh();
2669
light_control_val_read(ipmi_control_t *control,
2671
ipmi_light_setting_t *setting,
2674
ipmi_control_id_t control_id;
2678
if (control == NULL) {
2679
/* The control went away, stop the operation. */
2680
wmove(display_pad, value_pos.y, value_pos.x);
2681
display_pad_out("invalid");
2682
curr_display_type = DISPLAY_NONE;
2685
control_id = ipmi_control_convert_to_id(control);
2686
if (!((curr_display_type == DISPLAY_CONTROL)
2687
&& (ipmi_cmp_control_id(control_id, curr_control_id) == 0)))
2690
num_vals = ipmi_control_get_num_vals(control);
2692
if (control_displayed) {
2694
wmove(display_pad, value_pos.y, value_pos.x);
2695
display_pad_out("?");
2697
for (i=0; i<num_vals; i++) {
2698
int color, on, off, lc;
2699
ipmi_light_setting_get_color(setting, i, &color);
2700
ipmi_light_setting_get_on_time(setting, i, &on);
2701
ipmi_light_setting_get_off_time(setting, i, &off);
2702
ipmi_light_setting_in_local_control(setting, i, &lc);
2703
wmove(display_pad, value_pos.y+i, value_pos.x);
2704
display_pad_out("0x%x 0x%x 0x%x %s",
2706
lc ? "local cnt": " ");
2709
display_pad_refresh();
2711
if (light_control_val)
2712
ipmi_free_light_settings(light_control_val);
2714
light_control_val = NULL;
2716
light_control_val = ipmi_light_settings_dup(setting);
2718
display_control(ipmi_control_get_entity(control), control);
2723
normal_control_val_read(ipmi_control_t *control,
2728
ipmi_control_id_t control_id;
2732
if (control == NULL) {
2733
/* The control went away, stop the operation. */
2734
wmove(display_pad, value_pos.y, value_pos.x);
2735
display_pad_out("invalid");
2736
curr_display_type = DISPLAY_NONE;
2739
control_id = ipmi_control_convert_to_id(control);
2740
if (!((curr_display_type == DISPLAY_CONTROL)
2741
&& (ipmi_cmp_control_id(control_id, curr_control_id) == 0)))
2744
num_vals = ipmi_control_get_num_vals(control);
2746
if (control_displayed) {
2748
wmove(display_pad, value_pos.y, value_pos.x);
2749
display_pad_out("?");
2751
for (i=0; i<num_vals; i++) {
2752
wmove(display_pad, value_pos.y+i, value_pos.x);
2753
display_pad_out("%d (0x%x)", val[i], val[i]);
2756
display_pad_refresh();
2759
if (normal_control_vals)
2760
ipmi_mem_free(normal_control_vals);
2761
normal_control_vals = NULL;
2763
normal_control_vals = ipmi_mem_alloc(sizeof(int) * num_vals);
2764
if (normal_control_vals) {
2765
memcpy(normal_control_vals, val, sizeof(int) * num_vals);
2768
display_control(ipmi_control_get_entity(control), control);
2773
identifier_control_val_read(ipmi_control_t *control,
2779
ipmi_control_id_t control_id;
2782
if (control == NULL) {
2783
/* The control went away, stop the operation. */
2784
wmove(display_pad, value_pos.y, value_pos.x);
2785
display_pad_out("invalid");
2786
curr_display_type = DISPLAY_NONE;
2790
control_id = ipmi_control_convert_to_id(control);
2791
if (!((curr_display_type == DISPLAY_CONTROL)
2792
&& (ipmi_cmp_control_id(control_id, curr_control_id) == 0)))
2795
if (control_displayed) {
2797
wmove(display_pad, value_pos.y, value_pos.x);
2798
display_pad_out("?");
2800
wmove(display_pad, value_pos.y, value_pos.x);
2801
for (i=0; i<length; i++) {
2802
display_pad_out("0x%2.2x", val[i]);
2804
display_pad_out("\n ");
2807
display_pad_refresh();
2810
if (id_control_vals)
2811
ipmi_mem_free(id_control_vals);
2812
id_control_vals = NULL;
2814
id_control_length = length;
2815
id_control_vals = ipmi_mem_alloc(sizeof(unsigned char) * length);
2816
if (id_control_vals) {
2817
memcpy(id_control_vals, val, sizeof(unsigned char) * length);
2819
display_control(ipmi_control_get_entity(control), control);
2825
redisplay_control(ipmi_control_t *control, void *cb_data)
2828
ipmi_entity_t *entity;
2830
entity = ipmi_control_get_entity(control);
2834
if (! ipmi_control_is_readable(control)) {
2835
wmove(display_pad, value_pos.y, value_pos.x);
2836
display_pad_out("not readable");
2837
display_pad_refresh();
2841
if (!ipmi_entity_is_present(entity)
2842
&& ipmi_control_get_ignore_if_no_entity(control))
2844
wmove(display_pad, value_pos.y, value_pos.x);
2845
display_pad_out("not present");
2846
display_pad_refresh();
2850
control_type = ipmi_control_get_type(control);
2851
switch (control_type) {
2852
case IPMI_CONTROL_LIGHT:
2853
if (ipmi_control_light_set_with_setting(control)) {
2854
ipmi_control_get_light(control, light_control_val_read, NULL);
2858
case IPMI_CONTROL_RELAY:
2859
case IPMI_CONTROL_ALARM:
2860
case IPMI_CONTROL_RESET:
2861
case IPMI_CONTROL_ONE_SHOT_RESET:
2862
case IPMI_CONTROL_POWER:
2863
case IPMI_CONTROL_FAN_SPEED:
2864
case IPMI_CONTROL_OUTPUT:
2865
case IPMI_CONTROL_ONE_SHOT_OUTPUT:
2866
ipmi_control_get_val(control, normal_control_val_read, NULL);
2869
case IPMI_CONTROL_DISPLAY:
2872
case IPMI_CONTROL_IDENTIFIER:
2873
ipmi_control_identifier_get_val(control,
2874
identifier_control_val_read,
2880
struct control_info {
2882
unsigned char *name;
2886
control_handler(ipmi_entity_t *entity, ipmi_control_t *control, void *cb_data)
2888
struct control_info *iinfo = cb_data;
2894
ipmi_control_get_id(control, name, 33);
2895
if (strcmp(name, iinfo->name) == 0) {
2897
curr_display_type = DISPLAY_CONTROL;
2899
curr_control_id = ipmi_control_convert_to_id(control);
2901
control_ops_to_read_count = 1;
2903
control_displayed = 0;
2905
if (! ipmi_control_is_readable(control)) {
2906
/* If the control can't be read, then just display it now. */
2907
display_control(entity, control);
2911
control_type = ipmi_control_get_type(control);
2912
switch (control_type) {
2913
case IPMI_CONTROL_LIGHT:
2914
if (ipmi_control_light_set_with_setting(control)) {
2915
control_ops_to_read_count++;
2916
rv = ipmi_control_get_light(control, light_control_val_read,
2919
ui_log("Unable to read light control val: 0x%x\n", rv);
2924
case IPMI_CONTROL_RELAY:
2925
case IPMI_CONTROL_ALARM:
2926
case IPMI_CONTROL_RESET:
2927
case IPMI_CONTROL_ONE_SHOT_RESET:
2928
case IPMI_CONTROL_POWER:
2929
case IPMI_CONTROL_FAN_SPEED:
2930
case IPMI_CONTROL_OUTPUT:
2931
case IPMI_CONTROL_ONE_SHOT_OUTPUT:
2932
control_ops_to_read_count++;
2933
rv = ipmi_control_get_val(control, normal_control_val_read, NULL);
2935
ui_log("Unable to read control val: 0x%x\n", rv);
2939
case IPMI_CONTROL_DISPLAY:
2942
case IPMI_CONTROL_IDENTIFIER:
2943
control_ops_to_read_count++;
2944
rv = ipmi_control_identifier_get_val(control,
2945
identifier_control_val_read,
2948
ui_log("Unable to read control val: 0x%x\n", rv);
2953
display_control(entity, control);
2958
found_entity_for_control(ipmi_entity_t *entity,
2963
struct control_info iinfo;
2965
iinfo.name = strtok_r(NULL, "", toks2);
2967
cmd_win_out("Invalid control given\n");
2970
conv_to_spaces(iinfo.name);
2973
ipmi_entity_iterate_controls(entity, control_handler, &iinfo);
2975
char loc[MAX_ENTITY_LOC_SIZE];
2977
conv_from_spaces(iinfo.name);
2978
cmd_win_out("Control %s.%s not found\n",
2979
get_entity_loc(entity, loc, sizeof(loc)),
2986
control_cmd(char *cmd, char **toks, void *cb_data)
2988
entity_finder(cmd, toks, found_entity_for_control, NULL);
2992
typedef struct rearm_info_s
2995
ipmi_event_state_t *states;
2999
rearm_done(ipmi_sensor_t *sensor,
3004
ui_log("Error rearming sensor: 0x%x", err);
3008
rearm(ipmi_sensor_t *sensor, void *cb_data)
3010
rearm_info_t *info = cb_data;
3013
rv = ipmi_sensor_rearm(sensor, info->global, info->states,
3016
ui_log("Error sending rearm: 0x%x", rv);
3018
ipmi_mem_free(info->states);
3019
ipmi_mem_free(info);
3023
rearm_cmd(char *cmd, char **toks, void *cb_data)
3026
unsigned char global;
3031
info = ipmi_mem_alloc(sizeof(*info));
3033
cmd_win_out("Out of memory\n");
3037
info->states = NULL;
3039
if (get_uchar(toks, &global, "global rearm"))
3041
info->global = global;
3044
info->states = ipmi_mem_alloc(ipmi_event_state_size());
3045
if (!info->states) {
3046
ipmi_mem_free(info);
3047
cmd_win_out("Out of memory\n");
3051
ipmi_event_state_init(info->states);
3053
enptr = strtok_r(NULL, " \t\n", toks);
3055
cmd_win_out("No assertion mask given\n");
3058
for (i=0; enptr[i]!='\0'; i++) {
3059
if (enptr[i] == '1')
3060
ipmi_discrete_event_set(info->states, i, IPMI_ASSERTION);
3061
else if (enptr[i] == '0')
3062
ipmi_discrete_event_clear(info->states, i, IPMI_ASSERTION);
3064
cmd_win_out("Invalid assertion value\n");
3069
enptr = strtok_r(NULL, " \t\n", toks);
3071
cmd_win_out("No deassertion mask given\n");
3074
for (i=0; enptr[i]!='\0'; i++) {
3075
if (enptr[i] == '1')
3076
ipmi_discrete_event_set(info->states, i, IPMI_DEASSERTION);
3077
else if (enptr[i] == '0')
3078
ipmi_discrete_event_clear(info->states, i, IPMI_DEASSERTION);
3080
cmd_win_out("Invalid deassertion value\n");
3086
rv = ipmi_sensor_pointer_cb(curr_sensor_id, rearm, info);
3088
cmd_win_out("Unable to get sensor pointer: 0x%x\n", rv);
3096
ipmi_mem_free(info->states);
3097
ipmi_mem_free(info);
3103
set_hysteresis_done(ipmi_sensor_t *sensor,
3108
ui_log("Error setting hysteresis: 0x%x", err);
3110
ui_log("Hysteresis set");
3114
set_hysteresis_cmd(char *cmd, char **toks, void *cb_data)
3116
unsigned char physt, nhyst;
3119
if (get_uchar(toks, &physt, "positive hysteresis value"))
3122
if (get_uchar(toks, &nhyst, "negative hysteresis value"))
3125
rv = ipmi_sensor_id_set_hysteresis(curr_sensor_id, physt, nhyst,
3126
set_hysteresis_done, NULL);
3128
cmd_win_out("Unable to set hysteresis: 0x%x\n", rv);
3137
get_hysteresis_done(ipmi_sensor_t *sensor,
3139
unsigned int positive_hysteresis,
3140
unsigned int negative_hysteresis,
3144
ui_log("Error setting hysteresis: 0x%x", err);
3146
ui_log("Hysteresis values: positive = 0x%x, negative = 0x%x",
3147
positive_hysteresis, negative_hysteresis);
3151
get_hysteresis_cmd(char *cmd, char **toks, void *cb_data)
3155
rv = ipmi_sensor_id_get_hysteresis(curr_sensor_id,
3156
get_hysteresis_done, NULL);
3158
cmd_win_out("Unable to get hysteresis: 0x%x\n", rv);
3167
dump_fru_str(ipmi_fru_t *fru,
3169
int (*glen)(ipmi_fru_t *fru,
3170
unsigned int *length),
3171
int (*gtype)(ipmi_fru_t *fru,
3172
enum ipmi_str_type_e *type),
3173
int (*gstr)(ipmi_fru_t *fru,
3175
unsigned int *strlen))
3177
enum ipmi_str_type_e type;
3182
rv = gtype(fru, &type);
3185
display_pad_out(" Error fetching type for %s: %x\n", str, rv);
3189
if (type == IPMI_BINARY_STR) {
3190
display_pad_out(" %s is in binary\n", str);
3192
} else if (type == IPMI_UNICODE_STR) {
3193
display_pad_out(" %s is in unicode\n", str);
3195
} else if (type != IPMI_ASCII_STR) {
3196
display_pad_out(" %s is in unknown format\n", str);
3201
rv = gstr(fru, buf, &len);
3203
display_pad_out(" Error fetching string for %s: %x\n", str, rv);
3207
display_pad_out(" %s: %s\n", str, buf);
3212
dump_fru_custom_str(ipmi_fru_t *fru,
3215
int (*glen)(ipmi_fru_t *fru,
3217
unsigned int *length),
3218
int (*gtype)(ipmi_fru_t *fru,
3220
enum ipmi_str_type_e *type),
3221
int (*gstr)(ipmi_fru_t *fru,
3224
unsigned int *strlen))
3226
enum ipmi_str_type_e type;
3231
rv = gtype(fru, num, &type);
3235
if (type == IPMI_BINARY_STR) {
3236
display_pad_out(" %s custom %d is in binary\n", str, num);
3238
} else if (type == IPMI_UNICODE_STR) {
3239
display_pad_out(" %s custom %d is in unicode\n", str, num);
3241
} else if (type != IPMI_ASCII_STR) {
3242
display_pad_out(" %s custom %d is in unknown format\n", str, num);
3247
rv = gstr(fru, num, buf, &len);
3249
display_pad_out(" Error fetching string for %s custom %d: %x\n",
3254
display_pad_out(" %s custom %d: %s\n", str, num, buf);
3258
#define DUMP_FRU_STR(name, str) \
3259
dump_fru_str(fru, str, ipmi_fru_get_ ## name ## _len, \
3260
ipmi_fru_get_ ## name ## _type, \
3261
ipmi_fru_get_ ## name)
3263
#define DUMP_FRU_CUSTOM_STR(name, str) \
3266
for (i=0; ; i++) { \
3267
_rv = dump_fru_custom_str(fru, str, i, \
3268
ipmi_fru_get_ ## name ## _custom_len, \
3269
ipmi_fru_get_ ## name ## _custom_type, \
3270
ipmi_fru_get_ ## name ## _custom); \
3277
dump_fru_info(ipmi_fru_t *fru)
3279
unsigned char ucval;
3285
rv = ipmi_fru_get_internal_use_version(fru, &ucval);
3287
display_pad_out(" internal area version: 0x%2.2x\n", ucval);
3289
rv = ipmi_fru_get_internal_use_length(fru, &uival);
3291
display_pad_out(" internal area length: %d\n", uival);
3293
/* FIXME - dump internal use data. */
3295
rv = ipmi_fru_get_chassis_info_version(fru, &ucval);
3297
display_pad_out(" chassis info version: 0x%2.2x\n", ucval);
3299
rv = ipmi_fru_get_chassis_info_type(fru, &ucval);
3301
display_pad_out(" chassis info type: 0x%2.2x\n", ucval);
3303
DUMP_FRU_STR(chassis_info_part_number, "chassis info part number");
3304
DUMP_FRU_STR(chassis_info_serial_number, "chassis info serial number");
3305
DUMP_FRU_CUSTOM_STR(chassis_info, "chassis info");
3307
rv = ipmi_fru_get_board_info_version(fru, &ucval);
3309
display_pad_out(" board info version: 0x%2.2x\n", ucval);
3311
rv = ipmi_fru_get_board_info_lang_code(fru, &ucval);
3313
display_pad_out(" board info lang code: 0x%2.2x\n", ucval);
3315
rv = ipmi_fru_get_board_info_mfg_time(fru, &tval);
3317
display_pad_out(" board info mfg time: %ld\n", (long) tval);
3319
DUMP_FRU_STR(board_info_board_manufacturer,
3320
"board info board manufacturer");
3321
DUMP_FRU_STR(board_info_board_product_name,
3322
"board info board product name");
3323
DUMP_FRU_STR(board_info_board_serial_number,
3324
"board info board serial number");
3325
DUMP_FRU_STR(board_info_board_part_number,
3326
"board info board part number");
3327
DUMP_FRU_STR(board_info_fru_file_id, "board info fru file id");
3328
DUMP_FRU_CUSTOM_STR(board_info, "board info");
3330
rv = ipmi_fru_get_product_info_version(fru, &ucval);
3332
display_pad_out(" product info version: 0x%2.2x\n", ucval);
3334
rv = ipmi_fru_get_product_info_lang_code(fru, &ucval);
3336
display_pad_out(" product info lang code: 0x%2.2x\n", ucval);
3338
DUMP_FRU_STR(product_info_manufacturer_name,
3339
"product info manufacturer name");
3340
DUMP_FRU_STR(product_info_product_name, "product info product name");
3341
DUMP_FRU_STR(product_info_product_part_model_number,
3342
"product info product part model number");
3343
DUMP_FRU_STR(product_info_product_version, "product info product version");
3344
DUMP_FRU_STR(product_info_product_serial_number,
3345
"product info product serial number");
3346
DUMP_FRU_STR(product_info_asset_tag, "product info asset tag");
3347
DUMP_FRU_STR(product_info_fru_file_id, "product info fru file id");
3348
DUMP_FRU_CUSTOM_STR(product_info, "product info");
3349
num_multi = ipmi_fru_get_num_multi_records(fru);
3350
for (i=0; i<num_multi; i++) {
3351
unsigned char type, ver;
3354
unsigned char *data;
3356
rv = ipmi_fru_get_multi_record_type(fru, i, &type);
3358
display_pad_out(" multi-record %d, error getting type: %x\n", rv);
3359
rv = ipmi_fru_get_multi_record_format_version(fru, i, &ver);
3361
display_pad_out(" multi-record %d, error getting ver: %x\n", rv);
3363
display_pad_out(" multi-record %d, type 0x%x, format version 0x%x:",
3366
rv = ipmi_fru_get_multi_record_data_len(fru, i, &len);
3368
display_pad_out("\n multi-record %d, error getting length: %x\n",
3372
data = ipmi_mem_alloc(len);
3374
display_pad_out("\n multi-record %d, error allocating data\n");
3377
rv = ipmi_fru_get_multi_record_data(fru, i, data, &len);
3379
display_pad_out("\n multi-record %d, error getting data: %x\n",
3382
for (j=0; j<len; j++) {
3383
if ((j > 0) && ((j % 16) == 0))
3384
display_pad_out("\n ");
3385
display_pad_out(" %2.2x", data[j]);
3387
display_pad_out("\n");
3389
ipmi_mem_free(data);
3394
found_entity_for_fru(ipmi_entity_t *entity,
3399
char loc[MAX_ENTITY_LOC_SIZE];
3400
ipmi_fru_t *fru = ipmi_entity_get_fru(entity);
3402
display_pad_clear();
3405
cmd_win_out("No FRU for entity %s\n",
3406
get_entity_loc(entity, loc, sizeof(loc)));
3410
display_pad_out("FRU for entity %s\n",
3411
get_entity_loc(entity, loc, sizeof(loc)));
3415
display_pad_refresh();
3419
fru_cmd(char *cmd, char **toks, void *cb_data)
3421
entity_finder(cmd, toks, found_entity_for_fru, NULL);
3422
curr_display_type = DISPLAY_ENTITY;
3427
fru_fetched(ipmi_fru_t *fru, int err, void *cb_data)
3429
display_pad_clear();
3431
display_pad_out("Error fetching fru: %x\n", err);
3434
display_pad_refresh();
3435
if (err != ECANCELED)
3436
ipmi_fru_destroy(fru, NULL, NULL);
3439
typedef struct fru_rec_s
3441
unsigned char is_logical;
3442
unsigned char device_address;
3443
unsigned char device_id;
3445
unsigned char private_bus;
3446
unsigned char channel;
3450
dump_fru_cmder(ipmi_domain_t *domain, void *cb_data)
3452
fru_rec_t *info = cb_data;
3455
rv = ipmi_fru_alloc(domain,
3457
info->device_address,
3466
cmd_win_out("Unable to allocate fru: %x\n", rv);
3470
dump_fru_cmd(char *cmd, char **toks, void *cb_data)
3475
if (get_uchar(toks, &info.is_logical, "is_logical"))
3477
if (get_uchar(toks, &info.device_address, "device_address"))
3479
if (get_uchar(toks, &info.device_id, "device_id"))
3481
if (get_uchar(toks, &info.lun, "lun"))
3483
if (get_uchar(toks, &info.private_bus, "private_bus"))
3485
if (get_uchar(toks, &info.channel, "channel"))
3488
rv = ipmi_domain_pointer_cb(domain_id, dump_fru_cmder, &info);
3490
cmd_win_out("Unable to convert domain id to a pointer\n");
3492
curr_display_type = DISPLAY_ENTITY;
3497
static char y_or_n(int val)
3505
#define MCCMD_DATA_SIZE 30
3506
typedef struct mccmd_info_s
3515
void mc_handler(ipmi_mc_t *mc, void *cb_data)
3517
unsigned char vals[4];
3518
mccmd_info_t *info = cb_data;
3520
curr_display_type = DISPLAY_MC;
3522
display_pad_clear();
3523
display_pad_out("MC (%x %x) - %s\n",
3524
ipmi_mc_get_channel(mc),
3525
ipmi_mc_get_address(mc),
3526
ipmi_mc_is_active(mc) ? "active" : "inactive");
3527
display_pad_out(" provides_device_sdrs: %c\n",
3528
y_or_n(ipmi_mc_provides_device_sdrs(mc)));
3529
display_pad_out(" device_available: %c\n",
3530
y_or_n(ipmi_mc_device_available(mc)));
3531
display_pad_out(" chassis_support: %c\n",
3532
y_or_n(ipmi_mc_chassis_support(mc)));
3533
display_pad_out(" bridge_support: %c\n",
3534
y_or_n(ipmi_mc_bridge_support(mc)));
3535
display_pad_out(" ipmb_event_generator: %c\n",
3536
y_or_n(ipmi_mc_ipmb_event_generator_support(mc)));
3537
display_pad_out(" ipmb_event_receiver: %c\n",
3538
y_or_n(ipmi_mc_ipmb_event_receiver_support(mc)));
3539
display_pad_out(" fru_inventory_support: %c\n",
3540
y_or_n(ipmi_mc_fru_inventory_support(mc)));
3541
display_pad_out(" sel_device_support: %c\n",
3542
y_or_n(ipmi_mc_sel_device_support(mc)));
3543
display_pad_out(" sdr_repository_support: %c\n",
3544
y_or_n(ipmi_mc_sdr_repository_support(mc)));
3545
display_pad_out(" sensor_device_support: %c\n",
3546
y_or_n(ipmi_mc_sensor_device_support(mc)));
3547
display_pad_out(" device_id: %2.2x\n",
3548
ipmi_mc_device_id(mc));
3549
display_pad_out(" device_revision: %1.1x\n",
3550
ipmi_mc_device_revision(mc));
3551
display_pad_out(" fw_revision: %d.%d%d\n",
3552
ipmi_mc_major_fw_revision(mc),
3553
ipmi_mc_minor_fw_revision(mc)>>4,
3554
ipmi_mc_minor_fw_revision(mc)&0xf);
3555
display_pad_out(" version: %d.%d\n",
3556
ipmi_mc_major_version(mc),
3557
ipmi_mc_minor_version(mc));
3558
display_pad_out(" manufacturer_id: %6.6x\n",
3559
ipmi_mc_manufacturer_id(mc));
3560
display_pad_out(" product_id: %4.4x\n",
3561
ipmi_mc_product_id(mc));
3562
ipmi_mc_aux_fw_revision(mc, vals);
3563
display_pad_out(" aux_fw_revision: %2.2x %2.2x %2.2x %2.2x\n",
3564
vals[0], vals[1], vals[2], vals[3]);
3566
display_pad_out(" SEL count: %d entries, %d slots used\n",
3567
ipmi_mc_sel_count(mc), ipmi_mc_sel_entries_used(mc));
3571
get_mc_id(char **toks, ipmi_mcid_t *mc_id)
3575
if (get_uchar(toks, &val, "mc channel"))
3577
mc_id->channel = val;
3579
if (get_uchar(toks, &val, "MC num"))
3581
mc_id->mc_num = val;
3583
mc_id->domain_id = domain_id;
3588
mc_cmd(char *cmd, char **toks, void *cb_data)
3593
if (get_mc_id(toks, &info.mc_id))
3597
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mc_handler, &info);
3599
cmd_win_out("Unable to find MC\n");
3603
cmd_win_out("Unable to find MC (%d %x)\n",
3604
info.mc_id.channel, info.mc_id.mc_num);
3606
display_pad_refresh();
3611
void mcs_handler(ipmi_domain_t *domain,
3618
addr = ipmi_mc_get_address(mc);
3619
channel = ipmi_mc_get_channel(mc);
3620
display_pad_out(" (%x %x) - %s\n", channel, addr,
3621
ipmi_mc_is_active(mc) ? "active" : "inactive");
3625
mcs_cmder(ipmi_domain_t *domain, void *cb_data)
3627
ipmi_domain_iterate_mcs(domain, mcs_handler, NULL);
3631
mcs_cmd(char *cmd, char **toks, void *cb_data)
3635
display_pad_clear();
3636
curr_display_type = DISPLAY_MCS;
3637
display_pad_out("MCs:\n");
3638
rv = ipmi_domain_pointer_cb(domain_id, mcs_cmder, NULL);
3640
cmd_win_out("Unable to convert domain id to a pointer\n");
3643
display_pad_refresh();
3648
mccmd_rsp_handler(ipmi_mc_t *src,
3653
unsigned char *data;
3655
display_pad_clear();
3656
curr_display_type = DISPLAY_RSP;
3657
display_pad_out("Response:\n");
3658
display_pad_out(" NetFN = 0x%2.2x\n", msg->netfn);
3659
display_pad_out(" Command = 0x%2.2x\n", msg->cmd);
3660
display_pad_out(" Completion code = 0x%2.2x\n", msg->data[0]);
3661
display_pad_out(" data =");
3662
data = msg->data + 1;
3663
for (i=0; i+1<msg->data_len; i++) {
3664
if ((i != 0) && ((i % 8) == 0))
3665
display_pad_out("\n ");
3666
display_pad_out(" %2.2x", data[i]);
3668
display_pad_out("\n");
3669
display_pad_refresh();
3672
void mccmd_handler(ipmi_mc_t *mc,
3675
mccmd_info_t *info = cb_data;
3679
rv = ipmi_mc_send_command(mc, info->lun, &(info->msg), mccmd_rsp_handler,
3682
cmd_win_out("Send command failure: %x\n", rv);
3686
mccmd_cmd(char *cmd, char **toks, void *cb_data)
3689
unsigned char data[MCCMD_DATA_SIZE];
3690
unsigned int data_len;
3694
if (get_mc_id(toks, &info.mc_id))
3697
if (get_uchar(toks, &info.lun, "LUN"))
3700
if (get_uchar(toks, &info.msg.netfn, "NetFN"))
3703
if (get_uchar(toks, &info.msg.cmd, "command"))
3706
for (data_len=0; ; data_len++) {
3707
if (get_uchar(toks, data+data_len, NULL))
3711
info.msg.data_len = data_len;
3712
info.msg.data = data;
3715
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mccmd_handler, &info);
3717
cmd_win_out("Unable to convert MC id to a pointer\n");
3721
cmd_win_out("Unable to find MC (%d %x)\n",
3722
info.mc_id.channel, info.mc_id.mc_num);
3724
display_pad_refresh();
3730
mc_events_enable_cb(ipmi_mc_t *mc, int err, void *cb_data)
3733
ui_log("Error setting events enable: 0x%x\n", err);
3735
ui_log("Events enable set\n");
3739
mc_events_enable_handler(ipmi_mc_t *mc,
3742
mccmd_info_t *info = cb_data;
3746
rv = ipmi_mc_set_events_enable(mc, info->val, mc_events_enable_cb, NULL);
3748
cmd_win_out("Set events enable failure: %x\n", rv);
3752
mc_events_enable_cmd(char *cmd, char **toks, void *cb_data)
3758
if (get_mc_id(toks, &info.mc_id))
3761
if (get_uchar(toks, &info.val, "enabled"))
3765
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mc_events_enable_handler, &info);
3767
cmd_win_out("Unable to convert MC id to a pointer\n");
3771
cmd_win_out("Unable to find MC (%d %x)\n",
3772
info.mc_id.channel, info.mc_id.mc_num);
3774
display_pad_refresh();
3780
mc_events_enabled_handler(ipmi_mc_t *mc,
3783
mccmd_info_t *info = cb_data;
3786
if (ipmi_mc_get_events_enable(mc))
3787
cmd_win_out("Events enabled\n");
3789
cmd_win_out("Events not enabled\n");
3793
mc_events_enabled_cmd(char *cmd, char **toks, void *cb_data)
3799
if (get_mc_id(toks, &info.mc_id))
3803
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mc_events_enabled_handler, &info);
3805
cmd_win_out("Unable to convert MC id to a pointer\n");
3809
cmd_win_out("Unable to find MC (%d %x)\n",
3810
info.mc_id.channel, info.mc_id.mc_num);
3812
display_pad_refresh();
3821
display_pad_out("No PEF read, use readpef to fetch one\n");
3825
display_pad_out("PEF\n");
3826
display_pad_out(" Version: %d.%d", ipmi_pef_major_version(pef),
3827
ipmi_pef_minor_version(pef));
3828
display_pad_out(" Supports:");
3829
if (ipmi_pef_supports_diagnostic_interrupt(pef))
3830
display_pad_out(" diagnostic_interrupt");
3831
if (ipmi_pef_supports_oem_action(pef))
3832
display_pad_out(" oem_action");
3833
if (ipmi_pef_supports_power_cycle(pef))
3834
display_pad_out(" power_cycle");
3835
if (ipmi_pef_supports_reset(pef))
3836
display_pad_out(" reset");
3837
if (ipmi_pef_supports_power_down(pef))
3838
display_pad_out(" power_down");
3839
if (ipmi_pef_supports_alert(pef))
3840
display_pad_out(" alert");
3841
display_pad_out("\n");
3842
display_pad_out(" Num event filter table entries: %d\n",
3843
num_event_filter_table_entries(pef));
3846
typedef struct pef_table_s
3849
int (*get)(ipmi_pef_config_t *pefc,
3855
#define X(n, f) { #n, ipmi_pefconfig_get_##n, f }
3856
static pef_table_t eft_table[] =
3858
X(enable_filter, "%d"),
3859
X(filter_type, "%d"),
3860
X(diagnostic_interrupt, "%d"),
3861
X(oem_action, "%d"),
3862
X(power_cycle, "%d"),
3864
X(power_down, "%d"),
3866
X(alert_policy_number, "%d"),
3867
X(event_severity, "0x%x"),
3868
X(generator_id_addr, "0x%x"),
3869
X(generator_id_channel_lun, "0x%x"),
3870
X(sensor_type, "0x%x"),
3871
X(sensor_number, "0x%x"),
3872
X(event_trigger, "%d"),
3873
X(data1_offset_mask, "0x%x"),
3874
X(data1_mask, "%d"),
3875
X(data1_compare1, "%d"),
3876
X(data1_compare2, "%d"),
3877
X(data2_mask, "%d"),
3878
X(data2_compare1, "%d"),
3879
X(data2_compare2, "%d"),
3880
X(data3_mask, "%d"),
3881
X(data3_compare1, "%d"),
3882
X(data3_compare2, "%d"),
3885
static pef_table_t apt_table[] =
3887
X(policy_num, "%d"),
3891
X(destination_selector, "%d"),
3892
X(alert_string_event_specific, "%d"),
3893
X(alert_string_selector, "%d"),
3896
static pef_table_t ask_table[] =
3898
X(event_filter, "%d"),
3899
X(alert_string_set, "%d"),
3904
display_pef_config(void)
3909
unsigned char data[128];
3914
display_pad_out("No PEF config read, use readpef to fetch one\n");
3918
display_pad_out(" alert_startup_delay_enabled: %d\n",
3919
ipmi_pefconfig_get_alert_startup_delay_enabled(pef_config));
3920
display_pad_out(" startup_delay_enabled: %d\n",
3921
ipmi_pefconfig_get_startup_delay_enabled(pef_config));
3922
display_pad_out(" event_messages_enabled: %d\n",
3923
ipmi_pefconfig_get_event_messages_enabled(pef_config));
3924
display_pad_out(" pef_enabled: %d\n",
3925
ipmi_pefconfig_get_pef_enabled(pef_config));
3926
display_pad_out(" diagnostic_interrupt_enabled: %d\n",
3927
ipmi_pefconfig_get_diagnostic_interrupt_enabled(pef_config));
3928
display_pad_out(" oem_action_enabled: %d\n",
3929
ipmi_pefconfig_get_oem_action_enabled(pef_config));
3930
display_pad_out(" power_cycle_enabled: %d\n",
3931
ipmi_pefconfig_get_power_cycle_enabled(pef_config));
3932
display_pad_out(" reset_enabled: %d\n",
3933
ipmi_pefconfig_get_reset_enabled(pef_config));
3934
display_pad_out(" power_down_enabled: %d\n",
3935
ipmi_pefconfig_get_power_down_enabled(pef_config));
3936
display_pad_out(" alert_enabled: %d\n",
3937
ipmi_pefconfig_get_alert_enabled(pef_config));
3939
if (ipmi_pefconfig_get_startup_delay(pef_config, &val) == 0)
3940
display_pad_out(" startup_delay: %d\n", val);
3941
if (ipmi_pefconfig_get_alert_startup_delay(pef_config, &val) == 0)
3942
display_pad_out(" alert_startup_delay: %d\n", val);
3945
rv = ipmi_pefconfig_get_guid(pef_config, &val, data, &len);
3947
display_pad_out(" guid_enabled: %d\n", val);
3948
display_pad_out(" guid:", val);
3949
for (i=0; i<len; i++)
3950
display_pad_out(" %2.2x", data[i]);
3951
display_pad_out("\n");
3954
count = ipmi_pefconfig_get_num_event_filters(pef_config);
3955
display_pad_out(" num_event_filters: %d\n", count);
3956
for (i=0; i<count; i++) {
3957
display_pad_out(" event filter %d:\n", i+1);
3958
for (j=0; eft_table[j].name != NULL; j++) {
3959
rv = eft_table[j].get(pef_config, i, &val);
3960
display_pad_out(" %s: ", eft_table[j].name);
3962
display_pad_out("error %x", rv);
3964
display_pad_out(eft_table[j].fmt, val);
3965
display_pad_out("\n");
3969
count = ipmi_pefconfig_get_num_alert_policies(pef_config);
3970
display_pad_out(" num_alert_policies: %d\n", count);
3971
for (i=0; i<count; i++) {
3972
display_pad_out(" alert policy %d:\n", i+1);
3973
for (j=0; apt_table[j].name != NULL; j++) {
3974
rv = apt_table[j].get(pef_config, i, &val);
3975
display_pad_out(" %s: ", apt_table[j].name);
3977
display_pad_out("error %x", rv);
3979
display_pad_out(apt_table[j].fmt, val);
3980
display_pad_out("\n");
3984
count = ipmi_pefconfig_get_num_alert_strings(pef_config);
3985
display_pad_out(" num_alert_strings: %d\n", count);
3986
for (i=0; i<count; i++) {
3987
display_pad_out(" alert string %d:\n", i);
3988
for (j=0; ask_table[j].name != NULL; j++) {
3989
rv = ask_table[j].get(pef_config, i, &val);
3990
display_pad_out(" %s: ", ask_table[j].name);
3992
display_pad_out("error %x", rv);
3994
display_pad_out(ask_table[j].fmt, val);
3995
display_pad_out("\n");
3998
rv = ipmi_pefconfig_get_alert_string(pef_config, i, data, &len);
4000
display_pad_out(" alert_string: error %x\n", rv);
4002
display_pad_out(" alert_string: '%s'\n", data);
4007
readpef_getconf_handler(ipmi_pef_t *pef,
4009
ipmi_pef_config_t *config,
4013
ui_log("Error reading PEF config: %x\n", err);
4017
pef_config = config;
4018
display_pef_config();
4019
display_pad_refresh();
4023
readpef_alloc_handler(ipmi_pef_t *lpef,
4028
ui_log("Error allocating PEF: %x\n", err);
4032
if (!ipmi_pef_valid(lpef)) {
4033
display_pad_out("PEF is not valid\n");
4034
ipmi_pef_destroy(pef, NULL, NULL);
4040
display_pad_clear();
4043
ipmi_pef_get_config(pef, readpef_getconf_handler, NULL);
4047
readpef_mc_handler(ipmi_mc_t *mc, void *cb_data)
4050
mccmd_info_t *info = cb_data;
4055
ipmi_pef_destroy(pef, NULL, NULL);
4059
ipmi_pef_free_config(pef_config);
4063
rv = ipmi_pef_alloc(mc, readpef_alloc_handler, NULL, NULL);
4065
cmd_win_out("Error allocating PEF");
4069
readpef_cmd(char *cmd, char **toks, void *cb_data)
4074
if (get_mc_id(toks, &info.mc_id))
4078
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, readpef_mc_handler, &info);
4080
cmd_win_out("Unable to find MC\n");
4084
cmd_win_out("Unable to find MC (%d %x)\n",
4085
info.mc_id.channel, info.mc_id.mc_num);
4087
display_pad_refresh();
4093
viewpef_cmd(char *cmd, char **toks, void *cb_data)
4095
display_pad_clear();
4097
display_pef_config();
4098
display_pad_refresh();
4103
void writepef_done(ipmi_pef_t *pef,
4108
ui_log("Error writing PEF: %x\n", err);
4110
ui_log("PEF written\n");
4114
writepef_cmd(char *cmd, char **toks, void *cb_data)
4119
cmd_win_out("No PEF to write\n");
4123
cmd_win_out("No PEF config to write\n");
4127
rv = ipmi_pef_set_config(pef, pef_config, writepef_done, NULL);
4129
cmd_win_out("Error writing pef parms: %x\n", rv);
4134
void clearpeflock_done(ipmi_pef_t *pef,
4139
ui_log("Error clearing PEF lock: %x\n", err);
4141
ui_log("PEF lock cleared\n");
4145
clearpeflock_rsp_handler(ipmi_mc_t *src,
4150
ui_log("Error clearing PEF lock: %x\n",
4151
IPMI_IPMI_ERR_VAL(msg->data[0]));
4153
ui_log("PEF lock cleared\n");
4157
clearpeflock_mc_handler(ipmi_mc_t *mc, void *cb_data)
4159
mccmd_info_t *info = cb_data;
4160
unsigned char data[2];
4168
msg.netfn = IPMI_SENSOR_EVENT_NETFN;
4169
msg.cmd = IPMI_SET_PEF_CONFIG_PARMS_CMD;
4172
rv = ipmi_mc_send_command(mc, 0, &msg, clearpeflock_rsp_handler,
4175
cmd_win_out("Send PEF clear lock failure: %x\n", rv);
4179
clearpeflock_cmd(char *cmd, char **toks, void *cb_data)
4187
mc_toks = strtok_r(NULL, "", toks);
4189
strncpy(buf+2, mc_toks, sizeof(buf)-2);
4192
strtok_r(buf, " ", &ntoks);
4193
if (get_mc_id(&ntoks, &info.mc_id))
4197
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, clearpeflock_mc_handler,
4200
cmd_win_out("Unable to find MC\n");
4204
cmd_win_out("Unable to find MC (%d %x)\n",
4205
info.mc_id.channel, info.mc_id.mc_num);
4207
display_pad_refresh();
4210
ui_log("No PEF to write\n");
4214
ipmi_pef_clear_lock(pef, pef_config, clearpeflock_done, NULL);
4220
typedef struct setpef_parm_s
4223
int (*set_val)(ipmi_pef_config_t *, unsigned int);
4224
int (*set_data)(ipmi_pef_config_t *, unsigned char *, unsigned int);
4225
int (*set_val_sel)(ipmi_pef_config_t *, unsigned int, unsigned int);
4226
int (*set_data_sel)(ipmi_pef_config_t *, unsigned int,
4227
unsigned char *, unsigned int);
4233
#define H(x) ipmi_pefconfig_set_ ## x
4235
static setpef_parm_t pef_conf[] =
4238
#define V startup_delay_enabled
4239
{ C(V), G(V), N, N, N },
4241
#define V alert_startup_delay_enabled
4242
{ C(V), G(V), N, N, N },
4244
#define V event_messages_enabled
4245
{ C(V), G(V), N, N, N },
4247
#define V pef_enabled
4248
{ C(V), G(V), N, N, N },
4250
#define V diagnostic_interrupt_enabled
4251
{ C(V), G(V), N, N, N },
4253
#define V oem_action_enabled
4254
{ C(V), G(V), N, N, N },
4256
#define V power_cycle_enabled
4257
{ C(V), G(V), N, N, N },
4259
#define V reset_enabled
4260
{ C(V), G(V), N, N, N },
4262
#define V power_down_enabled
4263
{ C(V), G(V), N, N, N },
4265
#define V alert_enabled
4266
{ C(V), G(V), N, N, N },
4268
#define V startup_delay
4269
{ C(V), G(V), N, N, N },
4271
#define V alert_startup_delay
4272
{ C(V), G(V), N, N, N },
4274
#define V enable_filter
4275
{ C(V), N, N, G(V), N },
4277
#define V filter_type
4278
{ C(V), N, N, G(V), N },
4280
#define V diagnostic_interrupt
4281
{ C(V), N, N, G(V), N },
4283
#define V oem_action
4284
{ C(V), N, N, G(V), N },
4286
#define V power_cycle
4287
{ C(V), N, N, G(V), N },
4290
{ C(V), N, N, G(V), N },
4292
#define V power_down
4293
{ C(V), N, N, G(V), N },
4296
{ C(V), N, N, G(V), N },
4298
#define V alert_policy_number
4299
{ C(V), N, N, G(V), N },
4301
#define V event_severity
4302
{ C(V), N, N, G(V), N },
4304
#define V generator_id_addr
4305
{ C(V), N, N, G(V), N },
4307
#define V generator_id_channel_lun
4308
{ C(V), N, N, G(V), N },
4310
#define V sensor_type
4311
{ C(V), N, N, G(V), N },
4313
#define V sensor_number
4314
{ C(V), N, N, G(V), N },
4316
#define V event_trigger
4317
{ C(V), N, N, G(V), N },
4319
#define V data1_offset_mask
4320
{ C(V), N, N, G(V), N },
4322
#define V data1_mask
4323
{ C(V), N, N, G(V), N },
4325
#define V data1_compare1
4326
{ C(V), N, N, G(V), N },
4328
#define V data1_compare2
4329
{ C(V), N, N, G(V), N },
4331
#define V data2_mask
4332
{ C(V), N, N, G(V), N },
4334
#define V data2_compare1
4335
{ C(V), N, N, G(V), N },
4337
#define V data2_compare2
4338
{ C(V), N, N, G(V), N },
4340
#define V data3_mask
4341
{ C(V), N, N, G(V), N },
4343
#define V data3_compare1
4344
{ C(V), N, N, G(V), N },
4346
#define V data3_compare2
4347
{ C(V), N, N, G(V), N },
4349
#define V policy_num
4350
{ C(V), N, N, G(V), N },
4353
{ C(V), N, N, G(V), N },
4356
{ C(V), N, N, G(V), N },
4358
#define V destination_selector
4359
{ C(V), N, N, G(V), N },
4361
#define V alert_string_event_specific
4362
{ C(V), N, N, G(V), N },
4364
#define V alert_string_selector
4365
{ C(V), N, N, G(V), N },
4367
#define V event_filter
4368
{ C(V), N, N, G(V), N },
4370
#define V alert_string_set
4371
{ C(V), N, N, G(V), N },
4377
setpef_cmd(char *cmd, char **toks, void *cb_data)
4381
unsigned char data[30];
4388
cmd_win_out("No PEF config read, use readpef to fetch one\n");
4392
name = strtok_r(NULL, " \t\n", toks);
4394
cmd_win_out("No PEF config name given\n");
4398
for (i=0; pef_conf[i].name != NULL; i++) {
4399
if (strcmp(pef_conf[i].name, name) == 0)
4403
if (pef_conf[i].name == NULL) {
4404
if (strcmp(name, "guid") == 0) {
4405
for (i=0; i<sizeof(data); i++) {
4406
if (get_uchar(toks, data+i, NULL))
4409
rv = ipmi_pefconfig_set_guid(pef_config, (i != 0), data, i);
4410
} else if (strcmp(name, "alert_string") == 0) {
4411
if (get_uint(toks, &sel, "selector"))
4413
str = strtok_r(NULL, "", toks);
4414
rv = ipmi_pefconfig_set_alert_string(pef_config, sel, str);
4416
cmd_win_out("Invalid PEF config name: '%s'\n", name);
4419
} else if (pef_conf[i].set_val) {
4420
if (get_uint(toks, &val, "value"))
4422
rv = pef_conf[i].set_val(pef_config, val);
4423
} else if (pef_conf[i].set_data) {
4424
for (i=0; i<sizeof(data); i++) {
4425
if (get_uchar(toks, data+i, NULL))
4428
rv = pef_conf[i].set_data(pef_config, data, i);
4429
} else if (pef_conf[i].set_val_sel) {
4430
if (get_uint(toks, &sel, "selector"))
4432
if (get_uint(toks, &val, "value"))
4434
rv = pef_conf[i].set_val_sel(pef_config, sel, val);
4435
} else if (pef_conf[i].set_data_sel) {
4436
if (get_uint(toks, &sel, "selector"))
4438
for (i=0; i<sizeof(data); i++) {
4439
if (get_uchar(toks, data+i, NULL))
4442
rv = pef_conf[i].set_data_sel(pef_config, sel, data, i);
4445
cmd_win_out("Error setting parm: 0x%x\n", rv);
4450
lanparm_out_val(char *name, int rv, char *fmt, unsigned int val)
4454
display_pad_out(" %s: ", name);
4456
display_pad_out("err %x", rv);
4458
display_pad_out(fmt, val);
4459
display_pad_out("\n");
4463
lanparm_out_data(char *name, int rv, unsigned char *data, int len)
4468
display_pad_out(" %s: ", name);
4470
display_pad_out("err %x\n", rv);
4472
for (i=0; i<len; i++)
4473
display_pad_out("%2.2x", data[i]);
4474
display_pad_out("\n");
4479
display_lanparm_config(void)
4484
unsigned char data[128];
4488
if (!lanparm_config) {
4489
display_pad_out("No LANPARM config read, use readlanparm to fetch one\n");
4493
display_pad_out("LAN parameters:");
4494
display_pad_out(" auth supported:");
4495
if (ipmi_lanconfig_get_support_auth_oem(lanparm_config))
4496
display_pad_out(" oem");
4497
if (ipmi_lanconfig_get_support_auth_straight(lanparm_config))
4498
display_pad_out(" straight");
4499
if (ipmi_lanconfig_get_support_auth_md5(lanparm_config))
4500
display_pad_out(" md5");
4501
if (ipmi_lanconfig_get_support_auth_md2(lanparm_config))
4502
display_pad_out(" md2");
4503
if (ipmi_lanconfig_get_support_auth_none(lanparm_config))
4504
display_pad_out(" none");
4505
display_pad_out("\n");
4507
display_pad_out(" ip_addr_source: %d\n",
4508
ipmi_lanconfig_get_ip_addr_source(lanparm_config));
4509
rv = ipmi_lanconfig_get_ipv4_ttl(lanparm_config, &val);
4510
lanparm_out_val("ipv4_ttl", rv, "%d", val);
4511
rv = ipmi_lanconfig_get_ipv4_flags(lanparm_config, &val);
4512
lanparm_out_val("ipv4_flags", rv, "%d", val);
4513
rv = ipmi_lanconfig_get_ipv4_precedence(lanparm_config, &val);
4514
lanparm_out_val("ipv4_precedence", rv, "%d", val);
4515
rv = ipmi_lanconfig_get_ipv4_tos(lanparm_config, &val);
4516
lanparm_out_val("ipv4_tos", rv, "%d", val);
4518
for (i=0; i<5; i++) {
4519
display_pad_out(" auth enabled (%d):", i);
4520
rv = ipmi_lanconfig_get_enable_auth_oem(lanparm_config, i, &val);
4522
display_pad_out(" oemerr%x", rv);
4524
display_pad_out(" oem");
4525
rv = ipmi_lanconfig_get_enable_auth_straight(lanparm_config, i, &val);
4527
display_pad_out(" straighterr%x", rv);
4529
display_pad_out(" straight");
4530
rv = ipmi_lanconfig_get_enable_auth_md5(lanparm_config, i, &val);
4532
display_pad_out(" md5err%x", rv);
4534
display_pad_out(" md5");
4535
rv = ipmi_lanconfig_get_enable_auth_md2(lanparm_config, i, &val);
4537
display_pad_out(" md2err%x", rv);
4539
display_pad_out(" md2");
4540
rv = ipmi_lanconfig_get_enable_auth_none(lanparm_config, i, &val);
4542
display_pad_out(" noneerr%x", rv);
4544
display_pad_out(" none");
4545
display_pad_out("\n");
4549
rv = ipmi_lanconfig_get_ip_addr(lanparm_config, data, &len);
4550
lanparm_out_data("ip_addr", rv, data, len);
4552
rv = ipmi_lanconfig_get_mac_addr(lanparm_config, data, &len);
4553
lanparm_out_data("mac_addr", rv, data, len);
4555
rv = ipmi_lanconfig_get_subnet_mask(lanparm_config, data, &len);
4556
lanparm_out_data("subnet_mask", rv, data, len);
4558
rv = ipmi_lanconfig_get_primary_rmcp_port(lanparm_config, data, &len);
4559
lanparm_out_data("primary_rmcp_port", rv, data, len);
4561
rv = ipmi_lanconfig_get_secondary_rmcp_port(lanparm_config, data, &len);
4562
lanparm_out_data("secondary_rmcp_port", rv, data, len);
4564
rv = ipmi_lanconfig_get_bmc_generated_arps(lanparm_config, &val);
4565
lanparm_out_val("bmc_generated_arps", rv, "%d", val);
4566
rv = ipmi_lanconfig_get_bmc_generated_garps(lanparm_config, &val);
4567
lanparm_out_val("bmc_generated_garps", rv, "%d", val);
4568
rv = ipmi_lanconfig_get_garp_interval(lanparm_config, &val);
4569
lanparm_out_val("garp_interval", rv, "%d", val);
4572
rv = ipmi_lanconfig_get_default_gateway_ip_addr(lanparm_config, data, &len);
4573
lanparm_out_data("default_gateway_ip_addr", rv, data, len);
4575
rv = ipmi_lanconfig_get_default_gateway_mac_addr(lanparm_config, data, &len);
4576
lanparm_out_data("default_gateway_mac_addr", rv, data, len);
4578
rv = ipmi_lanconfig_get_backup_gateway_ip_addr(lanparm_config, data, &len);
4579
lanparm_out_data("backup_gateway_ip_addr", rv, data, len);
4581
rv = ipmi_lanconfig_get_backup_gateway_mac_addr(lanparm_config, data, &len);
4582
lanparm_out_data("backup_gateway_mac_addr", rv, data, len);
4585
rv = ipmi_lanconfig_get_community_string(lanparm_config, data, &len);
4586
display_pad_out(" community_string: ");
4588
display_pad_out("err: %x\n", rv);
4590
display_pad_out("%s\n", data);
4592
count = ipmi_lanconfig_get_num_alert_destinations(lanparm_config);
4593
display_pad_out(" num_alert_destinations: %d\n", count);
4594
for (i=0; i<count; i++) {
4595
display_pad_out(" destination %d:\n", i);
4596
rv = ipmi_lanconfig_get_alert_ack(lanparm_config, i, &val);
4597
lanparm_out_val(" alert_ack", rv, "%d", val);
4598
rv = ipmi_lanconfig_get_dest_type(lanparm_config, i, &val);
4599
lanparm_out_val(" dest_type", rv, "%d", val);
4600
rv = ipmi_lanconfig_get_alert_retry_interval(lanparm_config, i, &val);
4601
lanparm_out_val(" alert_retry_interval", rv, "%d", val);
4602
rv = ipmi_lanconfig_get_max_alert_retries(lanparm_config, i, &val);
4603
lanparm_out_val(" max_alert_retries", rv, "%d", val);
4604
rv = ipmi_lanconfig_get_dest_format(lanparm_config, i, &val);
4605
lanparm_out_val(" dest_format", rv, "%d", val);
4606
rv = ipmi_lanconfig_get_gw_to_use(lanparm_config, i, &val);
4607
lanparm_out_val(" gw_to_use", rv, "%d", val);
4609
rv = ipmi_lanconfig_get_dest_ip_addr(lanparm_config, i, data, &len);
4610
lanparm_out_data(" dest_ip_addr", rv, data, len);
4612
rv = ipmi_lanconfig_get_dest_mac_addr(lanparm_config, i, data, &len);
4613
lanparm_out_data(" dest_mac_addr", rv, data, len);
4617
typedef struct lanparm_info_s
4621
unsigned char channel;
4627
readlanparm_getconf_handler(ipmi_lanparm_t *lanparm,
4629
ipmi_lan_config_t *config,
4633
ui_log("Error reading LANPARM config: %x\n", err);
4637
lanparm_config = config;
4638
display_pad_clear();
4639
display_lanparm_config();
4640
display_pad_refresh();
4644
readlanparm_mc_handler(ipmi_mc_t *mc, void *cb_data)
4647
lanparm_info_t *info = cb_data;
4652
ipmi_lanparm_destroy(lanparm, NULL, NULL);
4655
if (lanparm_config) {
4656
ipmi_lan_free_config(lanparm_config);
4657
lanparm_config = NULL;
4660
rv = ipmi_lanparm_alloc(mc, info->channel, &lanparm);
4662
cmd_win_out("failed lanparm allocation: %x\n", rv);
4666
rv = ipmi_lan_get_config(lanparm, readlanparm_getconf_handler, NULL);
4670
readlanparm_cmd(char *cmd, char **toks, void *cb_data)
4672
lanparm_info_t info;
4676
if (get_mc_id(toks, &info.mc_id))
4679
if (get_uchar(toks, &val, "lanparm channel"))
4684
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, readlanparm_mc_handler, &info);
4686
cmd_win_out("Unable to find MC\n");
4690
cmd_win_out("Unable to find MC (%d %x)\n",
4691
info.mc_id.channel, info.mc_id.mc_num);
4693
display_pad_refresh();
4699
viewlanparm_cmd(char *cmd, char **toks, void *cb_data)
4701
display_pad_clear();
4702
display_lanparm_config();
4703
display_pad_refresh();
4708
void writelanparm_done(ipmi_lanparm_t *lanparm,
4713
ui_log("Error writing LANPARM: %x\n", err);
4715
ui_log("LANPARM written\n");
4719
writelanparm_cmd(char *cmd, char **toks, void *cb_data)
4724
cmd_win_out("No LANPARM to write\n");
4727
if (!lanparm_config) {
4728
cmd_win_out("No LANPARM config to write\n");
4732
rv = ipmi_lan_set_config(lanparm, lanparm_config, writelanparm_done, NULL);
4734
cmd_win_out("Error writing lan parms: %x\n", rv);
4739
void clearlanparmlock_done(ipmi_lanparm_t *lanparm,
4744
ui_log("Error clearing LANPARM lock: %x\n", err);
4746
ui_log("LANPARM lock cleared\n");
4750
clearlanparmlock_rsp_handler(ipmi_mc_t *src,
4755
ui_log("Error clearing LANPARM lock: %x\n",
4756
IPMI_IPMI_ERR_VAL(msg->data[0]));
4758
ui_log("LANPARM lock cleared\n");
4762
clearlanparmlock_mc_handler(ipmi_mc_t *mc, void *cb_data)
4764
lanparm_info_t *info = cb_data;
4765
unsigned char data[3];
4771
data[0] = info->channel;
4774
msg.netfn = IPMI_TRANSPORT_NETFN;
4775
msg.cmd = IPMI_SET_LAN_CONFIG_PARMS_CMD;
4778
rv = ipmi_mc_send_command(mc, 0, &msg, clearlanparmlock_rsp_handler,
4781
cmd_win_out("Send LANPARM clear lock failure: %x\n", rv);
4785
clearlanparmlock_cmd(char *cmd, char **toks, void *cb_data)
4787
lanparm_info_t info;
4794
mc_toks = strtok_r(NULL, "", toks);
4796
strncpy(buf+2, mc_toks, sizeof(buf)-2);
4799
strtok_r(buf, " ", &ntoks);
4800
if (get_mc_id(&ntoks, &info.mc_id))
4803
if (get_uchar(&ntoks, &val, "lanparm channel"))
4808
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, clearlanparmlock_mc_handler,
4811
cmd_win_out("Unable to find MC\n");
4815
cmd_win_out("Unable to find MC (%d %x)\n",
4816
info.mc_id.channel, info.mc_id.mc_num);
4818
display_pad_refresh();
4821
ui_log("No LANPARM to write\n");
4825
ipmi_lan_clear_lock(lanparm, lanparm_config,
4826
clearlanparmlock_done, NULL);
4832
typedef struct setlan_parm_s
4835
int (*set_val)(ipmi_lan_config_t *, unsigned int);
4836
int (*set_data)(ipmi_lan_config_t *, unsigned char *, unsigned int);
4837
int (*set_val_sel)(ipmi_lan_config_t *, unsigned int, unsigned int);
4838
int (*set_data_sel)(ipmi_lan_config_t *, unsigned int,
4839
unsigned char *, unsigned int);
4849
#define H(x) ipmi_lanconfig_set_ ## x
4852
static setlan_parm_t lan_conf[] =
4855
#define V ip_addr_source
4856
{ C(V), G(V), N, N, N },
4859
{ C(V), G(V), N, N, N },
4861
#define V ipv4_flags
4862
{ C(V), G(V), N, N, N },
4864
#define V ipv4_precedence
4865
{ C(V), G(V), N, N, N },
4868
{ C(V), G(V), N, N, N },
4870
#define V enable_auth_oem
4871
{ C(V), N, N, G(V), N },
4873
#define V enable_auth_straight
4874
{ C(V), N, N, G(V), N },
4876
#define V enable_auth_md5
4877
{ C(V), N, N, G(V), N },
4879
#define V enable_auth_md2
4880
{ C(V), N, N, G(V), N },
4882
#define V enable_auth_none
4883
{ C(V), N, N, G(V), N },
4886
{ C(V), N, G(V), N, N },
4889
{ C(V), N, G(V), N, N },
4891
#define V subnet_mask
4892
{ C(V), N, G(V), N, N },
4894
#define V primary_rmcp_port
4895
{ C(V), N, G(V), N, N },
4897
#define V secondary_rmcp_port
4898
{ C(V), N, G(V), N, N },
4900
#define V bmc_generated_arps
4901
{ C(V), G(V), N, N, N },
4903
#define V bmc_generated_garps
4904
{ C(V), G(V), N, N, N },
4906
#define V garp_interval
4907
{ C(V), G(V), N, N, N },
4909
#define V default_gateway_ip_addr
4910
{ C(V), N, G(V), N, N },
4912
#define V default_gateway_mac_addr
4913
{ C(V), N, G(V), N, N },
4915
#define V backup_gateway_ip_addr
4916
{ C(V), N, G(V), N, N },
4918
#define V backup_gateway_mac_addr
4919
{ C(V), N, G(V), N, N },
4922
{ C(V), N, N, G(V), N },
4925
{ C(V), N, N, G(V), N },
4927
#define V alert_retry_interval
4928
{ C(V), N, N, G(V), N },
4930
#define V max_alert_retries
4931
{ C(V), N, N, G(V), N },
4933
#define V dest_format
4934
{ C(V), N, N, G(V), N },
4937
{ C(V), N, N, G(V), N },
4939
#define V dest_ip_addr
4940
{ C(V), N, N, N, G(V) },
4942
#define V dest_mac_addr
4943
{ C(V), N, N, N, G(V) },
4948
setlanparm_cmd(char *cmd, char **toks, void *cb_data)
4952
unsigned char data[30];
4958
if (!lanparm_config) {
4959
cmd_win_out("No LAN config read, use readlan to fetch one\n");
4963
name = strtok_r(NULL, " \t\n", toks);
4965
cmd_win_out("No LAN config name given\n");
4969
for (i=0; lan_conf[i].name != NULL; i++) {
4970
if (strcmp(lan_conf[i].name, name) == 0)
4974
if (lan_conf[i].name == NULL) {
4975
if (strcmp(name, "community_string") == 0) {
4976
if (get_uint(toks, &sel, "selector"))
4978
str = strtok_r(NULL, "", toks);
4979
rv = ipmi_lanconfig_set_community_string(lanparm_config,
4982
cmd_win_out("Invalid LAN config name: '%s'\n", name);
4985
} else if (lan_conf[i].set_val) {
4986
if (get_uint(toks, &val, "value"))
4988
rv = lan_conf[i].set_val(lanparm_config, val);
4989
} else if (lan_conf[i].set_data) {
4990
for (j=0; j<sizeof(data); j++) {
4991
if (get_uchar(toks, data+j, NULL))
4994
rv = lan_conf[i].set_data(lanparm_config, data, j);
4995
} else if (lan_conf[i].set_val_sel) {
4996
if (get_uint(toks, &sel, "selector"))
4998
if (get_uint(toks, &val, "value"))
5000
rv = lan_conf[i].set_val_sel(lanparm_config, sel, val);
5001
} else if (lan_conf[i].set_data_sel) {
5002
if (get_uint(toks, &sel, "selector"))
5004
for (j=0; j<sizeof(data); j++) {
5005
if (get_uchar(toks, data+j, NULL))
5008
rv = lan_conf[i].set_data_sel(lanparm_config, sel, data, j);
5011
cmd_win_out("Error setting parm: 0x%x\n", rv);
5015
static ipmi_pet_t *pet;
5017
typedef struct pet_info_s
5019
unsigned int connection;
5020
unsigned int channel;
5021
struct in_addr ip_addr;
5022
unsigned char mac_addr[6];
5023
unsigned int eft_sel;
5024
unsigned int policy_num;
5025
unsigned int apt_sel;
5026
unsigned int lan_dest_sel;
5030
pet_done(ipmi_pet_t *pet, int err, void *cb_data)
5033
ui_log("Error setting pet: %x\n", err);
5039
pet_domain_cb(ipmi_domain_t *domain, void *cb_data)
5041
pet_info_t *info = cb_data;
5044
rv = ipmi_pet_create(domain,
5057
cmd_win_out("Error creating PET: %x\n", rv);
5061
pet_cmd(char *cmd, char **toks, void *cb_data)
5067
ipmi_pet_destroy(pet, NULL, NULL);
5071
if (get_uint(toks, &info.connection, "connection"))
5073
if (get_uint(toks, &info.channel, "channel"))
5075
if (get_ip_addr(toks, &info.ip_addr, "IP address"))
5077
if (get_mac_addr(toks, info.mac_addr, "MAC address"))
5079
if (get_uint(toks, &info.eft_sel, "eft selector"))
5081
if (get_uint(toks, &info.policy_num, "policy_num"))
5083
if (get_uint(toks, &info.apt_sel, "apt selector"))
5085
if (get_uint(toks, &info.lan_dest_sel, "LAN dest selector"))
5088
rv = ipmi_domain_pointer_cb(domain_id, pet_domain_cb, &info);
5090
cmd_win_out("Error converting domain");
5094
typedef struct msg_cmd_data_s
5096
unsigned char data[MCCMD_DATA_SIZE];
5097
unsigned int data_len;
5098
ipmi_ipmb_addr_t addr;
5103
mccmd_addr_rsp_handler(ipmi_domain_t *domain, ipmi_msgi_t *rspi)
5105
ipmi_msg_t *msg = &rspi->msg;
5107
unsigned char *data;
5109
display_pad_clear();
5110
curr_display_type = DISPLAY_RSP;
5111
display_pad_out("Response:\n");
5112
display_pad_out(" NetFN = 0x%2.2x\n", msg->netfn);
5113
display_pad_out(" Command = 0x%2.2x\n", msg->cmd);
5114
display_pad_out(" Completion code = 0x%2.2x\n", msg->data[0]);
5115
display_pad_out(" data =");
5116
data = msg->data + 1;
5117
for (i=0; i+1<msg->data_len; i++) {
5118
if ((i != 0) && ((i % 8) == 0))
5119
display_pad_out("\n ");
5120
display_pad_out(" %2.2x", data[i]);
5122
display_pad_out("\n");
5123
display_pad_refresh();
5124
return IPMI_MSG_ITEM_NOT_USED;
5128
msg_cmder(ipmi_domain_t *domain, void *cb_data)
5130
msg_cmd_data_t *info = cb_data;
5133
rv = ipmi_send_command_addr(domain,
5134
(ipmi_addr_t *) &(info->addr),
5137
mccmd_addr_rsp_handler,
5140
cmd_win_out("Send command failure: %x\n", rv);
5144
msg_cmd(char *cmd, char **toks, void *cb_data)
5146
msg_cmd_data_t info;
5147
unsigned int channel;
5150
info.addr.addr_type = IPMI_IPMB_ADDR_TYPE;
5151
if (get_uint(toks, &channel, "channel"))
5153
info.addr.channel = channel;
5155
if (get_uchar(toks, &info.addr.slave_addr, "slave address"))
5158
if (info.addr.slave_addr == 0) {
5159
info.addr.addr_type = IPMI_IPMB_BROADCAST_ADDR_TYPE;
5160
if (get_uchar(toks, &info.addr.slave_addr, "slave address"))
5164
if (get_uchar(toks, &info.addr.lun, "LUN"))
5167
if (get_uchar(toks, &info.msg.netfn, "NetFN"))
5170
if (get_uchar(toks, &info.msg.cmd, "command"))
5173
for (info.data_len=0; ; info.data_len++) {
5174
if (get_uchar(toks, info.data+info.data_len, NULL))
5178
info.msg.data_len = info.data_len;
5179
info.msg.data = info.data;
5181
rv = ipmi_domain_pointer_cb(domain_id, msg_cmder, &info);
5183
cmd_win_out("Unable to convert domain id to a pointer\n");
5187
display_pad_refresh();
5193
set_control(ipmi_control_t *control, void *cb_data)
5195
char **toks = cb_data;
5199
unsigned char *cvals = NULL;
5205
control_type = ipmi_control_get_type(control);
5206
switch (control_type) {
5207
case IPMI_CONTROL_LIGHT:
5208
if (ipmi_control_light_set_with_setting(control)) {
5209
ipmi_light_setting_t *setting;
5211
num_vals = ipmi_control_get_num_vals(control);
5212
setting = ipmi_alloc_light_settings(num_vals);
5214
cmd_win_out("set_control: out of memory\n");
5218
for (i=0; i<num_vals; i++) {
5221
if (get_uint(toks, &val, "light color"))
5222
goto out_free_light;
5223
ipmi_light_setting_set_color(setting, i, val);
5225
if (get_uint(toks, &val, "light on time"))
5226
goto out_free_light;
5227
ipmi_light_setting_set_on_time(setting, i, val);
5229
if (get_uint(toks, &val, "light off time"))
5230
goto out_free_light;
5231
ipmi_light_setting_set_off_time(setting, i, val);
5233
if (get_uint(toks, &val, "local control"))
5234
goto out_free_light;
5235
ipmi_light_setting_set_local_control(setting, i, val);
5238
rv = ipmi_control_set_light(control, setting, NULL, NULL);
5240
cmd_win_out("set_control: Returned error 0x%x\n", rv);
5243
ipmi_free_light_settings(setting);
5247
case IPMI_CONTROL_RELAY:
5248
case IPMI_CONTROL_ALARM:
5249
case IPMI_CONTROL_RESET:
5250
case IPMI_CONTROL_ONE_SHOT_RESET:
5251
case IPMI_CONTROL_POWER:
5252
case IPMI_CONTROL_FAN_SPEED:
5253
case IPMI_CONTROL_OUTPUT:
5254
case IPMI_CONTROL_ONE_SHOT_OUTPUT:
5255
num_vals = ipmi_control_get_num_vals(control);
5256
vals = ipmi_mem_alloc(sizeof(*vals) * num_vals);
5258
cmd_win_out("set_control: out of memory\n");
5262
for (i=0; i<num_vals; i++) {
5263
tok = strtok_r(NULL, " \t\n", toks);
5265
cmd_win_out("set_control: Value %d is not present\n", i);
5268
vals[i] = strtol(tok, &estr, 0);
5269
if (*estr != '\0') {
5270
cmd_win_out("set_control: Value %d is invalid\n", i);
5275
rv = ipmi_control_set_val(control, vals, NULL, NULL);
5277
cmd_win_out("set_control: Returned error 0x%x\n", rv);
5282
case IPMI_CONTROL_DISPLAY:
5285
case IPMI_CONTROL_IDENTIFIER:
5286
num_vals = ipmi_control_identifier_get_max_length(control);
5287
cvals = ipmi_mem_alloc(sizeof(*cvals) * num_vals);
5289
cmd_win_out("set_control: out of memory\n");
5293
for (i=0; i<num_vals; i++) {
5294
tok = strtok_r(NULL, " \t\n", toks);
5296
cmd_win_out("set_control: Value %d is not present\n", i);
5299
cvals[i] = strtol(tok, &estr, 0);
5300
if (*estr != '\0') {
5301
cmd_win_out("set_control: Value %d is invalid\n", i);
5306
rv = ipmi_control_identifier_set_val(control, cvals, num_vals,
5309
cmd_win_out("set_control: Returned error 0x%x\n", rv);
5315
ipmi_mem_free(vals);
5317
ipmi_mem_free(cvals);
5321
set_control_cmd(char *cmd, char **toks, void *cb_data)
5325
if (curr_display_type != DISPLAY_CONTROL) {
5326
cmd_win_out("The current displayed item is not a control\n");
5330
rv = ipmi_control_pointer_cb(curr_control_id, set_control, toks);
5332
cmd_win_out("set_control: Unable to get control pointer: 0x%x\n", rv);
5339
delevent_cb(ipmi_domain_t *domain, int err, void *cb_data)
5342
ui_log("Error deleting log: %x\n", err);
5344
ui_log("log deleted\n");
5347
typedef struct delevent_info_s
5355
delevent_cmder(ipmi_domain_t *domain, void *cb_data)
5358
delevent_info_t *info = cb_data;
5359
ipmi_event_t *event, *n;
5362
info->mc_id.domain_id = domain_id;
5364
event = ipmi_domain_first_event(domain);
5366
if ((ipmi_cmp_mc_id_noseq(ipmi_event_get_mcid(event),info->mc_id) == 0)
5367
&& (ipmi_event_get_record_id(event) == info->record_id))
5369
rv = ipmi_domain_del_event(domain, event, delevent_cb, NULL);
5371
cmd_win_out("error deleting log: %x\n", rv);
5372
ipmi_event_free(event);
5376
n = ipmi_domain_next_event(domain, event);
5377
ipmi_event_free(event);
5382
cmd_win_out("log not found\n");
5386
delevent_cmd(char *cmd, char **toks, void *cb_data)
5388
delevent_info_t info;
5391
if (get_mc_id(toks, &info.mc_id))
5394
if (get_uint(toks, &info.record_id, "record id"))
5397
rv = ipmi_domain_pointer_cb(domain_id, delevent_cmder, &info);
5399
cmd_win_out("Unable to convert domain id to a pointer\n");
5406
addevent_cb(ipmi_mc_t *mc, unsigned int record_id, int err, void *cb_data)
5409
ui_log("Error adding event: %x\n", err);
5411
ui_log("event 0x%4.4x added\n", record_id);
5414
typedef struct addevent_info_s
5417
unsigned int record_id;
5419
ipmi_time_t timestamp;
5420
unsigned char data[13];
5424
addevent_cmder(ipmi_mc_t *mc, void *cb_data)
5427
addevent_info_t *info = cb_data;
5428
ipmi_event_t *event;
5430
event = ipmi_event_alloc(ipmi_mc_convert_to_id(mc),
5437
cmd_win_out("Could not allocate event\n");
5441
rv = ipmi_mc_add_event_to_sel(mc, event, addevent_cb, NULL);
5443
cmd_win_out("Unable to send add event: %x\n", rv);
5444
ipmi_event_free(event);
5448
addevent_cmd(char *cmd, char **toks, void *cb_data)
5450
addevent_info_t info;
5453
struct timeval time;
5455
if (get_mc_id(toks, &info.mc_id))
5458
if (get_uint(toks, &info.record_id, "record id"))
5461
if (get_uint(toks, &info.type, "record type"))
5464
for (i=0; i<13; i++) {
5465
if (get_uchar(toks, &info.data[i], "data"))
5469
gettimeofday(&time, NULL);
5470
info.timestamp = time.tv_sec * 1000000000;
5472
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, addevent_cmder, &info);
5474
cmd_win_out("Unable to convert domain id to a pointer\n");
5481
debug_cmd(char *cmd, char **toks, void *cb_data)
5487
type = strtok_r(NULL, " \t\n", toks);
5489
cmd_win_out("No debug type specified\n");
5493
on_off = strtok_r(NULL, " \t\n", toks);
5495
cmd_win_out("on or off not specified\n");
5497
} else if (strcmp(on_off, "on") == 0) {
5499
} else if (strcmp(on_off, "off") == 0) {
5502
cmd_win_out("on or off not specified, got '%s'\n", on_off);
5506
if (strcmp(type, "msg") == 0) {
5507
if (val) DEBUG_MSG_ENABLE(); else DEBUG_MSG_DISABLE();
5508
} else if (strcmp(type, "rawmsg") == 0) {
5509
if (val) DEBUG_RAWMSG_ENABLE(); else DEBUG_RAWMSG_DISABLE();
5510
} else if (strcmp(type, "locks") == 0) {
5511
if (val) DEBUG_LOCKS_ENABLE(); else DEBUG_LOCKS_DISABLE();
5512
} else if (strcmp(type, "events") == 0) {
5513
if (val) DEBUG_EVENTS_ENABLE(); else DEBUG_EVENTS_DISABLE();
5514
} else if (strcmp(type, "con0") == 0) {
5515
if (val) DEBUG_CON_FAIL_ENABLE(0); else DEBUG_CON_FAIL_DISABLE(0);
5516
} else if (strcmp(type, "con1") == 0) {
5517
if (val) DEBUG_CON_FAIL_ENABLE(1); else DEBUG_CON_FAIL_DISABLE(1);
5518
} else if (strcmp(type, "con2") == 0) {
5519
if (val) DEBUG_CON_FAIL_ENABLE(2); else DEBUG_CON_FAIL_DISABLE(2);
5520
} else if (strcmp(type, "con3") == 0) {
5521
if (val) DEBUG_CON_FAIL_ENABLE(3); else DEBUG_CON_FAIL_DISABLE(3);
5523
cmd_win_out("Invalid debug type specified: '%s'\n", type);
5532
clear_sel_cmder(ipmi_domain_t *domain, void *cb_data)
5534
ipmi_event_t *event, *event2;
5536
event = ipmi_domain_first_event(domain);
5539
event = ipmi_domain_next_event(domain, event2);
5540
ipmi_domain_del_event(domain, event2, NULL, NULL);
5541
ipmi_event_free(event2);
5546
clear_sel_cmd(char *cmd, char **toks, void *cb_data)
5550
rv = ipmi_domain_pointer_cb(domain_id, clear_sel_cmder, NULL);
5552
cmd_win_out("Unable to convert domain id to a pointer\n");
5559
list_sel_cmder(ipmi_domain_t *domain, void *cb_data)
5562
ipmi_event_t *event, *event2;
5563
unsigned int count1, count2;
5565
curr_display_type = EVENTS;
5566
display_pad_clear();
5567
rv = ipmi_domain_sel_count(domain, &count1);
5570
rv = ipmi_domain_sel_entries_used(domain, &count2);
5573
display_pad_out("Event counts: %d entries, %d slots used\n",
5575
display_pad_out("Events:\n");
5576
event = ipmi_domain_first_event(domain);
5578
ipmi_mcid_t mcid = ipmi_event_get_mcid(event);
5579
unsigned int record_id = ipmi_event_get_record_id(event);
5580
unsigned int type = ipmi_event_get_type(event);
5581
ipmi_time_t timestamp = ipmi_event_get_timestamp(event);
5582
unsigned int data_len = ipmi_event_get_data_len(event);
5583
unsigned char *data = ipmi_event_get_data_ptr(event);
5586
display_pad_out(" (%x %x) %4.4x:%2.2x %lld:",
5587
mcid.channel, mcid.mc_num, record_id, type, timestamp);
5588
for (i=0; i<data_len; i++)
5589
display_pad_out(" %2.2x", data[i]);
5590
display_pad_out("\n");
5591
event2 = ipmi_domain_next_event(domain, event);
5592
ipmi_event_free(event);
5595
display_pad_refresh();
5599
list_sel_cmd(char *cmd, char **toks, void *cb_data)
5603
rv = ipmi_domain_pointer_cb(domain_id, list_sel_cmder, NULL);
5605
cmd_win_out("Unable to convert domain id to a pointer\n");
5612
sel_time_fetched(ipmi_mc_t *mc,
5618
display_pad_out("MC went away while fetching SEL time\n");
5623
display_pad_out("Error fetching SEL time: %x\n", err);
5627
display_pad_out("SEL time is 0x%x\n", time);
5630
display_pad_refresh();
5633
void get_sel_time_handler(ipmi_mc_t *mc, void *cb_data)
5635
mccmd_info_t *info = cb_data;
5639
rv = ipmi_mc_get_current_sel_time(mc, sel_time_fetched, NULL);
5641
cmd_win_out("Error sending SEL time fetch: %x\n", rv);
5645
get_sel_time_cmd(char *cmd, char **toks, void *cb_data)
5650
if (get_mc_id(toks, &info.mc_id))
5654
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, get_sel_time_handler, &info);
5656
cmd_win_out("Unable to find MC\n");
5660
cmd_win_out("Unable to find MC (%d %x)\n",
5661
info.mc_id.channel, info.mc_id.mc_num);
5663
display_pad_refresh();
5669
mc_reset_done(ipmi_mc_t *mc, int err, void *cb_data)
5672
ui_log("Error resetting mc: %x", err);
5678
mc_reset_handler(ipmi_mc_t *mc, void *cb_data)
5680
mccmd_info_t *info = cb_data;
5684
rv = ipmi_mc_reset(mc, info->msg.cmd, mc_reset_done, NULL);
5686
cmd_win_out("Error sending MC reset: %x\n", rv);
5690
mc_reset_cmd(char *cmd, char **toks, void *cb_data)
5696
if (get_mc_id(toks, &info.mc_id))
5699
type = strtok_r(NULL, " \n\t", toks);
5701
cmd_win_out("No reset type given, must be 'cold' or 'warm'\n");
5705
if (strcmp(type, "warm") == 0) {
5706
info.msg.cmd = IPMI_MC_RESET_WARM;
5707
} else if (strcmp(type, "cold") == 0) {
5708
info.msg.cmd = IPMI_MC_RESET_COLD;
5710
cmd_win_out("Invalid reset type given, must be 'cold' or 'warm'\n");
5715
rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mc_reset_handler, &info);
5717
cmd_win_out("Unable to find MC\n");
5721
cmd_win_out("Unable to find MC (%d %x)\n",
5722
info.mc_id.channel, info.mc_id.mc_num);
5724
display_pad_refresh();
5729
typedef struct sdrs_info_s
5733
unsigned char do_sensors;
5736
void sdrs_fetched(ipmi_sdr_info_t *sdrs,
5742
sdrs_info_t *info = cb_data;
5748
ui_log("Error fetching sdrs: %x\n", err);
5753
ui_log("sdrs went away during fetch\n");
5757
display_pad_clear();
5758
curr_display_type = DISPLAY_SDRS;
5760
display_pad_out("%s SDRs for MC (%x %x)\n",
5761
info->do_sensors ? "device" : "main",
5762
info->mc_id.channel, info->mc_id.mc_num);
5763
for (i=0; i<count; i++) {
5767
rv = ipmi_get_sdr_by_index(sdrs, i, &sdr);
5769
display_pad_out("*could not get index %d\n", i);
5772
total_size += sdr.length+5;
5773
display_pad_out("%4.4x: type %x, version %d.%d",
5774
sdr.record_id, sdr.type, sdr.major_version, sdr.minor_version);
5775
for (j=0; j<sdr.length; j++) {
5777
display_pad_out("\n ");
5778
display_pad_out(" %2.2x", sdr.data[j]);
5780
display_pad_out("\n");
5782
display_pad_out("total bytes in SDRs: %d\n", total_size);
5783
display_pad_refresh();
5786
ipmi_sdr_info_destroy(sdrs, NULL, NULL);
5787
ipmi_mem_free(info);
5791
start_sdr_dump(ipmi_mc_t *mc, sdrs_info_t *info)
5793
ipmi_sdr_info_t *sdrs;
5796
rv = ipmi_sdr_info_alloc(ipmi_mc_get_domain(mc),
5797
mc, 0, info->do_sensors, &sdrs);
5799
cmd_win_out("Unable to alloc sdr info: %x\n", rv);
5800
ipmi_mem_free(info);
5804
rv = ipmi_sdr_fetch(sdrs, sdrs_fetched, info);
5806
cmd_win_out("Unable to start SDR fetch: %x\n", rv);
5807
ipmi_sdr_info_destroy(sdrs, NULL, NULL);
5808
ipmi_mem_free(info);
5814
sdrs_mcs_handler(ipmi_mc_t *mc,
5817
sdrs_info_t *info = cb_data;
5820
start_sdr_dump(mc, info);
5824
sdrs_cmd(char *cmd, char **toks, void *cb_data)
5829
info = ipmi_mem_alloc(sizeof(*info));
5831
ui_log("Could not allocate memory for SDR fetch\n");
5835
if (get_mc_id(toks, &info->mc_id)) {
5836
ipmi_mem_free(info);
5840
if (get_uchar(toks, &info->do_sensors, "do_sensors")) {
5841
ipmi_mem_free(info);
5847
rv = ipmi_mc_pointer_noseq_cb(info->mc_id, sdrs_mcs_handler, info);
5849
cmd_win_out("Unable to find MC\n");
5850
ipmi_mem_free(info);
5853
cmd_win_out("Unable to find that mc\n");
5854
ipmi_mem_free(info);
5860
typedef struct scan_cmd_info_s
5863
unsigned char channel;
5866
void scan_done(ipmi_domain_t *domain, int err, void *cb_data)
5868
log_pad_out("Bus scan done\n");
5872
scan_cmder(ipmi_domain_t *domain, void *cb_data)
5874
scan_cmd_info_t *info = cb_data;
5876
ipmi_start_ipmb_mc_scan(domain, info->channel,
5877
info->addr, info->addr,
5882
scan_cmd(char *cmd, char **toks, void *cb_data)
5885
scan_cmd_info_t info;
5887
if (get_uchar(toks, &info.channel, "channel"))
5890
if (get_uchar(toks, &info.addr, "IPMB address"))
5893
rv = ipmi_domain_pointer_cb(domain_id, scan_cmder, &info);
5895
cmd_win_out("Unable to convert domain id to a pointer\n");
5901
presence_cmder(ipmi_domain_t *domain, void *cb_data)
5905
rv = ipmi_detect_domain_presence_changes(domain, 1);
5907
cmd_win_out("domain presence detect error: %x\n", rv);
5911
presence_cmd(char *cmd, char **toks, void *cb_data)
5915
rv = ipmi_domain_pointer_cb(domain_id, presence_cmder, NULL);
5917
cmd_win_out("Unable to convert domain id to a pointer\n");
5925
is_con_active_cmder(ipmi_domain_t *domain, void *cb_data)
5928
unsigned int *connection = cb_data;
5931
rv = ipmi_domain_is_connection_active(domain, *connection, &val);
5933
cmd_win_out("Invalid connection number %d: %x\n", *connection, rv);
5935
cmd_win_out("Connection %d is%s active\n",
5936
*connection, val ? "" : " not");
5940
is_con_active_cmd(char *cmd, char **toks, void *cb_data)
5943
unsigned int connection;
5945
if (get_uint(toks, &connection, "connection"))
5948
rv = ipmi_domain_pointer_cb(domain_id, is_con_active_cmder, &connection);
5950
cmd_win_out("Unable to convert domain id to a pointer\n");
5958
activate_con_cmder(ipmi_domain_t *domain, void *cb_data)
5961
unsigned int *connection = cb_data;
5963
rv = ipmi_domain_activate_connection(domain, *connection);
5965
cmd_win_out("Invalid connection number %d: %x\n", *connection, rv);
5969
activate_con_cmd(char *cmd, char **toks, void *cb_data)
5972
unsigned int connection;
5974
if (get_uint(toks, &connection, "connection"))
5977
rv = ipmi_domain_pointer_cb(domain_id, activate_con_cmder, &connection);
5979
cmd_win_out("Unable to convert domain id to a pointer\n");
5987
quit_cmd(char *cmd, char **toks, void *cb_data)
5991
rv = ipmi_domain_pointer_cb(domain_id, leave_cmder, NULL);
5999
display_win_cmd(char *cmd, char **toks, void *cb_data)
6001
curr_win = DISPLAY_WIN_SCROLL;
6006
log_win_cmd(char *cmd, char **toks, void *cb_data)
6008
curr_win = LOG_WIN_SCROLL;
6013
new_domain_cmd(char *cmd, char **toks, void *cb_data)
6017
unsigned int curr_parm;
6018
ipmi_args_t *con_parms[2];
6024
for (num_parms=0; num_parms<30; num_parms++) {
6025
parms[num_parms] = strtok_r(NULL, " \t\n", toks);
6026
if (!parms[num_parms])
6028
/* Remove surrounding quotes, if any. */
6029
if (parms[num_parms][0] == '"') {
6030
(parms[num_parms])++;
6031
if (parms[num_parms][0])
6032
parms[num_parms][strlen(parms[num_parms])-1] = '\0';
6036
if (num_parms < 2) {
6037
cmd_win_out("Not enough parms given\n");
6042
rv = ipmi_parse_args(&curr_parm, num_parms, parms, &con_parms[set]);
6044
cmd_win_out("First connection parms are invalid\n");
6049
if (curr_parm > num_parms) {
6050
rv = ipmi_parse_args(&curr_parm, num_parms, parms, &con_parms[set]);
6052
ipmi_free_args(con_parms[0]);
6053
cmd_win_out("Second connection parms are invalid\n");
6059
for (i=0; i<set; i++) {
6060
rv = ipmi_args_setup_con(con_parms[i],
6061
&ipmi_ui_cb_handlers,
6065
cmd_win_out("ipmi_ip_setup_con: %s\n", strerror(rv));
6070
rv = ipmi_open_domain(parms[0], con, set, ipmi_ui_setup_done,
6071
NULL, NULL, NULL, NULL, 0, NULL);
6073
cmd_win_out("ipmi_open_domain: %s\n", strerror(rv));
6074
for (i=0; i<set; i++)
6075
con[i]->close_connection(con[i]);
6079
cmd_win_out("Domain started\n");
6081
for (i=0; i<set; i++)
6082
ipmi_free_args(con_parms[i]);
6089
final_close(void *cb_data)
6091
ui_log("Domain close");
6094
typedef struct domain_scan_s
6101
close_domain_handler(ipmi_domain_t *domain, void *cb_data)
6103
domain_scan_t *info = cb_data;
6104
char name[IPMI_DOMAIN_NAME_LEN];
6106
ipmi_domain_get_name(domain, name, sizeof(name));
6107
if (strcmp(name, info->name) == 0) {
6109
info->err = ipmi_domain_close(domain, final_close, NULL);
6111
cmd_win_out("Could not close connection\n");
6117
close_domain_cmd(char *cmd, char **toks, void *cb_data)
6122
info.name = strtok_r(NULL, " \t\n", toks);
6124
cmd_win_out("No domain given\n");
6128
ipmi_domain_iterate_domains(close_domain_handler, &info);
6134
set_domain_handler(ipmi_domain_t *domain, void *cb_data)
6136
domain_scan_t *info = cb_data;
6137
char name[IPMI_DOMAIN_NAME_LEN];
6139
ipmi_domain_get_name(domain, name, sizeof(name));
6140
if (strcmp(name, info->name) == 0) {
6143
domain_id = ipmi_domain_convert_to_id(domain);
6148
set_domain_cmd(char *cmd, char **toks, void *cb_data)
6153
info.name = strtok_r(NULL, " \t\n", toks);
6155
cmd_win_out("No domain given\n");
6159
ipmi_domain_iterate_domains(set_domain_handler, &info);
6161
cmd_win_out("Error setting domain: 0x%x\n", info.err);
6167
domains_handler(ipmi_domain_t *domain, void *cb_data)
6169
char name[IPMI_DOMAIN_NAME_LEN];
6171
ipmi_domain_get_name(domain, name, sizeof(name));
6172
display_pad_out(" %s\n", name);
6176
domains_cmd(char *cmd, char **toks, void *cb_data)
6178
display_pad_clear();
6179
display_pad_out("Domains:\n");
6180
ipmi_domain_iterate_domains(domains_handler, NULL);
6181
display_pad_refresh();
6186
static int help_cmd(char *cmd, char **toks, void *cb_data);
6190
cmd_handler_t handler;
6194
{ "display_win", display_win_cmd,
6195
" - Sets the display window (left window) for scrolling" },
6196
{ "log_win", log_win_cmd,
6197
" - Sets the log window (right window) for scrolling" },
6198
{ "entities", entities_cmd,
6199
" - list all the entities the UI knows about" },
6200
{ "entity", entity_cmd,
6201
" <entity name> - list all the info about an entity" },
6202
{ "hs_get_act_time", hs_get_act_time,
6204
" - Get the host-swap auto-activate time" },
6205
{ "hs_set_act_time", hs_set_act_time,
6206
" <entity name> <time in nanoseconds>"
6207
" - Set the host-swap auto-activate time" },
6208
{ "hs_get_deact_time", hs_get_deact_time,
6210
" - Get the host-swap auto-deactivate time" },
6211
{ "hs_set_deact_time", hs_set_deact_time,
6212
" <entity name> <time in nanoseconds>"
6213
" - Set the host-swap auto-deactivate time" },
6214
{ "hs_activation_request", hs_activation_request,
6215
" <entity name> - Act like a user requested an activation of the"
6216
" entity. This is generally equivalent to closing the handle"
6217
" latch or something like that." },
6218
{ "hs_activate", hs_activate,
6219
" <entity name> - activate the given entity" },
6220
{ "hs_deactivate", hs_deactivate,
6221
" <entity name> - deactivate the given entity" },
6222
{ "hs_state", hs_state,
6223
" <entity name> - Return the current hot-swap state" },
6224
{ "hs_check", hs_check_cmd,
6225
" - Check all the entities hot-swap states" },
6226
{ "sensors", sensors_cmd,
6227
" <entity name> - list all the sensors that monitor the entity" },
6228
{ "sensor", sensor_cmd,
6229
" <sensor name> - Pull up all the information on the sensor and start"
6232
" <entity name> - dump fru information" },
6233
{ "dump_fru", dump_fru_cmd,
6234
" <is_logical> <device_address> <device_id> <lun> <private_bus>"
6235
" <channel> - dump a fru given all it's insundry information" },
6236
{ "rearm", rearm_cmd,
6237
" - rearm the current sensor" },
6238
{ "set_hysteresis", set_hysteresis_cmd,
6239
" <val> - Sets the hysteresis for the current sensor" },
6240
{ "get_hysteresis", get_hysteresis_cmd,
6241
" - Gets the hysteresis for the current sensor" },
6242
{ "controls", controls_cmd,
6243
" <entity name> - list all the controls attached to the entity" },
6244
{ "control", control_cmd,
6245
" <control name> - Pull up all the information on the control and start"
6247
{ "set_control", set_control_cmd,
6248
" <val1> [<val2> ...] - set the value(s) for the control" },
6250
" - List all the management controllers in the system. They"
6251
" are listed (<channel>, <mc num>)" },
6253
" <channel> <mc num>"
6254
" - Dump info on the given MC"},
6255
{ "mc_reset", mc_reset_cmd,
6256
" <channel> <mc num> [warm | cold]"
6257
" - Do a warm or cold reset on the given MC"},
6258
{ "mccmd", mccmd_cmd,
6259
" <channel> <mc num> <LUN> <NetFN> <Cmd> [data...]"
6260
" - Send the given command"
6261
" to the management controller and display the response" },
6262
{ "mc_events_enable", mc_events_enable_cmd,
6263
" <channel> <mc num> <enabled> - set enabled to 0 to disable events,"
6264
" 1 to enable them. This is the global event enable on the MC." },
6265
{ "mc_events_enabled", mc_events_enabled_cmd,
6266
" <channel> <mc num> - Prints out if the events are enabled for"
6269
" <channel> <IPMB addr> <LUN> <NetFN> <Cmd> [data...] - Send a command"
6270
" to the given IPMB address on the given channel and display the"
6272
{ "readpef", readpef_cmd,
6273
" <channel> <mc num>"
6274
" - read pef information from an MC" },
6275
{ "clearpeflock", clearpeflock_cmd,
6276
" [<channel> <mc num>]"
6277
" - Clear a PEF lock. If the MC is given, then the PEF is directly"
6278
" cleared. If not given, then the current PEF is cleared" },
6279
{ "viewpef", viewpef_cmd,
6280
" - show current pef information " },
6281
{ "writepef", writepef_cmd,
6282
" <channel> <mc num>"
6283
" - write the current PEF information to an MC" },
6284
{ "setpef", setpef_cmd,
6285
" <config> [<selector>] <value>"
6286
" - Set the given config item to the value. The optional selector"
6287
" is used for items that take a selector" },
6288
{ "readlanparm", readlanparm_cmd,
6289
" <channel> <mc num> <channel>"
6290
" - read lanparm information from an MC" },
6291
{ "viewlanparm", viewlanparm_cmd,
6292
" - show current lanparm information " },
6293
{ "writelanparm", writelanparm_cmd,
6294
" <channel> <mc num> <channel>"
6295
" - write the current LANPARM information to an MC" },
6296
{ "clearlanparmlock", clearlanparmlock_cmd,
6297
" [<channel> <mc num> <channel>]"
6298
" - Clear a LANPARM lock. If the MC is given, then the LANPARM is"
6300
" cleared. If not given, then the current LANPARM is cleared" },
6301
{ "setlanparm", setlanparm_cmd,
6302
" <config> [<selector>] <value>"
6303
" - Set the given config item to the value. The optional selector"
6304
" is used for items that take a selector" },
6306
" <connection> <channel> <ip addr> <mac_addr> <eft selector>"
6307
" <policy num> <apt selector>"
6308
" <lan dest selector> - "
6309
"Set up the domain to send PET traps from the given connection"
6310
" to the given IP/MAC address over the given channel" },
6311
{ "delevent", delevent_cmd,
6312
" <channel> <mc num> <log number> - "
6313
"Delete the given event number from the SEL" },
6314
{ "addevent", addevent_cmd,
6315
" <channel> <mc num> <record id> <type> <13 bytes of data> - "
6316
"Add the event data to the SEL" },
6317
{ "debug", debug_cmd,
6318
" <type> on|off - Turn the given debugging type on or off." },
6319
{ "clear_sel", clear_sel_cmd,
6320
" - clear the system event log" },
6321
{ "list_sel", list_sel_cmd,
6322
" - list the local copy of the system event log" },
6323
{ "get_sel_time", get_sel_time_cmd,
6324
" <channel> <mc num> - Get the time in the SEL for the given MC" },
6326
" <channel> <mc num> <do_sensors> - list the SDRs for the mc."
6328
" 1, then the device SDRs are fetched. Otherwise the main SDRs are"
6330
{ "events_enable", events_enable_cmd,
6331
" <events> <scanning> <assertion bitmask> <deassertion bitmask>"
6332
" - set the events enable data for the sensor" },
6334
" <ipmb addr> - scan an IPMB to add or remove it" },
6335
{ "is_con_active", is_con_active_cmd,
6336
" <connection> - print out if the given connection is active or not" },
6337
{ "activate_con", activate_con_cmd,
6338
" <connection> - Activate the given connection" },
6340
" - leave the program" },
6341
{ "check_presence", presence_cmd,
6342
" - Check the presence of entities" },
6343
{ "new_domain", new_domain_cmd,
6344
" <domain name> <parms...> - Open a connection to a new domain" },
6345
{ "close_domain", close_domain_cmd,
6346
" <num> - close the given domain number" },
6347
{ "set_domain", set_domain_cmd,
6348
" <num> - Use the given domain number" },
6349
{ "domains", domains_cmd,
6350
" - List all the domains" },
6361
commands = command_alloc();
6365
for (i=0; cmd_list[i].name != NULL; i++) {
6366
err = command_bind(commands, cmd_list[i].name, cmd_list[i].handler);
6374
command_free(commands);
6379
help_cmd(char *cmd, char **toks, void *cb_data)
6383
display_pad_clear();
6384
curr_display_type = HELP;
6385
display_pad_out("Welcome to the IPMI UI version %s\n", OPENIPMI_VERSION);
6386
for (i=0; cmd_list[i].name != NULL; i++) {
6387
display_pad_out(" %s%s\n", cmd_list[i].name, cmd_list[i].help);
6389
display_pad_refresh();
6400
keymap = keypad_alloc();
6404
for (i=0x20; i<0x7f; i++) {
6405
err = keypad_bind_key(keymap, i, normal_char);
6410
err = keypad_bind_key(keymap, 0x7f, backspace);
6412
err = keypad_bind_key(keymap, 9, normal_char);
6414
err = keypad_bind_key(keymap, 8, backspace);
6416
err = keypad_bind_key(keymap, 4, key_leave);
6418
err = keypad_bind_key(keymap, 10, end_of_line);
6420
err = keypad_bind_key(keymap, 13, end_of_line);
6423
err = keypad_bind_key(keymap, KEY_BACKSPACE, backspace);
6425
err = keypad_bind_key(keymap, KEY_DC, backspace);
6427
err = keypad_bind_key(keymap, KEY_UP, key_up);
6429
err = keypad_bind_key(keymap, KEY_DOWN, key_down);
6431
err = keypad_bind_key(keymap, KEY_RIGHT, key_right);
6433
err = keypad_bind_key(keymap, KEY_LEFT, key_left);
6435
err = keypad_bind_key(keymap, KEY_NPAGE, key_npage);
6437
err = keypad_bind_key(keymap, KEY_PPAGE, key_ppage);
6439
err = keypad_bind_key(keymap, KEY_RESIZE, key_resize);
6441
err = keypad_bind_key(keymap, KEY_F(1), key_set_display);
6443
err = keypad_bind_key(keymap, KEY_F(2), key_set_log);
6446
err = keypad_bind_key(keymap, -1, key_leave);
6454
keypad_free(keymap);
6461
main_win = initscr();
6468
stat_win = newwin(STATUS_WIN_LINES, STATUS_WIN_COLS,
6469
STATUS_WIN_TOP, STATUS_WIN_LEFT);
6471
leave(1, "Could not allocate stat window\n");
6473
display_pad = newpad(NUM_DISPLAY_LINES, DISPLAY_WIN_COLS);
6475
leave(1, "Could not allocate display window\n");
6477
log_pad = newpad(NUM_LOG_LINES, LOG_WIN_COLS);
6479
leave(1, "Could not allocate log window\n");
6480
scrollok(log_pad, TRUE);
6481
wmove(log_pad, NUM_LOG_LINES-1, 0);
6482
log_pad_top_line = NUM_LOG_LINES-LOG_WIN_LINES;
6484
dummy_pad = newpad(NUM_LOG_LINES, LOG_WIN_COLS);
6486
leave(1, "Could not allocate dummy pad\n");
6487
wmove(dummy_pad, 0, 0);
6489
cmd_win = newwin(CMD_WIN_LINES, CMD_WIN_COLS, CMD_WIN_TOP, CMD_WIN_LEFT);
6491
leave(1, "Could not allocate command window\n");
6493
keypad(cmd_win, TRUE);
6494
meta(cmd_win, TRUE);
6495
nodelay(cmd_win, TRUE);
6496
scrollok(cmd_win, TRUE);
6500
display_pad_refresh();
6509
report_error(char *str, int err)
6511
if (IPMI_IS_OS_ERR(err)) {
6512
ui_log("%s: %s\n", str, strerror(IPMI_GET_OS_ERR(err)));
6514
ui_log("%s: IPMI Error %2.2x\n",
6515
str, IPMI_GET_IPMI_ERR(err));
6520
sensor_threshold_event_handler(ipmi_sensor_t *sensor,
6521
enum ipmi_event_dir_e dir,
6522
enum ipmi_thresh_e threshold,
6523
enum ipmi_event_value_dir_e high_low,
6524
enum ipmi_value_present_e value_present,
6525
unsigned int raw_value,
6528
ipmi_event_t *event)
6530
ipmi_entity_t *entity = ipmi_sensor_get_entity(sensor);
6531
char loc[MAX_ENTITY_LOC_SIZE];
6534
ipmi_sensor_get_id(sensor, name, 33);
6535
ui_log("Sensor %s.%s: %s %s %s\n",
6536
get_entity_loc(entity, loc, sizeof(loc)),
6538
ipmi_get_threshold_string(threshold),
6539
ipmi_get_value_dir_string(high_low),
6540
ipmi_get_event_dir_string(dir));
6541
if (value_present == IPMI_BOTH_VALUES_PRESENT) {
6542
ui_log(" value is %f (%2.2x)\n", value, raw_value);
6543
} else if (value_present == IPMI_RAW_VALUE_PRESENT) {
6544
ui_log(" raw value is 0x%x\n", raw_value);
6547
ui_log("Due to event 0x%4.4x\n", ipmi_event_get_record_id(event));
6548
return IPMI_EVENT_NOT_HANDLED;
6552
sensor_discrete_event_handler(ipmi_sensor_t *sensor,
6553
enum ipmi_event_dir_e dir,
6558
ipmi_event_t *event)
6560
ipmi_entity_t *entity = ipmi_sensor_get_entity(sensor);
6561
char loc[MAX_ENTITY_LOC_SIZE];
6564
ipmi_sensor_get_id(sensor, name, 33);
6565
ui_log("Sensor %s.%s: %d %s\n",
6566
get_entity_loc(entity, loc, sizeof(loc)),
6569
ipmi_get_event_dir_string(dir));
6571
ui_log(" severity is %d\n", severity);
6572
if (prev_severity != -1)
6573
ui_log(" prev severity is %d\n", prev_severity);
6575
ui_log("Due to event 0x%4.4x\n", ipmi_event_get_record_id(event));
6576
return IPMI_EVENT_NOT_HANDLED;
6580
sensor_change(enum ipmi_update_e op,
6582
ipmi_sensor_t *sensor,
6585
ipmi_entity_t *entity = ipmi_sensor_get_entity(sensor);
6586
char loc[MAX_ENTITY_LOC_SIZE];
6591
ipmi_sensor_get_id(sensor, name, 32);
6592
strcpy(name2, name);
6593
conv_from_spaces(name2);
6596
ui_log("Sensor added: %s.%s (%s)\n",
6597
get_entity_loc(entity, loc, sizeof(loc)),
6599
if (ipmi_sensor_get_event_reading_type(sensor)
6600
== IPMI_EVENT_READING_TYPE_THRESHOLD)
6601
rv = ipmi_sensor_add_threshold_event_handler(
6603
sensor_threshold_event_handler,
6606
rv = ipmi_sensor_add_discrete_event_handler(
6608
sensor_discrete_event_handler,
6611
ui_log("Unable to register sensor event handler: 0x%x\n", rv);
6614
ui_log("Sensor deleted: %s.%s (%s)\n",
6615
get_entity_loc(entity, loc, sizeof(loc)),
6619
ui_log("Sensor changed: %s.%s (%s)\n",
6620
get_entity_loc(entity, loc, sizeof(loc)),
6627
control_change(enum ipmi_update_e op,
6629
ipmi_control_t *control,
6632
ipmi_entity_t *entity = ipmi_control_get_entity(control);
6633
char loc[MAX_ENTITY_LOC_SIZE];
6637
ipmi_control_get_id(control, name, 32);
6638
strcpy(name2, name);
6639
conv_from_spaces(name2);
6642
ui_log("Control added: %s.%s (%s)\n",
6643
get_entity_loc(entity, loc, sizeof(loc)),
6647
ui_log("Control deleted: %s.%s (%s)\n",
6648
get_entity_loc(entity, loc, sizeof(loc)),
6652
ui_log("Control changed: %s.%s (%s)\n",
6653
get_entity_loc(entity, loc, sizeof(loc)),
6660
entity_presence_handler(ipmi_entity_t *entity,
6663
ipmi_event_t *event)
6665
char loc[MAX_ENTITY_LOC_SIZE];
6667
ui_log("Entity %s, presence is %d\n",
6668
get_entity_loc(entity, loc, sizeof(loc)),
6671
ui_log("Due to event 0x%4.4x\n", ipmi_event_get_record_id(event));
6672
return IPMI_EVENT_NOT_HANDLED;
6675
void fru_change(enum ipmi_update_e op,
6676
ipmi_entity_t *entity,
6679
char loc[MAX_ENTITY_LOC_SIZE];
6683
ui_log("FRU added for %s\n",
6684
get_entity_loc(entity, loc, sizeof(loc)));
6687
ui_log("FRU deleted for %s\n",
6688
get_entity_loc(entity, loc, sizeof(loc)));
6691
ui_log("FRU changed for %s\n",
6692
get_entity_loc(entity, loc, sizeof(loc)));
6698
entity_hot_swap_handler(ipmi_entity_t *ent,
6699
enum ipmi_hot_swap_states last_state,
6700
enum ipmi_hot_swap_states curr_state,
6702
ipmi_event_t *event)
6704
char loc[MAX_ENTITY_LOC_SIZE];
6706
ui_log("Entity hot swap state changed for %s, was %s, now %s\n",
6707
get_entity_loc(ent, loc, sizeof(loc)),
6708
ipmi_hot_swap_state_name(last_state),
6709
ipmi_hot_swap_state_name(curr_state));
6710
return IPMI_EVENT_NOT_HANDLED;
6714
entity_change(enum ipmi_update_e op,
6715
ipmi_domain_t *domain,
6716
ipmi_entity_t *entity,
6720
char loc[MAX_ENTITY_LOC_SIZE];
6724
ui_log("Entity added: %s\n",
6725
get_entity_loc(entity, loc, sizeof(loc)));
6726
rv = ipmi_entity_add_sensor_update_handler(entity,
6730
report_error("ipmi_entity_add_sensor_update_handler", rv);
6733
rv = ipmi_entity_add_control_update_handler(entity,
6737
report_error("ipmi_entity_add_control_update_handler", rv);
6740
rv = ipmi_entity_add_fru_update_handler(entity,
6744
report_error("ipmi_entity_add_control_fru_handler", rv);
6747
rv = ipmi_entity_add_presence_handler(entity,
6748
entity_presence_handler,
6751
report_error("ipmi_entity_add_presence_handler", rv);
6753
rv = ipmi_entity_add_hot_swap_handler(entity,
6754
entity_hot_swap_handler,
6757
report_error("ipmi_entity_add_hot_swap_handler", rv);
6761
ui_log("Entity deleted: %s\n",
6762
get_entity_loc(entity, loc, sizeof(loc)));
6765
ui_log("Entity changed: %s\n",
6766
get_entity_loc(entity, loc, sizeof(loc)));
6770
if (ipmi_entity_hot_swappable(entity))
6771
ui_log("Entity is hot swappable\n");
6773
ui_log("Entity is not hot swappable\n");
6777
mc_sels_read(ipmi_mc_t *mc, void *cb_data)
6779
int addr = ipmi_mc_get_address(mc);
6780
int channel = ipmi_mc_get_channel(mc);
6782
ui_log("MC (%d %x) SELs read\n", channel, addr);
6786
mc_sdrs_read(ipmi_mc_t *mc, void *cb_data)
6788
int addr = ipmi_mc_get_address(mc);
6789
int channel = ipmi_mc_get_channel(mc);
6791
ui_log("MC (%d %x) SDRs read\n", channel, addr);
6795
mc_active(ipmi_mc_t *mc, int active, void *cb_data)
6797
int addr = ipmi_mc_get_address(mc);
6798
int channel = ipmi_mc_get_channel(mc);
6800
ui_log("MC is %s: (%d %x)\n",
6801
active ? "active" : "inactive",
6803
ipmi_mc_set_sdrs_first_read_handler(mc, mc_sdrs_read, NULL);
6804
ipmi_mc_set_sels_first_read_handler(mc, mc_sels_read, NULL);
6808
mc_change(enum ipmi_update_e op,
6809
ipmi_domain_t *domain,
6813
int addr = ipmi_mc_get_address(mc);
6814
int channel = ipmi_mc_get_channel(mc);
6819
rv = ipmi_mc_add_active_handler(mc, mc_active, NULL);
6821
ui_log("Unable to add MC active handler: 0x%x\n", rv);
6822
if (ipmi_mc_is_active(mc)) {
6823
ipmi_mc_set_sdrs_first_read_handler(mc, mc_sdrs_read, NULL);
6824
ipmi_mc_set_sels_first_read_handler(mc, mc_sels_read, NULL);
6825
ui_log("MC added: (%d %x) - (active)\n", channel, addr);
6827
ui_log("MC added: (%d %x) - (inactive)\n", channel, addr);
6831
ui_log("MC deleted: (%d %x)\n", channel, addr);
6834
ui_log("MC changed: (%d %x)\n", channel, addr);
6840
event_handler(ipmi_domain_t *domain,
6841
ipmi_event_t *event,
6844
ipmi_mcid_t mcid = ipmi_event_get_mcid(event);
6845
unsigned int record_id = ipmi_event_get_record_id(event);
6846
unsigned int type = ipmi_event_get_type(event);
6847
ipmi_time_t timestamp = ipmi_event_get_timestamp(event);
6848
unsigned int data_len = ipmi_event_get_data_len(event);
6849
unsigned char *data = ipmi_event_get_data_ptr(event);
6855
for (i=0; i<data_len; i++)
6856
pos += snprintf(str+pos, 200-pos, " %2.2x", data[i]);
6858
ui_log("Unknown event from mc (%x %x)\n"
6859
"%4.4x:%2.2x %lld: %s\n",
6860
mcid.channel, mcid.mc_num, record_id, type, (int64_t) timestamp,
6865
redisplay_timeout(selector_t *sel,
6875
if (curr_display_type == DISPLAY_ENTITIES) {
6876
rv = ipmi_domain_pointer_cb(domain_id, entities_cmder, &rv);
6878
ui_log("redisplay_timeout:"
6879
" Unable to convert BMC id to a pointer\n");
6880
} else if (curr_display_type == DISPLAY_SENSOR) {
6881
rv = ipmi_sensor_pointer_cb(curr_sensor_id, redisplay_sensor, NULL);
6883
ui_log("redisplay_timeout: Unable to get sensor pointer: 0x%x\n",
6885
} else if (curr_display_type == DISPLAY_CONTROL) {
6886
rv = ipmi_control_pointer_cb(curr_control_id, redisplay_control, NULL);
6888
ui_log("redisplay_timeout: Unable to get sensor pointer: 0x%x\n",
6892
gettimeofday(&now, NULL);
6894
rv = sel_start_timer(timer, &now);
6896
ui_log("Unable to restart redisplay timer: 0x%x\n", rv);
6900
ipmi_ui_setup_done(ipmi_domain_t *domain,
6902
unsigned int conn_num,
6903
unsigned int port_num,
6904
int still_connected,
6910
ui_log("IPMI connection to con.port %d.%d is down"
6911
" due to error 0x%x\n",
6912
conn_num, port_num, err);
6914
ui_log("IPMI connection to con.port %d.%d is up\n",
6915
conn_num, port_num);
6917
if (!still_connected) {
6918
ui_log("All IPMI connections down\n");
6922
domain_id = ipmi_domain_convert_to_id(domain);
6924
rv = ipmi_domain_add_event_handler(domain, event_handler, NULL);
6926
leave_err(rv, "ipmi_register_for_events");
6928
rv = ipmi_domain_enable_events(domain);
6930
leave_err(rv, "ipmi_domain_enable_events");
6932
rv = ipmi_domain_add_entity_update_handler(domain, entity_change, domain);
6934
leave_err(rv, "ipmi_bmc_set_entity_update_handler");
6936
rv = ipmi_domain_add_mc_updated_handler(domain, mc_change, domain);
6938
leave_err(rv, "ipmi_bmc_set_entity_update_handler");
6944
ipmi_ui_domain_ready(ipmi_domain_t *domain,
6946
unsigned int conn_num,
6947
unsigned int port_num,
6948
int still_connected,
6954
ipmi_ui_init(selector_t **selector, int do_full_screen)
6958
full_screen = do_full_screen;
6960
rv = sel_alloc_selector(&ipmi_ui_cb_handlers, &ui_sel);
6962
fprintf(stderr, "Could not allocate selector\n");
6966
sel_set_fd_handlers(ui_sel, 0, NULL, user_input_ready, NULL, NULL, NULL);
6967
sel_set_fd_read_handler(ui_sel, 0, SEL_FD_HANDLER_ENABLED);
6969
ipmi_init(&ipmi_ui_cb_handlers);
6971
/* This is a dummy allocation just to make sure that the malloc
6972
debugger is working. */
6975
sensor_states = ipmi_mem_alloc(ipmi_states_size());
6976
if (!sensor_states) {
6977
fprintf(stderr, "Could not allocate sensor states\n");
6981
sensor_event_states = ipmi_mem_alloc(ipmi_event_state_size());
6982
if (!sensor_event_states) {
6983
fprintf(stderr, "Could not allocate sensor event states\n");
6987
sensor_thresholds = ipmi_mem_alloc(ipmi_thresholds_size());
6988
if (!sensor_thresholds) {
6989
fprintf(stderr, "Could not allocate sensor thresholds\n");
6993
rv = init_commands();
6995
fprintf(stderr, "Could not initialize commands\n");
7001
fprintf(stderr, "Could not initialize keymap\n");
7008
fprintf(stderr, "Could not initialize curses\n");
7012
struct termios new_termios;
7014
tcgetattr(0, &old_termios);
7015
new_termios = old_termios;
7016
new_termios.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
7017
|INLCR|IGNCR|ICRNL|IXON);
7018
new_termios.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
7019
tcsetattr(0, TCSADRAIN, &new_termios);
7020
old_flags = fcntl(0, F_GETFL) & O_ACCMODE;
7021
// fcntl(0, F_SETFL, old_flags | O_NONBLOCK);
7024
help_cmd(NULL, NULL, NULL);
7026
ui_log("Starting setup, wait until complete before entering commands.\n");
7030
rv = sel_alloc_timer(ui_sel, redisplay_timeout, NULL,
7033
leave_err(rv, "sel_alloc_timer");
7034
gettimeofday(&now, NULL);
7036
rv = sel_start_timer(redisplay_timer, &now);
7038
leave_err(rv, "Unable to restart redisplay timer");
7047
ipmi_ui_shutdown(void)
7049
ipmi_mem_free(sensor_states);
7050
sensor_states = NULL;
7051
ipmi_mem_free(sensor_event_states);
7052
sensor_event_states = NULL;
7053
ipmi_mem_free(sensor_thresholds);
7054
sensor_thresholds = NULL;