8
typedef int (*ipmi_emu_cmd_handler)(emu_data_t *emu,
13
get_uchar(char **toks, unsigned char *val, char *errstr, int empty_ok)
17
str = strtok_r(NULL, " \t\n", toks);
22
printf("**No %s given\n", errstr);
29
*val = strtoul(str, &tmpstr, 16);
30
if (*tmpstr != '\0') {
32
printf("**Invalid %s given\n", errstr);
40
get_bitmask(char **toks, unsigned char *val, char *errstr, int size,
46
str = strtok_r(NULL, " \t\n", toks);
51
printf("**No %s given\n", errstr);
54
if (strlen(str) != size) {
56
printf("**invalid number of bits in %s\n", errstr);
59
for (i=size-1, j=0; i>=0; i--, j++) {
62
} else if (str[j] == '1') {
66
printf("**Invalid bit value '%c' in %s\n", str[j], errstr);
75
get_uint(char **toks, unsigned int *val, char *errstr)
79
str = strtok_r(NULL, " \t\n", toks);
82
printf("**No %s given\n", errstr);
85
*val = strtoul(str, &tmpstr, 16);
86
if (*tmpstr != '\0') {
88
printf("**Invalid %s given\n", errstr);
95
#define INPUT_BUFFER_SIZE 65536
97
read_command_file(emu_data_t *emu, char *command_file)
99
FILE *f = fopen(command_file, "r");
103
fprintf(stderr, "Unable to open command file '%s'\n",
109
buffer = malloc(INPUT_BUFFER_SIZE);
111
fprintf(stderr, "Could not allocate buffer memory\n");
114
while (fgets(buffer+pos, INPUT_BUFFER_SIZE-pos, f)) {
115
printf("%s", buffer+pos);
116
if (buffer[pos] == '#')
118
pos = strlen(buffer);
122
while ((pos > 0) && (buffer[pos] == '\n'))
126
if ((pos > 0) && (buffer[pos] == '\\')) {
127
/* Continue the line. */
132
rv = ipmi_emu_cmd(emu, buffer);
147
sel_enable(emu_data_t *emu, lmc_data_t *mc, char **toks)
150
unsigned int max_records;
153
rv = get_uint(toks, &max_records, "max records");
157
rv = get_uchar(toks, &flags, "flags", 0);
161
rv = ipmi_mc_enable_sel(mc, max_records, flags);
163
printf("**Unable to enable sel, error 0x%x\n", rv);
168
sel_add(emu_data_t *emu, lmc_data_t *mc, char **toks)
172
unsigned char record_type;
173
unsigned char data[13];
176
rv = get_uchar(toks, &record_type, "record type", 0);
180
for (i=0; i<13; i++) {
181
rv = get_uchar(toks, &data[i], "data byte", 0);
186
rv = ipmi_mc_add_to_sel(mc, record_type, data, &r);
188
printf("**Unable to add to sel, error 0x%x\n", rv);
190
printf("Added record %d\n", r);
195
main_sdr_add(emu_data_t *emu, lmc_data_t *mc, char **toks)
199
unsigned char data[256];
201
for (i=0; i<256; i++) {
202
rv = get_uchar(toks, &data[i], "data byte", 1);
206
printf("**Error 0x%x in data byte %d\n", rv, i);
211
rv = ipmi_mc_add_main_sdr(mc, data, i);
213
printf("**Unable to add to sdr, error 0x%x\n", rv);
218
device_sdr_add(emu_data_t *emu, lmc_data_t *mc, char **toks)
222
unsigned char data[256];
225
rv = get_uchar(toks, &lun, "LUN", 0);
229
for (i=0; i<256; i++) {
230
rv = get_uchar(toks, &data[i], "data byte", 1);
234
printf("**Error 0x%x in data byte %d\n", rv, i);
239
rv = ipmi_mc_add_device_sdr(mc, lun, data, i);
241
printf("**Unable to add to sdr, error 0x%x\n", rv);
246
sensor_add(emu_data_t *emu, lmc_data_t *mc, char **toks)
254
rv = get_uchar(toks, &lun, "LUN", 0);
258
rv = get_uchar(toks, &num, "sensor num", 0);
262
rv = get_uchar(toks, &type, "sensor type", 0);
266
rv = get_uchar(toks, &code, "event reading code", 0);
270
rv = ipmi_mc_add_sensor(mc, lun, num, type, code);
272
printf("**Unable to add to sensor, error 0x%x\n", rv);
277
sensor_set_bit(emu_data_t *emu, lmc_data_t *mc, char **toks)
284
unsigned char gen_event;
286
rv = get_uchar(toks, &lun, "LUN", 0);
290
rv = get_uchar(toks, &num, "sensor num", 0);
294
rv = get_uchar(toks, &bit, "bit to set", 0);
298
rv = get_uchar(toks, &value, "bit value", 0);
302
rv = get_uchar(toks, &gen_event, "generate event", 0);
306
rv = ipmi_mc_sensor_set_bit(mc, lun, num, bit, value, gen_event);
308
printf("**Unable to set sensor bit, error 0x%x\n", rv);
313
sensor_set_bit_clr_rest(emu_data_t *emu, lmc_data_t *mc, char **toks)
319
unsigned char gen_event;
321
rv = get_uchar(toks, &lun, "LUN", 0);
325
rv = get_uchar(toks, &num, "sensor num", 0);
329
rv = get_uchar(toks, &bit, "bit to set", 0);
333
rv = get_uchar(toks, &gen_event, "generate event", 0);
337
rv = ipmi_mc_sensor_set_bit_clr_rest(mc, lun, num, bit, gen_event);
339
printf("**Unable to set sensor bit, error 0x%x\n", rv);
344
sensor_set_value(emu_data_t *emu, lmc_data_t *mc, char **toks)
350
unsigned char gen_event;
352
rv = get_uchar(toks, &lun, "LUN", 0);
356
rv = get_uchar(toks, &num, "sensor num", 0);
360
rv = get_uchar(toks, &value, "value", 0);
364
rv = get_uchar(toks, &gen_event, "generate event", 0);
368
rv = ipmi_mc_sensor_set_value(mc, lun, num, value, gen_event);
370
printf("**Unable to set sensor value, error 0x%x\n", rv);
375
sensor_set_hysteresis(emu_data_t *emu, lmc_data_t *mc, char **toks)
380
unsigned char support;
381
unsigned char positive, negative;
383
rv = get_uchar(toks, &lun, "LUN", 0);
387
rv = get_uchar(toks, &num, "sensor num", 0);
391
rv = get_uchar(toks, &support, "hysteresis support", 0);
395
rv = get_uchar(toks, &positive, "positive hysteresis", 0);
399
rv = get_uchar(toks, &negative, "negative hysteresis", 0);
403
rv = ipmi_mc_sensor_set_hysteresis(mc, lun, num, support, positive,
406
printf("**Unable to set sensor hysteresis, error 0x%x\n", rv);
411
sensor_set_threshold(emu_data_t *emu, lmc_data_t *mc, char **toks)
416
unsigned char support;
417
unsigned char enabled[6];
418
unsigned char thresholds[6];
421
rv = get_uchar(toks, &lun, "LUN", 0);
425
rv = get_uchar(toks, &num, "sensor num", 0);
429
rv = get_uchar(toks, &support, "threshold support", 0);
433
rv = get_bitmask(toks, enabled, "threshold enabled", 6, 0);
437
for (i=5; i>=0; i--) {
438
rv = get_uchar(toks, &thresholds[i], "threshold value", 0);
443
rv = ipmi_mc_sensor_set_threshold(mc, lun, num, support,
444
enabled, thresholds);
446
printf("**Unable to set sensor thresholds, error 0x%x\n", rv);
451
sensor_set_event_support(emu_data_t *emu, lmc_data_t *mc, char **toks)
456
unsigned char support;
457
unsigned char events_enable;
458
unsigned char scanning;
459
unsigned char assert_support[15];
460
unsigned char deassert_support[15];
461
unsigned char assert_enabled[15];
462
unsigned char deassert_enabled[15];
464
rv = get_uchar(toks, &lun, "LUN", 0);
468
rv = get_uchar(toks, &num, "sensor num", 0);
472
rv = get_uchar(toks, &events_enable, "events enable", 0);
476
rv = get_uchar(toks, &scanning, "scanning", 0);
480
rv = get_uchar(toks, &support, "event support", 0);
484
rv = get_bitmask(toks, assert_support, "assert support", 15, 0);
488
rv = get_bitmask(toks, deassert_support, "deassert support", 15, 0);
492
rv = get_bitmask(toks, assert_enabled, "assert enabled", 15, 0);
496
rv = get_bitmask(toks, deassert_enabled, "deassert enabled", 15, 0);
500
rv = ipmi_mc_sensor_set_event_support(mc, lun, num,
501
events_enable, scanning,
503
assert_support, deassert_support,
504
assert_enabled, deassert_enabled);
506
printf("**Unable to set sensor thresholds, error 0x%x\n", rv);
511
mc_add(emu_data_t *emu, lmc_data_t *mc, char **toks)
514
unsigned char device_id;
515
unsigned char has_device_sdrs;
516
unsigned char device_revision;
517
unsigned char major_fw_rev;
518
unsigned char minor_fw_rev;
519
unsigned char device_support;
520
unsigned char mfg_id[3];
521
unsigned int mfg_id_i;
522
unsigned char product_id[2];
523
unsigned int product_id_i;
524
unsigned char dyn_sens = 0;
527
rv = get_uchar(toks, &ipmb, "IPMB address", 0);
530
rv = get_uchar(toks, &device_id, "Device ID", 0);
533
rv = get_uchar(toks, &has_device_sdrs, "Has Device SDRs", 0);
536
rv = get_uchar(toks, &device_revision, "Device Revision", 0);
539
rv = get_uchar(toks, &major_fw_rev, "Major FW Rev", 0);
542
rv = get_uchar(toks, &minor_fw_rev, "Minor FW Rev", 0);
545
rv = get_uchar(toks, &device_support, "Device Support", 0);
548
rv = get_uint(toks, &mfg_id_i, "Manufacturer ID");
551
rv = get_uint(toks, &product_id_i, "Product ID");
554
rv = get_uchar(toks, &dyn_sens, "Dynamic Sensor Population", 1);
558
mfg_id[0] = mfg_id_i & 0xff;
559
mfg_id[1] = (mfg_id_i >> 8) & 0xff;
560
mfg_id[2] = (mfg_id_i >> 16) & 0xff;
561
product_id[0] = product_id_i & 0xff;
562
product_id[1] = (product_id_i >> 8) & 0xff;
563
rv = ipmi_emu_add_mc(emu, ipmb, device_id, has_device_sdrs,
564
device_revision, major_fw_rev, minor_fw_rev,
565
device_support, mfg_id, product_id, dyn_sens);
567
printf("**Unable to add the MC, error 0x%x\n", rv);
572
mc_setchan(emu_data_t *emu, lmc_data_t *mc, char **toks)
574
unsigned char channel;
575
unsigned char medium_type;
576
unsigned char protocol_type;
577
unsigned char session_support;
580
rv = get_uchar(toks, &channel, "Channel Number", 0);
583
rv = get_uchar(toks, &medium_type, "Medium Type", 0);
586
rv = get_uchar(toks, &protocol_type, "Protocol Type", 0);
589
rv = get_uchar(toks, &session_support, "Session Support", 0);
592
rv = ipmi_emu_set_mc_channel(mc, channel, medium_type, protocol_type,
595
printf("**Unable to set up channel, error 0x%x\n", rv);
600
mc_delete(emu_data_t *emu, lmc_data_t *mc, char **toks)
607
mc_disable(emu_data_t *emu, lmc_data_t *mc, char **toks)
614
mc_enable(emu_data_t *emu, lmc_data_t *mc, char **toks)
621
mc_set_power(emu_data_t *emu, lmc_data_t *mc, char **toks)
624
unsigned char gen_int;
627
rv = get_uchar(toks, &power, "Power", 0);
631
rv = get_uchar(toks, &gen_int, "Gen int", 0);
635
rv = ipmi_mc_set_power(mc, power, gen_int);
637
printf("**Unable to set power, error 0x%x\n", rv);
641
#define MAX_FRU_SIZE 8192
643
mc_add_fru_data(emu_data_t *emu, lmc_data_t *mc, char **toks)
645
unsigned char data[MAX_FRU_SIZE];
651
rv = get_uchar(toks, &devid, "Device ID", 0);
655
rv = get_uint(toks, &length, "FRU physical size");
659
for (i=0; i<MAX_FRU_SIZE; i++) {
660
rv = get_uchar(toks, &data[i], "data byte", 1);
664
printf("**Error 0x%x in data byte %d\n", rv, i);
669
rv = ipmi_mc_add_fru_data(mc, devid, length, data, i);
671
printf("**Unable to add FRU data, error 0x%x\n", rv);
676
mc_dump_fru_data(emu_data_t *emu, lmc_data_t *mc, char **toks)
684
rv = get_uchar(toks, &devid, "Device ID", 0);
688
rv = ipmi_mc_get_fru_data(mc, devid, &length, &data);
690
printf("**Unable to dump FRU data, error 0x%x\n", rv);
694
for (i=0; i<length; i++) {
695
if ((i > 0) && ((i % 8) == 0))
697
printf(" 0x%2.2x", data[i]);
706
mc_setbmc(emu_data_t *emu, lmc_data_t *mc, char **toks)
711
rv = get_uchar(toks, &ipmb, "IPMB address of BMC", 0);
714
rv = ipmi_emu_set_bmc_mc(emu, ipmb);
716
printf("**Invalid IPMB address\n");
721
atca_enable(emu_data_t *emu, lmc_data_t *mc, char **toks)
725
rv = ipmi_emu_atca_enable(emu);
727
printf("**Unable to enable ATCA mode, error 0x%x\n", rv);
732
atca_set_site(emu_data_t *emu, lmc_data_t *mc, char **toks)
735
unsigned char hw_address;
736
unsigned char site_type;
737
unsigned char site_number;
739
rv = get_uchar(toks, &hw_address, "hardware address", 0);
742
rv = get_uchar(toks, &site_type, "site type", 0);
745
rv = get_uchar(toks, &site_number, "site number", 0);
749
rv = ipmi_emu_atca_set_site(emu, hw_address, site_type, site_number);
751
printf("**Unable to set site type, error 0x%x\n", rv);
756
mc_set_num_leds(emu_data_t *emu, lmc_data_t *mc, char **toks)
761
rv = get_uchar(toks, &count, "number of LEDs", 0);
765
rv = ipmi_mc_set_num_leds(mc, count);
767
printf("**Unable to set number of LEDs, error 0x%x\n", rv);
772
read_cmds(emu_data_t *emu, lmc_data_t *mc, char **toks)
774
char *filename = strtok_r(NULL, " \t\n", toks);
777
printf("**No filename specified\n");
781
return read_command_file(emu, filename);
785
sleep_cmd(emu_data_t *emu, lmc_data_t *mc, char **toks)
791
rv = get_uint(toks, &time, "timeout");
795
tv.tv_sec = time / 1000;
796
tv.tv_usec = (time % 1000) * 1000;
797
ipmi_emu_sleep(emu, &tv);
802
quit(emu_data_t *emu, lmc_data_t *mc, char **toks)
813
ipmi_emu_cmd_handler handler;
816
{ "quit", NOMC, quit },
817
{ "sel_enable", MC, sel_enable },
818
{ "sel_add", MC, sel_add },
819
{ "main_sdr_add", MC, main_sdr_add },
820
{ "device_sdr_add", MC, device_sdr_add },
821
{ "sensor_add", MC, sensor_add },
822
{ "sensor_set_bit", MC, sensor_set_bit },
823
{ "sensor_set_bit_clr_rest", MC, sensor_set_bit_clr_rest },
824
{ "sensor_set_value", MC, sensor_set_value },
825
{ "sensor_set_hysteresis", MC, sensor_set_hysteresis },
826
{ "sensor_set_threshold", MC, sensor_set_threshold },
827
{ "sensor_set_event_support", MC, sensor_set_event_support },
828
{ "mc_set_power", MC, mc_set_power },
829
{ "mc_add_fru_data",MC, mc_add_fru_data },
830
{ "mc_dump_fru_data",MC, mc_dump_fru_data },
831
{ "mc_set_num_leds",MC, mc_set_num_leds },
832
{ "mc_add", NOMC, mc_add },
833
{ "mc_delete", MC, mc_delete },
834
{ "mc_disable", MC, mc_disable },
835
{ "mc_enable", MC, mc_enable },
836
{ "mc_setbmc", NOMC, mc_setbmc },
837
{ "mc_setchan", MC, mc_setchan },
838
{ "atca_enable", NOMC, atca_enable },
839
{ "atca_set_site", NOMC, atca_set_site },
840
{ "read_cmds", NOMC, read_cmds },
841
{ "sleep", NOMC, sleep_cmd },
846
ipmi_emu_cmd(emu_data_t *emu, char *cmd_str)
852
lmc_data_t *mc = NULL;
854
cmd = strtok_r(cmd_str, " \t\n", &toks);
860
for (i=0; cmds[i].name; i++) {
861
if (strcmp(cmd, cmds[i].name) == 0) {
862
if (cmds[i].flags & MC) {
864
rv = get_uchar(&toks, &ipmb, "MC address", 0);
867
rv = ipmi_emu_get_mc_by_addr(emu, ipmb, &mc);
869
printf("**Invalid MC address\n");
873
rv = cmds[i].handler(emu, mc, &toks);
880
printf("**Unknown command: %s\n", cmd);