00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <errno.h>
00035 #include <string.h>
00036 #include <ctype.h>
00037 #include <stdlib.h>
00038 #include <stdio.h>
00039 #include <OpenIPMI/ipmiif.h>
00040 #include <OpenIPMI/ipmi_mc.h>
00041 #include <OpenIPMI/ipmi_err.h>
00042 #include <OpenIPMI/ipmi_cmdlang.h>
00043 #include <OpenIPMI/ipmi_fru.h>
00044 #include <OpenIPMI/ipmi_conn.h>
00045
00046
00047 #include <OpenIPMI/internal/ipmi_malloc.h>
00048
00049
00050 void ipmi_cmdlang_dump_fru_info(ipmi_cmd_info_t *cmd_info, ipmi_fru_t *fru);
00051
00052 static void
00053 domain_list_handler(ipmi_domain_t *domain, void *cb_data)
00054 {
00055 ipmi_cmd_info_t *cmd_info = cb_data;
00056 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00057 char domain_name[IPMI_DOMAIN_NAME_LEN];
00058
00059 if (cmdlang->err)
00060 return;
00061
00062 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00063
00064 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00065 }
00066
00067 static void
00068 domain_list(ipmi_cmd_info_t *cmd_info)
00069 {
00070 ipmi_cmdlang_out(cmd_info, "Domains", NULL);
00071 ipmi_cmdlang_down(cmd_info);
00072 ipmi_domain_iterate_domains(domain_list_handler, cmd_info);
00073 ipmi_cmdlang_up(cmd_info);
00074 }
00075
00076 static void
00077 domain_info(ipmi_domain_t *domain, void *cb_data)
00078 {
00079 ipmi_cmd_info_t *cmd_info = cb_data;
00080 char domain_name[IPMI_DOMAIN_NAME_LEN];
00081 unsigned char guid[16];
00082
00083 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00084
00085 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00086 ipmi_cmdlang_down(cmd_info);
00087 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00088 if (ipmi_domain_get_guid(domain, guid) == 0)
00089 ipmi_cmdlang_out_binary(cmd_info, "GUID", (char *) guid, 16);
00090 ipmi_cmdlang_out(cmd_info, "Type",
00091 ipmi_domain_get_type_string(ipmi_domain_get_type(domain)));
00092 ipmi_cmdlang_out_int(cmd_info, "SEL Rescan Time",
00093 ipmi_domain_get_sel_rescan_time(domain));
00094 ipmi_cmdlang_out_int(cmd_info, "IPMB Rescan Time",
00095 ipmi_domain_get_ipmb_rescan_time(domain));
00096 ipmi_cmdlang_up(cmd_info);
00097 }
00098
00099 static void domain_con_change(ipmi_domain_t *domain,
00100 int err,
00101 unsigned int conn_num,
00102 unsigned int port_num,
00103 int still_connected,
00104 void *cb_data);
00105 void ipmi_cmdlang_entity_change(enum ipmi_update_e op,
00106 ipmi_domain_t *domain,
00107 ipmi_entity_t *entity,
00108 void *cb_data);
00109 void ipmi_cmdlang_mc_change(enum ipmi_update_e op,
00110 ipmi_domain_t *domain,
00111 ipmi_mc_t *mc,
00112 void *cb_data);
00113
00114 static void
00115 domain_new_done(ipmi_domain_t *domain,
00116 int err,
00117 unsigned int conn_num,
00118 unsigned int port_num,
00119 int still_connected,
00120 void *cb_data)
00121 {
00122 ipmi_cmd_info_t *cmd_info = cb_data;
00123 int rv;
00124
00125
00126
00127
00128 ipmi_domain_add_connect_change_handler(domain, domain_con_change, NULL);
00129
00130
00131
00132 rv = ipmi_domain_remove_connect_change_handler(domain, domain_new_done,
00133 cb_data);
00134
00135
00136
00137 domain_con_change(domain, err, conn_num, port_num, still_connected,
00138 NULL);
00139
00140
00141
00142 if ((!rv) && cmd_info) {
00143 char domain_name[IPMI_DOMAIN_NAME_LEN];
00144
00145 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00146 ipmi_cmdlang_lock(cmd_info);
00147 ipmi_cmdlang_out(cmd_info, "Domain Created", domain_name);
00148 ipmi_cmdlang_unlock(cmd_info);
00149 ipmi_cmdlang_cmd_info_put(cmd_info);
00150 }
00151 }
00152
00153 void
00154 domain_fully_up(ipmi_domain_t *domain, void *cb_data)
00155 {
00156 ipmi_cmd_info_t *cmd_info = cb_data;
00157 char *errstr = NULL;
00158 int rv = 0;
00159 ipmi_cmd_info_t *evi;
00160 char domain_name[IPMI_DOMAIN_NAME_LEN];
00161
00162 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00163
00164 evi = ipmi_cmdlang_alloc_event_info();
00165 if (!evi) {
00166 rv = ENOMEM;
00167 errstr = "Out of memory";
00168 goto out_err;
00169 }
00170
00171 ipmi_cmdlang_out(evi, "Object Type", "Domain");
00172 ipmi_cmdlang_out(evi, "Domain", domain_name);
00173 ipmi_cmdlang_out(evi, "Operation", "Domain fully up");
00174
00175 out_err:
00176 if (rv) {
00177 ipmi_cmdlang_global_err(domain_name,
00178 "cmd_domain.c(domain_fully_up)",
00179 errstr, rv);
00180 }
00181 if (evi)
00182 ipmi_cmdlang_cmd_info_put(evi);
00183
00184 if (cmd_info) {
00185 ipmi_cmdlang_lock(cmd_info);
00186 ipmi_cmdlang_out(cmd_info, "Domain Created", domain_name);
00187 ipmi_cmdlang_unlock(cmd_info);
00188 ipmi_cmdlang_cmd_info_put(cmd_info);
00189 }
00190 }
00191
00192 static void
00193 domain_new(ipmi_cmd_info_t *cmd_info)
00194 {
00195 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00196 ipmi_args_t *con_parms[2];
00197 int set = 0;
00198 int i, j;
00199 ipmi_con_t *con[2];
00200 int rv;
00201 char *name;
00202 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00203 int argc = ipmi_cmdlang_get_argc(cmd_info);
00204 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00205 int num_options = 0;
00206 ipmi_open_option_t options[10];
00207 int wait_til_up = 0;
00208 void *up_info = NULL;
00209 void *con_info = NULL;
00210
00211 if (curr_arg >= argc) {
00212 cmdlang->errstr = "No domain name entered";
00213 cmdlang->err = EINVAL;
00214 goto out;
00215 }
00216 name = argv[curr_arg];
00217 curr_arg++;
00218
00219 while ((curr_arg < argc) && argv[curr_arg][0] == '-') {
00220 if (num_options >= 10) {
00221 cmdlang->errstr = "Too many options";
00222 cmdlang->err = EINVAL;
00223 goto out;
00224 }
00225
00226 if (! ipmi_parse_options(options+num_options, argv[curr_arg]))
00227 num_options++;
00228 else if (strcmp(argv[curr_arg], "-wait_til_up") == 0)
00229 wait_til_up = 1;
00230 else
00231 break;
00232 curr_arg++;
00233 }
00234
00235 rv = ipmi_parse_args(&curr_arg, argc, argv, &con_parms[set]);
00236 if (rv) {
00237 cmdlang->errstr = "First connection parms are invalid";
00238 cmdlang->err = rv;
00239 goto out;
00240 }
00241 set++;
00242
00243 if (curr_arg < argc) {
00244 rv = ipmi_parse_args(&curr_arg, argc, argv, &con_parms[set]);
00245 if (rv) {
00246 ipmi_free_args(con_parms[0]);
00247 cmdlang->errstr = "Second connection parms are invalid";
00248 cmdlang->err = rv;
00249 goto out;
00250 }
00251 set++;
00252 }
00253
00254 for (i=0; i<set; i++) {
00255 rv = ipmi_args_setup_con(con_parms[i],
00256 cmdlang->os_hnd,
00257 NULL,
00258 &con[i]);
00259 if (rv) {
00260 cmdlang->errstr = "Unable to setup connection";
00261 cmdlang->err = rv;
00262 for (j=0; j<set; j++)
00263 ipmi_free_args(con_parms[j]);
00264 goto out;
00265 }
00266 }
00267
00268 if (wait_til_up)
00269 up_info = cmd_info;
00270 else
00271 con_info = cmd_info;
00272
00273 ipmi_cmdlang_cmd_info_get(cmd_info);
00274 rv = ipmi_open_domain(name, con, set, domain_new_done, con_info,
00275 domain_fully_up, up_info,
00276 options, num_options, NULL);
00277 if (rv) {
00278 ipmi_cmdlang_cmd_info_put(cmd_info);
00279 cmdlang->errstr = strerror(rv);
00280 cmdlang->err = rv;
00281 for (i=0; i<set; i++) {
00282 ipmi_free_args(con_parms[i]);
00283 con[i]->close_connection(con[i]);
00284 }
00285 goto out;
00286 }
00287
00288 for (i=0; i<set; i++)
00289 ipmi_free_args(con_parms[i]);
00290
00291 out:
00292 if (cmdlang->err)
00293 cmdlang->location = "cmd_domain.c(domain_new)";
00294
00295 return;
00296 }
00297
00298
00299 static void
00300 domain_open(ipmi_cmd_info_t *cmd_info)
00301 {
00302 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00303 ipmi_args_t *con_parms[2];
00304 int set = 0;
00305 int i, j;
00306 ipmi_con_t *con[2];
00307 int rv;
00308 char *name;
00309 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00310 int argc = ipmi_cmdlang_get_argc(cmd_info);
00311 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00312 int num_options = 0;
00313 ipmi_open_option_t options[10];
00314 int wait_til_up = 0;
00315 void *up_info = NULL;
00316 void *con_info = NULL;
00317
00318 if (curr_arg >= argc) {
00319 cmdlang->errstr = "No domain name entered";
00320 cmdlang->err = EINVAL;
00321 goto out;
00322 }
00323 name = argv[curr_arg];
00324 curr_arg++;
00325
00326 while ((curr_arg < argc) && argv[curr_arg][0] == '-') {
00327 if (num_options >= 10) {
00328 cmdlang->errstr = "Too many options";
00329 cmdlang->err = EINVAL;
00330 goto out;
00331 }
00332
00333 if (! ipmi_parse_options(options+num_options, argv[curr_arg]))
00334 num_options++;
00335 else if (strcmp(argv[curr_arg], "-wait_til_up") == 0)
00336 wait_til_up = 1;
00337 else
00338 break;
00339 curr_arg++;
00340 }
00341
00342 rv = ipmi_parse_args2(&curr_arg, argc, argv, &con_parms[set]);
00343 if (rv) {
00344 cmdlang->errstr = "First connection parms are invalid";
00345 cmdlang->err = rv;
00346 goto out;
00347 }
00348 set++;
00349
00350 if (curr_arg < argc) {
00351 rv = ipmi_parse_args2(&curr_arg, argc, argv, &con_parms[set]);
00352 if (rv) {
00353 ipmi_free_args(con_parms[0]);
00354 cmdlang->errstr = "Second connection parms are invalid";
00355 cmdlang->err = rv;
00356 goto out;
00357 }
00358 set++;
00359 }
00360
00361 for (i=0; i<set; i++) {
00362 rv = ipmi_args_setup_con(con_parms[i],
00363 cmdlang->os_hnd,
00364 NULL,
00365 &con[i]);
00366 if (rv) {
00367 cmdlang->errstr = "Unable to setup connection";
00368 cmdlang->err = rv;
00369 for (j=0; j<i; j++)
00370 con[j]->close_connection(con[j]);
00371 for (j=0; j<set; j++)
00372 ipmi_free_args(con_parms[j]);
00373 goto out;
00374 }
00375 }
00376
00377 if (wait_til_up)
00378 up_info = cmd_info;
00379 else
00380 con_info = cmd_info;
00381
00382 ipmi_cmdlang_cmd_info_get(cmd_info);
00383 rv = ipmi_open_domain(name, con, set, domain_new_done, con_info,
00384 domain_fully_up, up_info,
00385 options, num_options, NULL);
00386 if (rv) {
00387 ipmi_cmdlang_cmd_info_put(cmd_info);
00388 cmdlang->errstr = strerror(rv);
00389 cmdlang->err = rv;
00390 for (i=0; i<set; i++) {
00391 ipmi_free_args(con_parms[i]);
00392 con[i]->close_connection(con[i]);
00393 }
00394 goto out;
00395 }
00396
00397 for (i=0; i<set; i++)
00398 ipmi_free_args(con_parms[i]);
00399
00400 out:
00401 if (cmdlang->err)
00402 cmdlang->location = "cmd_domain.c(domain_open)";
00403
00404 return;
00405 }
00406
00407 void con_usage(const char *name, const char *help, void *cb_data)
00408 {
00409 ipmi_cmdlang_t *cmdlang = cb_data;
00410
00411 cmdlang->out(cmdlang, name, help);
00412 }
00413
00414 static void
00415 domain_open_help(ipmi_cmdlang_t *cmdlang)
00416 {
00417 ipmi_parse_args_iter_help(con_usage, cmdlang);
00418 cmdlang->out(cmdlang, "Options are:\n", ipmi_parse_options_help());
00419 }
00420
00421 static void
00422 domain_fru_fetched(ipmi_domain_t *domain, ipmi_fru_t *fru,
00423 int err, void *cb_data)
00424 {
00425 ipmi_cmd_info_t *cmd_info = cb_data;
00426 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00427 char domain_name[IPMI_DOMAIN_NAME_LEN];
00428
00429 ipmi_cmdlang_lock(cmd_info);
00430
00431 if (err && (ipmi_fru_get_data_length(fru) == 0)) {
00432 cmdlang->errstr = "Error fetching FRU info";
00433 cmdlang->err = err;
00434 ipmi_domain_get_name(domain, cmdlang->objstr,
00435 cmdlang->objstr_len);
00436 cmdlang->location = "cmd_domain.c(domain_fru_fetched)";
00437 goto out;
00438 }
00439
00440 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00441 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00442 ipmi_cmdlang_down(cmd_info);
00443 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00444 if (err)
00445 ipmi_cmdlang_out_int(cmd_info, "Warning fetching FRU", err);
00446 ipmi_cmdlang_dump_fru_info(cmd_info, fru);
00447 ipmi_cmdlang_up(cmd_info);
00448
00449 out:
00450 ipmi_cmdlang_unlock(cmd_info);
00451 ipmi_cmdlang_cmd_info_put(cmd_info);
00452 }
00453
00454 static void
00455 domain_fru(ipmi_domain_t *domain, void *cb_data)
00456 {
00457 ipmi_cmd_info_t *cmd_info = cb_data;
00458 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00459 int is_logical;
00460 int device_addr;
00461 int device_id;
00462 int lun;
00463 int private_bus;
00464 int channel;
00465 int rv;
00466 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00467 int argc = ipmi_cmdlang_get_argc(cmd_info);
00468 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00469
00470 if ((argc - curr_arg) < 6) {
00471
00472 cmdlang->errstr = "Not enough parameters";
00473 cmdlang->err = EINVAL;
00474 goto out_err;
00475 }
00476
00477 ipmi_cmdlang_get_bool(argv[curr_arg], &is_logical, cmd_info);
00478 if (cmdlang->err) {
00479 cmdlang->errstr = "is_logical invalid";
00480 goto out_err;
00481 }
00482 curr_arg++;
00483
00484 ipmi_cmdlang_get_int(argv[curr_arg], &device_addr, cmd_info);
00485 if (cmdlang->err) {
00486 cmdlang->errstr = "device_address invalid";
00487 goto out_err;
00488 }
00489 curr_arg++;
00490
00491 ipmi_cmdlang_get_int(argv[curr_arg], &device_id, cmd_info);
00492 if (cmdlang->err) {
00493 cmdlang->errstr = "device_id invalid";
00494 goto out_err;
00495 }
00496 curr_arg++;
00497
00498 ipmi_cmdlang_get_int(argv[curr_arg], &lun, cmd_info);
00499 if (cmdlang->err) {
00500 cmdlang->errstr = "lun invalid";
00501 goto out_err;
00502 }
00503 curr_arg++;
00504
00505 ipmi_cmdlang_get_int(argv[curr_arg], &private_bus, cmd_info);
00506 if (cmdlang->err) {
00507 cmdlang->errstr = "private_bus invalid";
00508 goto out_err;
00509 }
00510 curr_arg++;
00511
00512 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00513 if (cmdlang->err) {
00514 cmdlang->errstr = "channel invalid";
00515 goto out_err;
00516 }
00517 curr_arg++;
00518
00519 ipmi_cmdlang_cmd_info_get(cmd_info);
00520 rv = ipmi_domain_fru_alloc(domain,
00521 is_logical,
00522 device_addr,
00523 device_id,
00524 lun,
00525 private_bus,
00526 channel,
00527 domain_fru_fetched,
00528 cmd_info,
00529 NULL);
00530 if (rv) {
00531 ipmi_cmdlang_cmd_info_put(cmd_info);
00532 cmdlang->errstr = "Error allocating FRU info";
00533 cmdlang->err = rv;
00534 goto out_err;
00535 }
00536
00537 return;
00538
00539 out_err:
00540 ipmi_domain_get_name(domain, cmdlang->objstr,
00541 cmdlang->objstr_len);
00542 cmdlang->location = "cmd_domain.c(domain_fru)";
00543 }
00544
00545 static int
00546 domain_msg_handler(ipmi_domain_t *domain, ipmi_msgi_t *rspi)
00547 {
00548 ipmi_msg_t *msg = &rspi->msg;
00549 ipmi_ipmb_addr_t *addr = (ipmi_ipmb_addr_t *) &rspi->addr;
00550 ipmi_cmd_info_t *cmd_info = rspi->data1;
00551 char domain_name[IPMI_DOMAIN_NAME_LEN];
00552
00553 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00554
00555 ipmi_cmdlang_lock(cmd_info);
00556 ipmi_cmdlang_out(cmd_info, "Response", NULL);
00557 ipmi_cmdlang_down(cmd_info);
00558 ipmi_cmdlang_out(cmd_info, "Domain", domain_name);
00559 ipmi_cmdlang_out_int(cmd_info, "channel", addr->channel);
00560 ipmi_cmdlang_out_hex(cmd_info, "ipmb", addr->slave_addr);
00561 ipmi_cmdlang_out_int(cmd_info, "LUN", addr->lun);
00562 ipmi_cmdlang_out_int(cmd_info, "NetFN", msg->netfn);
00563 ipmi_cmdlang_out_int(cmd_info, "command", msg->cmd);
00564 if (msg->data_len)
00565 ipmi_cmdlang_out_binary(cmd_info, "Data",
00566 (char *) msg->data, msg->data_len);
00567 ipmi_cmdlang_unlock(cmd_info);
00568 ipmi_cmdlang_up(cmd_info);
00569
00570 ipmi_cmdlang_cmd_info_put(cmd_info);
00571
00572 return IPMI_MSG_ITEM_NOT_USED;
00573 }
00574
00575 static void
00576 domain_msg(ipmi_domain_t *domain, void *cb_data)
00577 {
00578 ipmi_cmd_info_t *cmd_info = cb_data;
00579 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00580 int channel;
00581 int ipmb;
00582 int is_broadcast = 0;
00583 int LUN;
00584 int NetFN;
00585 int command;
00586 unsigned char data[100];
00587 int rv;
00588 int i;
00589 ipmi_ipmb_addr_t addr;
00590 ipmi_msg_t msg;
00591 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00592 int argc = ipmi_cmdlang_get_argc(cmd_info);
00593 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00594
00595
00596 if ((argc - curr_arg) < 5) {
00597
00598 cmdlang->errstr = "Not enough parameters";
00599 cmdlang->err = EINVAL;
00600 goto out_err;
00601 }
00602
00603 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00604 if (cmdlang->err) {
00605 cmdlang->errstr = "channel invalid";
00606 goto out_err;
00607 }
00608 curr_arg++;
00609
00610 ipmi_cmdlang_get_int(argv[curr_arg], &ipmb, cmd_info);
00611 if (cmdlang->err) {
00612 cmdlang->errstr = "ipmb invalid";
00613 goto out_err;
00614 }
00615 curr_arg++;
00616
00617 if (ipmb == 0) {
00618 is_broadcast = 1;
00619 if ((argc - curr_arg) < 5) {
00620
00621 cmdlang->errstr = "Not enough parameters";
00622 cmdlang->err = EINVAL;
00623 goto out_err;
00624 }
00625 ipmi_cmdlang_get_int(argv[curr_arg], &ipmb, cmd_info);
00626 if (cmdlang->err) {
00627 cmdlang->errstr = "ipmb invalid";
00628 goto out_err;
00629 }
00630 curr_arg++;
00631 }
00632
00633 ipmi_cmdlang_get_int(argv[curr_arg], &LUN, cmd_info);
00634 if (cmdlang->err) {
00635 cmdlang->errstr = "LUN invalid";
00636 goto out_err;
00637 }
00638 curr_arg++;
00639
00640 ipmi_cmdlang_get_int(argv[curr_arg], &NetFN, cmd_info);
00641 if (cmdlang->err) {
00642 cmdlang->errstr = "NetFN invalid";
00643 goto out_err;
00644 }
00645 curr_arg++;
00646
00647 ipmi_cmdlang_get_int(argv[curr_arg], &command, cmd_info);
00648 if (cmdlang->err) {
00649 cmdlang->errstr = "command invalid";
00650 goto out_err;
00651 }
00652 curr_arg++;
00653
00654 i = 0;
00655 while (curr_arg < argc) {
00656 ipmi_cmdlang_get_uchar(argv[curr_arg], &data[i], cmd_info);
00657 if (cmdlang->err) {
00658 cmdlang->errstr = "data invalid";
00659 goto out_err;
00660 }
00661 curr_arg++;
00662 i++;
00663 }
00664
00665 if (is_broadcast)
00666 addr.addr_type = IPMI_IPMB_BROADCAST_ADDR_TYPE;
00667 else
00668 addr.addr_type = IPMI_IPMB_ADDR_TYPE;
00669 addr.channel = channel;
00670 addr.slave_addr = ipmb;
00671 addr.lun = LUN;
00672 msg.netfn = NetFN;
00673 msg.cmd = command;
00674 msg.data_len = i;
00675 msg.data = data;
00676
00677 ipmi_cmdlang_cmd_info_get(cmd_info);
00678 rv = ipmi_send_command_addr(domain,
00679 (ipmi_addr_t *) &(addr),
00680 sizeof(addr),
00681 &msg,
00682 domain_msg_handler,
00683 cmd_info, NULL);
00684 if (rv) {
00685 ipmi_cmdlang_cmd_info_put(cmd_info);
00686 cmdlang->errstr = "Error sending message";
00687 cmdlang->err = rv;
00688 goto out_err;
00689 }
00690
00691 return;
00692
00693 out_err:
00694 if (cmdlang->err) {
00695 ipmi_domain_get_name(domain, cmdlang->objstr,
00696 cmdlang->objstr_len);
00697 cmdlang->location = "cmd_domain.c(domain_msg)";
00698 }
00699 }
00700
00701 static void
00702 scan_done(ipmi_domain_t *domain, int err, void *cb_data)
00703 {
00704 ipmi_cmd_info_t *cmd_info = cb_data;
00705 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00706 char domain_name[IPMI_DOMAIN_NAME_LEN];
00707
00708 ipmi_cmdlang_lock(cmd_info);
00709 if (err) {
00710 if (! cmdlang->err) {
00711 cmdlang->err = err;
00712 cmdlang->errstr = "Error scanning domain";
00713 ipmi_domain_get_name(domain, cmdlang->objstr,
00714 cmdlang->objstr_len);
00715 cmdlang->location = "cmd_domain.c(scan_done)";
00716 }
00717 goto out;
00718 }
00719
00720 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00721 ipmi_cmdlang_out(cmd_info, "Scan done", domain_name);
00722
00723 out:
00724 ipmi_cmdlang_unlock(cmd_info);
00725 ipmi_cmdlang_cmd_info_put(cmd_info);
00726 }
00727
00728 static void
00729 domain_scan(ipmi_domain_t *domain, void *cb_data)
00730 {
00731 ipmi_cmd_info_t *cmd_info = cb_data;
00732 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00733 int rv;
00734 int channel;
00735 int ipmb1, ipmb2;
00736 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00737 int argc = ipmi_cmdlang_get_argc(cmd_info);
00738 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00739
00740 if ((argc - curr_arg) < 2) {
00741
00742 cmdlang->errstr = "Not enough parameters";
00743 cmdlang->err = EINVAL;
00744 goto out_err;
00745 }
00746
00747 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00748 if (cmdlang->err) {
00749 cmdlang->errstr = "channel invalid";
00750 goto out_err;
00751 }
00752 curr_arg++;
00753
00754 ipmi_cmdlang_get_int(argv[curr_arg], &ipmb1, cmd_info);
00755 if (cmdlang->err) {
00756 cmdlang->errstr = "ipmb1 invalid";
00757 goto out_err;
00758 }
00759 curr_arg++;
00760
00761 if (curr_arg < argc) {
00762 ipmi_cmdlang_get_int(argv[curr_arg], &ipmb2, cmd_info);
00763 if (cmdlang->err) {
00764 cmdlang->errstr = "ipmb2 invalid";
00765 goto out_err;
00766 }
00767 curr_arg++;
00768 } else
00769 ipmb2 = ipmb1;
00770
00771 ipmi_cmdlang_cmd_info_get(cmd_info);
00772 rv = ipmi_start_ipmb_mc_scan(domain, channel, ipmb1, ipmb2,
00773 scan_done, cmd_info);
00774 if (rv) {
00775 ipmi_cmdlang_cmd_info_put(cmd_info);
00776 cmdlang->errstr = "Error requesting scan";
00777 cmdlang->err = rv;
00778 goto out_err;
00779 }
00780
00781 out_err:
00782 if (cmdlang->err) {
00783 ipmi_domain_get_name(domain, cmdlang->objstr,
00784 cmdlang->objstr_len);
00785 cmdlang->location = "cmd_domain.c(domain_scan)";
00786 }
00787 }
00788
00789 static void
00790 domain_rescan_sels_done(ipmi_domain_t *domain, int err, void *cb_data)
00791 {
00792 ipmi_cmd_info_t *cmd_info = cb_data;
00793 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00794 char domain_name[IPMI_DOMAIN_NAME_LEN];
00795
00796 ipmi_cmdlang_lock(cmd_info);
00797 if (err) {
00798 if (! cmdlang->err) {
00799 cmdlang->err = err;
00800 cmdlang->errstr = "Error scanning SELs";
00801 ipmi_domain_get_name(domain, cmdlang->objstr,
00802 cmdlang->objstr_len);
00803 cmdlang->location = "cmd_domain.c(sel_rescan_done)";
00804 }
00805 goto out;
00806 }
00807
00808 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00809 ipmi_cmdlang_out(cmd_info, "SEL Rescan done", domain_name);
00810
00811 out:
00812 ipmi_cmdlang_unlock(cmd_info);
00813 ipmi_cmdlang_cmd_info_put(cmd_info);
00814 }
00815
00816 static void
00817 domain_rescan_sels(ipmi_domain_t *domain, void *cb_data)
00818 {
00819 ipmi_cmd_info_t *cmd_info = cb_data;
00820 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00821 int rv;
00822
00823 ipmi_cmdlang_cmd_info_get(cmd_info);
00824 rv = ipmi_domain_reread_sels(domain, domain_rescan_sels_done, cmd_info);
00825 if (rv) {
00826 ipmi_cmdlang_cmd_info_put(cmd_info);
00827 cmdlang->errstr = "Error requesting SEL rescan";
00828 cmdlang->err = rv;
00829 goto out_err;
00830 }
00831
00832 out_err:
00833 if (cmdlang->err) {
00834 ipmi_domain_get_name(domain, cmdlang->objstr,
00835 cmdlang->objstr_len);
00836 cmdlang->location = "cmd_domain.c(domain_rescan_sels)";
00837 }
00838 }
00839
00840 static void
00841 domain_presence(ipmi_domain_t *domain, void *cb_data)
00842 {
00843 ipmi_cmd_info_t *cmd_info = cb_data;
00844 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00845 int rv;
00846 char domain_name[IPMI_DOMAIN_NAME_LEN];
00847
00848 rv = ipmi_detect_domain_presence_changes(domain, 1);
00849 if (rv) {
00850 cmdlang->err = rv;
00851 ipmi_domain_get_name(domain, cmdlang->objstr,
00852 cmdlang->objstr_len);
00853 cmdlang->location = "cmd_domain.c(domain_presence)";
00854 goto out;
00855 }
00856 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00857 ipmi_cmdlang_out(cmd_info, "Presence check started", domain_name);
00858 out:
00859 return;
00860 }
00861
00862 static void
00863 domain_sel_rescan_time(ipmi_domain_t *domain, void *cb_data)
00864 {
00865 ipmi_cmd_info_t *cmd_info = cb_data;
00866 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00867 int time;
00868 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00869 int argc = ipmi_cmdlang_get_argc(cmd_info);
00870 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00871 char domain_name[IPMI_DOMAIN_NAME_LEN];
00872
00873 if ((argc - curr_arg) < 1) {
00874
00875 cmdlang->errstr = "Not enough parameters";
00876 cmdlang->err = EINVAL;
00877 goto out_err;
00878 }
00879
00880 ipmi_cmdlang_get_int(argv[curr_arg], &time, cmd_info);
00881 if (cmdlang->err) {
00882 cmdlang->errstr = "time invalid";
00883 goto out_err;
00884 }
00885 curr_arg++;
00886
00887 ipmi_domain_set_sel_rescan_time(domain, time);
00888
00889 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00890 ipmi_cmdlang_out(cmd_info, "Domain SEL rescan time set", domain_name);
00891
00892 out_err:
00893 if (cmdlang->err) {
00894 ipmi_domain_get_name(domain, cmdlang->objstr,
00895 cmdlang->objstr_len);
00896 cmdlang->location = "cmd_domain.c(domain_sel_rescan_time)";
00897 }
00898 }
00899
00900
00901 static void
00902 domain_ipmb_rescan_time(ipmi_domain_t *domain, void *cb_data)
00903 {
00904 ipmi_cmd_info_t *cmd_info = cb_data;
00905 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00906 int time;
00907 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00908 int argc = ipmi_cmdlang_get_argc(cmd_info);
00909 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00910 char domain_name[IPMI_DOMAIN_NAME_LEN];
00911
00912 if ((argc - curr_arg) < 1) {
00913 cmdlang->errstr = "Not enough parameters";
00914 cmdlang->err = EINVAL;
00915 goto out_err;
00916 }
00917
00918 ipmi_cmdlang_get_int(argv[curr_arg], &time, cmd_info);
00919 if (cmdlang->err) {
00920 cmdlang->errstr = "time invalid";
00921 goto out_err;
00922 }
00923 curr_arg++;
00924
00925 ipmi_domain_set_ipmb_rescan_time(domain, time);
00926
00927 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00928 ipmi_cmdlang_out(cmd_info, "Domain IPMB rescan time set", domain_name);
00929
00930 out_err:
00931 if (cmdlang->err) {
00932 ipmi_domain_get_name(domain, cmdlang->objstr,
00933 cmdlang->objstr_len);
00934 cmdlang->location = "cmd_domain.c(domain_ipmb_rescan_time)";
00935 }
00936 }
00937
00938 static void
00939 handle_stat(ipmi_domain_t *domain, ipmi_domain_stat_t *stat, void *cb_data)
00940 {
00941 ipmi_cmd_info_t *cmd_info = cb_data;
00942 const char *name = ipmi_domain_stat_get_name(stat);
00943 const char *inst = ipmi_domain_stat_get_instance(stat);
00944 char *s = ipmi_mem_alloc(strlen(name) + strlen(inst) + 2);
00945
00946 if (!s)
00947 return;
00948 sprintf(s, "%s %s", name, inst);
00949 ipmi_cmdlang_out_int(cmd_info, s, ipmi_domain_stat_get(stat));
00950 ipmi_mem_free(s);
00951 }
00952
00953 static void
00954 domain_stats(ipmi_domain_t *domain, void *cb_data)
00955 {
00956 ipmi_cmd_info_t *cmd_info = cb_data;
00957 char domain_name[IPMI_DOMAIN_NAME_LEN];
00958
00959 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00960 ipmi_cmdlang_out(cmd_info, "Domain statistics", NULL);
00961 ipmi_cmdlang_down(cmd_info);
00962 ipmi_cmdlang_out(cmd_info, "Domain", domain_name);
00963 ipmi_domain_stat_iterate(domain, NULL, NULL, handle_stat, cmd_info);
00964 ipmi_cmdlang_up(cmd_info);
00965 }
00966
00967 typedef struct domain_close_info_s
00968 {
00969 char domain_name[IPMI_DOMAIN_NAME_LEN];
00970 ipmi_cmd_info_t *cmd_info;
00971 } domain_close_info_t;
00972
00973 static void
00974 final_close(void *cb_data)
00975 {
00976 domain_close_info_t *info = cb_data;
00977 ipmi_cmd_info_t *cmd_info = info->cmd_info;
00978
00979 ipmi_cmdlang_lock(cmd_info);
00980 ipmi_cmdlang_out(cmd_info, "Domain closed", info->domain_name);
00981 ipmi_cmdlang_unlock(cmd_info);
00982
00983 ipmi_mem_free(info);
00984
00985 ipmi_cmdlang_cmd_info_put(cmd_info);
00986 }
00987
00988 static void
00989 domain_close(ipmi_domain_t *domain, void *cb_data)
00990 {
00991 ipmi_cmd_info_t *cmd_info = cb_data;
00992 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00993 int rv;
00994 domain_close_info_t *info = cb_data;
00995
00996 info = ipmi_mem_alloc(sizeof(*info));
00997 if (!info) {
00998 cmdlang->errstr = "Out of memory";
00999 cmdlang->err = ENOMEM;
01000 goto out_err;
01001 }
01002 ipmi_domain_get_name(domain, info->domain_name, sizeof(info->domain_name));
01003 info->cmd_info = cmd_info;
01004
01005 ipmi_cmdlang_cmd_info_get(cmd_info);
01006 rv = ipmi_domain_close(domain, final_close, info);
01007 if (rv) {
01008 ipmi_cmdlang_cmd_info_put(cmd_info);
01009 cmdlang->errstr = "Unable to close domain";
01010 cmdlang->err = rv;
01011 goto out_err;
01012 }
01013 return;
01014
01015 out_err:
01016 ipmi_domain_get_name(domain, cmdlang->objstr,
01017 cmdlang->objstr_len);
01018 cmdlang->location = "cmd_domain.c(domain_close)";
01019 }
01020
01021
01022
01023
01024
01025
01026
01027
01028 static void
01029 domain_event_handler(ipmi_domain_t *domain,
01030 ipmi_event_t *event,
01031 void *cb_data)
01032 {
01033 char *errstr = NULL;
01034 int rv = 0;
01035 ipmi_cmd_info_t *evi;
01036
01037 evi = ipmi_cmdlang_alloc_event_info();
01038 if (!evi) {
01039 rv = ENOMEM;
01040 errstr = "Out of memory";
01041 goto out_err;
01042 }
01043
01044 ipmi_cmdlang_out(evi, "Object Type", "Event");
01045 ipmi_cmdlang_event_out(event, evi);
01046
01047 out_err:
01048 if (rv) {
01049 char domain_name[IPMI_DOMAIN_NAME_LEN];
01050
01051 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
01052 ipmi_cmdlang_global_err(domain_name,
01053 "cmd_domain.c(domain_event_handler)",
01054 errstr, rv);
01055 }
01056 if (evi)
01057 ipmi_cmdlang_cmd_info_put(evi);
01058 }
01059
01060 static void
01061 domain_con_change(ipmi_domain_t *domain,
01062 int err,
01063 unsigned int conn_num,
01064 unsigned int port_num,
01065 int still_connected,
01066 void *cb_data)
01067 {
01068 char *errstr;
01069 int rv = 0;
01070 ipmi_cmd_info_t *evi;
01071 char domain_name[IPMI_DOMAIN_NAME_LEN];
01072
01073 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
01074
01075 evi = ipmi_cmdlang_alloc_event_info();
01076 if (!evi) {
01077 rv = ENOMEM;
01078 errstr = "Out of memory";
01079 goto out_err;
01080 }
01081
01082 ipmi_cmdlang_out(evi, "Object Type", "Domain");
01083 ipmi_cmdlang_out(evi, "Name", domain_name);
01084 ipmi_cmdlang_out(evi, "Operation", "Connection Change");
01085 ipmi_cmdlang_out_int(evi, "Connection Number", conn_num);
01086 ipmi_cmdlang_out_int(evi, "Port Number", port_num);
01087 ipmi_cmdlang_out_bool(evi, "Any Connection Up", still_connected);
01088 ipmi_cmdlang_out_int(evi, "Error", err);
01089
01090 if (err) {
01091 char errval[128];
01092 ipmi_cmdlang_out(evi, "Error String",
01093 ipmi_get_error_string(err, errval, sizeof(errval)));
01094
01095 }
01096 errstr = NULL;
01097
01098 out_err:
01099 if (rv) {
01100 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
01101 ipmi_cmdlang_global_err(domain_name, "cmd_domain.c(domain_con_change)",
01102 errstr, rv);
01103 }
01104 if (evi)
01105 ipmi_cmdlang_cmd_info_put(evi);
01106 }
01107
01108 void
01109 domain_change(ipmi_domain_t *domain,
01110 enum ipmi_update_e op,
01111 void *cb_data)
01112 {
01113 ipmi_cmd_info_t *evi;
01114 int rv = 0;
01115 char *errstr = NULL;
01116 char domain_name[IPMI_DOMAIN_NAME_LEN];
01117
01118 evi = ipmi_cmdlang_alloc_event_info();
01119 if (!evi) {
01120 rv = ENOMEM;
01121 errstr = "Out of memory";
01122 goto out_err;
01123 }
01124
01125 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
01126
01127
01128 ipmi_cmdlang_out(evi, "Object Type", "Domain");
01129 ipmi_cmdlang_out(evi, "Name", domain_name);
01130
01131 switch (op) {
01132 case IPMI_ADDED:
01133 ipmi_cmdlang_out(evi, "Operation", "Add");
01134 if (ipmi_cmdlang_get_evinfo()) {
01135 ipmi_cmdlang_down(evi);
01136 domain_info(domain, evi);
01137 ipmi_cmdlang_up(evi);
01138 }
01139
01140 rv = ipmi_domain_add_event_handler(domain, domain_event_handler, NULL);
01141 if (rv) {
01142 errstr = "ipmi_register_for_events";
01143 goto out_err;
01144 }
01145
01146 rv = ipmi_domain_enable_events(domain);
01147 if (rv) {
01148 errstr = "ipmi_domain_enable_events";
01149 goto out_err;
01150 }
01151
01152 rv = ipmi_domain_add_entity_update_handler(domain,
01153 ipmi_cmdlang_entity_change,
01154 domain);
01155 if (rv) {
01156 errstr = "ipmi_bmc_set_entity_update_handler";
01157 goto out_err;
01158 }
01159
01160 rv = ipmi_domain_add_mc_updated_handler(domain,
01161 ipmi_cmdlang_mc_change,
01162 domain);
01163 if (rv) {
01164 errstr = "ipmi_bmc_set_entity_update_handler";
01165 goto out_err;
01166 }
01167 break;
01168
01169 case IPMI_DELETED:
01170 ipmi_cmdlang_out(evi, "Operation", "Delete");
01171 break;
01172
01173 default:
01174 break;
01175 }
01176
01177 out_err:
01178
01179 if (rv) {
01180 ipmi_cmdlang_global_err(domain_name, "cmd_domain.c(domain_change)",
01181 errstr, rv);
01182 }
01183 if (evi)
01184 ipmi_cmdlang_cmd_info_put(evi);
01185 }
01186
01187 static void
01188 get_mc_name(ipmi_mc_t *mc, void *cb_data)
01189 {
01190 char *mc_name = cb_data;
01191
01192 ipmi_mc_get_name(mc, mc_name, IPMI_MC_NAME_LEN);
01193 }
01194
01195 void
01196 ipmi_cmdlang_event_out(ipmi_event_t *event,
01197 ipmi_cmd_info_t *cmd_info)
01198 {
01199 ipmi_mcid_t mcid;
01200 char mc_name[IPMI_MC_NAME_LEN];
01201 unsigned int len;
01202 int rv;
01203
01204 mcid = ipmi_event_get_mcid(event);
01205 rv = ipmi_mc_pointer_cb(mcid, get_mc_name, mc_name);
01206 if (rv) {
01207
01208 ipmi_cmdlang_cmd_info_put(cmd_info);
01209 return;
01210 }
01211
01212 ipmi_cmdlang_out(cmd_info, "MC", mc_name);
01213 ipmi_cmdlang_out_int(cmd_info, "Record ID",
01214 ipmi_event_get_record_id(event));
01215 ipmi_cmdlang_out_int(cmd_info, "Event type", ipmi_event_get_type(event));
01216 ipmi_cmdlang_out_time(cmd_info, "Timestamp",
01217 ipmi_event_get_timestamp(event));
01218 len = ipmi_event_get_data_len(event);
01219 if (len) {
01220 unsigned char *data;
01221 data = ipmi_mem_alloc(len);
01222 if (!data)
01223 return;
01224 len = ipmi_event_get_data(event, data, 0, len);
01225 ipmi_cmdlang_out_binary(cmd_info, "Data", (char *) data, len);
01226 ipmi_mem_free(data);
01227 }
01228 }
01229
01230 static ipmi_cmdlang_cmd_t *domain_cmds;
01231
01232 static ipmi_cmdlang_init_t cmds_domain[] =
01233 {
01234 { "domain", NULL,
01235 "- Commands dealing with domains",
01236 NULL, NULL, &domain_cmds},
01237 { "list", &domain_cmds,
01238 "- List all the domains in the system",
01239 domain_list, NULL, NULL },
01240 { "info", &domain_cmds,
01241 "<domain> - Dump information about a domain",
01242 ipmi_cmdlang_domain_handler, domain_info, NULL },
01243 { "new", &domain_cmds,
01244 "Obsolete, use domain open",
01245 domain_new, NULL, NULL },
01246 { "open", &domain_cmds,
01247 "<domain name> [<options>] <domain parms> [<domain parms>]- Set up a"
01248 " new domain u