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_pet.h>
00041 #include <OpenIPMI/ipmi_mc.h>
00042 #include <OpenIPMI/ipmi_cmdlang.h>
00043
00044
00045 static void
00046 pet_list_handler(ipmi_pet_t *pet, void *cb_data)
00047 {
00048 ipmi_cmd_info_t *cmd_info = cb_data;
00049 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00050 char pet_name[IPMI_PET_NAME_LEN];
00051
00052 if (cmdlang->err)
00053 return;
00054
00055 ipmi_pet_get_name(pet, pet_name, sizeof(pet_name));
00056
00057 ipmi_cmdlang_out(cmd_info, "Name", pet_name);
00058 }
00059
00060 static void
00061 pet_list(ipmi_domain_t *domain, void *cb_data)
00062 {
00063 ipmi_cmd_info_t *cmd_info = cb_data;
00064 char domain_name[IPMI_DOMAIN_NAME_LEN];
00065
00066 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00067 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00068 ipmi_cmdlang_down(cmd_info);
00069 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00070 ipmi_cmdlang_out(cmd_info, "PETs", NULL);
00071 ipmi_cmdlang_down(cmd_info);
00072 ipmi_pet_iterate_pets(domain, pet_list_handler, cmd_info);
00073 ipmi_cmdlang_up(cmd_info);
00074 ipmi_cmdlang_up(cmd_info);
00075 }
00076
00077 static void
00078 get_mc_name(ipmi_mc_t *mc, void *cb_data)
00079 {
00080 ipmi_cmd_info_t *cmd_info = cb_data;
00081 char mc_name[IPMI_MC_NAME_LEN];
00082
00083 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name));
00084 ipmi_cmdlang_out(cmd_info, "MC", mc_name);
00085 }
00086
00087 static void
00088 pet_info(ipmi_pet_t *pet, void *cb_data)
00089 {
00090 ipmi_cmd_info_t *cmd_info = cb_data;
00091 int rv;
00092 unsigned char mac_addr[6];
00093 struct in_addr ip_addr;
00094 char pet_name[IPMI_PET_NAME_LEN];
00095
00096 ipmi_pet_get_name(pet, pet_name, sizeof(pet_name));
00097 ipmi_cmdlang_out(cmd_info, "PET", NULL);
00098 ipmi_cmdlang_down(cmd_info);
00099 ipmi_cmdlang_out(cmd_info, "Name", pet_name);
00100 rv = ipmi_mc_pointer_cb(ipmi_pet_get_mc_id(pet), get_mc_name, cmd_info);
00101 if (rv)
00102 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00103 ipmi_cmdlang_out_int(cmd_info, "Channel", ipmi_pet_get_channel(pet));
00104 ipmi_cmdlang_out_ip(cmd_info, "IP Address",
00105 ipmi_pet_get_ip_addr(pet, &ip_addr));
00106 ipmi_cmdlang_out_mac(cmd_info, "MAC Address",
00107 ipmi_pet_get_mac_addr(pet, mac_addr));
00108 ipmi_cmdlang_out_int(cmd_info, "EFT Selector", ipmi_pet_get_eft_sel(pet));
00109 ipmi_cmdlang_out_int(cmd_info, "Policy Number",
00110 ipmi_pet_get_policy_num(pet));
00111 ipmi_cmdlang_out_int(cmd_info, "APT Selector", ipmi_pet_get_apt_sel(pet));
00112 ipmi_cmdlang_out_int(cmd_info, "LAN Dest Selector",
00113 ipmi_pet_get_lan_dest_sel(pet));
00114 ipmi_cmdlang_up(cmd_info);
00115 }
00116
00117 static void
00118 pet_done(ipmi_pet_t *pet, int err, void *cb_data)
00119 {
00120 ipmi_cmd_info_t *cmd_info = cb_data;
00121 char pet_name[IPMI_PET_NAME_LEN];
00122
00123 ipmi_pet_get_name(pet, pet_name, sizeof(pet_name));
00124 ipmi_cmdlang_out(cmd_info, "PET Created", pet_name);
00125 ipmi_cmdlang_cmd_info_put(cmd_info);
00126 }
00127
00128 static void
00129 pet_new(ipmi_domain_t *domain, void *cb_data)
00130 {
00131 ipmi_cmd_info_t *cmd_info = cb_data;
00132 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00133 int connection;
00134 int channel;
00135 struct in_addr ip_addr;
00136 unsigned char mac_addr[6];
00137 int eft_selector;
00138 int policy_num;
00139 int apt_selector;
00140 int lan_dest_selector;
00141 int rv;
00142 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00143 int argc = ipmi_cmdlang_get_argc(cmd_info);
00144 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00145
00146 if ((argc - curr_arg) < 8) {
00147
00148 cmdlang->errstr = "Not enough parameters";
00149 cmdlang->err = EINVAL;
00150 goto out_err;
00151 }
00152
00153 ipmi_cmdlang_get_int(argv[curr_arg], &connection, cmd_info);
00154 if (cmdlang->err) {
00155 cmdlang->errstr = "connection invalid";
00156 goto out_err;
00157 }
00158 curr_arg++;
00159
00160 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00161 if (cmdlang->err) {
00162 cmdlang->errstr = "channel invalid";
00163 goto out_err;
00164 }
00165 curr_arg++;
00166
00167 ipmi_cmdlang_get_ip(argv[curr_arg], &ip_addr, cmd_info);
00168 if (cmdlang->err) {
00169 cmdlang->errstr = "ip addr invalid";
00170 goto out_err;
00171 }
00172 curr_arg++;
00173
00174 ipmi_cmdlang_get_mac(argv[curr_arg], mac_addr, cmd_info);
00175 if (cmdlang->err) {
00176 cmdlang->errstr = "mac addr invalid";
00177 goto out_err;
00178 }
00179 curr_arg++;
00180
00181 ipmi_cmdlang_get_int(argv[curr_arg], &eft_selector, cmd_info);
00182 if (cmdlang->err) {
00183 cmdlang->errstr = "eft_selector invalid";
00184 goto out_err;
00185 }
00186 curr_arg++;
00187
00188 ipmi_cmdlang_get_int(argv[curr_arg], &policy_num, cmd_info);
00189 if (cmdlang->err) {
00190 cmdlang->errstr = "policy num invalid";
00191 goto out_err;
00192 }
00193 curr_arg++;
00194
00195 ipmi_cmdlang_get_int(argv[curr_arg], &apt_selector, cmd_info);
00196 if (cmdlang->err) {
00197 cmdlang->errstr = "apt selectory invalid";
00198 goto out_err;
00199 }
00200 curr_arg++;
00201
00202 ipmi_cmdlang_get_int(argv[curr_arg], &lan_dest_selector, cmd_info);
00203 if (cmdlang->err) {
00204 cmdlang->errstr = "lan dest selector invalid";
00205 goto out_err;
00206 }
00207 curr_arg++;
00208
00209 ipmi_cmdlang_cmd_info_get(cmd_info);
00210 rv = ipmi_pet_create(domain,
00211 connection,
00212 channel,
00213 ip_addr,
00214 mac_addr,
00215 eft_selector,
00216 policy_num,
00217 apt_selector,
00218 lan_dest_selector,
00219 pet_done,
00220 cmd_info,
00221 NULL);
00222 if (rv) {
00223 ipmi_cmdlang_cmd_info_put(cmd_info);
00224 cmdlang->errstr = "Error from ipmi_pet_create";
00225 cmdlang->err = rv;
00226 goto out_err;
00227 }
00228
00229 return;
00230
00231 out_err:
00232 ipmi_domain_get_name(domain, cmdlang->objstr,
00233 cmdlang->objstr_len);
00234 cmdlang->location = "cmd_pet.c(pet_new)";
00235 }
00236
00237 static void
00238 pet_mcnew(ipmi_mc_t *mc, void *cb_data)
00239 {
00240 ipmi_cmd_info_t *cmd_info = cb_data;
00241 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00242 int channel;
00243 struct in_addr ip_addr;
00244 unsigned char mac_addr[6];
00245 int eft_selector;
00246 int policy_num;
00247 int apt_selector;
00248 int lan_dest_selector;
00249 int rv;
00250 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00251 int argc = ipmi_cmdlang_get_argc(cmd_info);
00252 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00253
00254 if ((argc - curr_arg) < 7) {
00255
00256 cmdlang->errstr = "Not enough parameters";
00257 cmdlang->err = EINVAL;
00258 goto out_err;
00259 }
00260
00261 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00262 if (cmdlang->err) {
00263 cmdlang->errstr = "channel invalid";
00264 goto out_err;
00265 }
00266 curr_arg++;
00267
00268 ipmi_cmdlang_get_ip(argv[curr_arg], &ip_addr, cmd_info);
00269 if (cmdlang->err) {
00270 cmdlang->errstr = "ip addr invalid";
00271 goto out_err;
00272 }
00273 curr_arg++;
00274
00275 ipmi_cmdlang_get_mac(argv[curr_arg], mac_addr, cmd_info);
00276 if (cmdlang->err) {
00277 cmdlang->errstr = "mac addr invalid";
00278 goto out_err;
00279 }
00280 curr_arg++;
00281
00282 ipmi_cmdlang_get_int(argv[curr_arg], &eft_selector, cmd_info);
00283 if (cmdlang->err) {
00284 cmdlang->errstr = "eft_selector invalid";
00285 goto out_err;
00286 }
00287 curr_arg++;
00288
00289 ipmi_cmdlang_get_int(argv[curr_arg], &policy_num, cmd_info);
00290 if (cmdlang->err) {
00291 cmdlang->errstr = "policy num invalid";
00292 goto out_err;
00293 }
00294 curr_arg++;
00295
00296 ipmi_cmdlang_get_int(argv[curr_arg], &apt_selector, cmd_info);
00297 if (cmdlang->err) {
00298 cmdlang->errstr = "apt selectory invalid";
00299 goto out_err;
00300 }
00301 curr_arg++;
00302
00303 ipmi_cmdlang_get_int(argv[curr_arg], &lan_dest_selector, cmd_info);
00304 if (cmdlang->err) {
00305 cmdlang->errstr = "lan dest selector invalid";
00306 goto out_err;
00307 }
00308 curr_arg++;
00309
00310 ipmi_cmdlang_cmd_info_get(cmd_info);
00311 rv = ipmi_pet_create_mc(mc,
00312 channel,
00313 ip_addr,
00314 mac_addr,
00315 eft_selector,
00316 policy_num,
00317 apt_selector,
00318 lan_dest_selector,
00319 pet_done,
00320 cmd_info,
00321 NULL);
00322 if (rv) {
00323 ipmi_cmdlang_cmd_info_put(cmd_info);
00324 cmdlang->errstr = "Error from ipmi_pet_create";
00325 cmdlang->err = rv;
00326 goto out_err;
00327 }
00328
00329 return;
00330
00331 out_err:
00332 ipmi_mc_get_name(mc, cmdlang->objstr,
00333 cmdlang->objstr_len);
00334 cmdlang->location = "cmd_pet.c(pet_mcnew)";
00335 }
00336
00337 static void
00338 close_done(ipmi_pet_t *pet, int err, void *cb_data)
00339 {
00340 ipmi_cmd_info_t *cmd_info = cb_data;
00341 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00342 char pet_name[IPMI_PET_NAME_LEN];
00343
00344 ipmi_cmdlang_lock(cmd_info);
00345 if (err) {
00346 ipmi_pet_get_name(pet, cmdlang->objstr,
00347 cmdlang->objstr_len);
00348 cmdlang->errstr = "Error closing PET";
00349 cmdlang->err = err;
00350 cmdlang->location = "cmd_pet.c(close_done)";
00351 goto out;
00352 }
00353
00354 ipmi_pet_get_name(pet, pet_name, sizeof(pet_name));
00355 ipmi_cmdlang_out(cmd_info, "PET destroyed", pet_name);
00356
00357 out:
00358 ipmi_cmdlang_unlock(cmd_info);
00359 ipmi_cmdlang_cmd_info_put(cmd_info);
00360 }
00361
00362 static void
00363 pet_close(ipmi_pet_t *pet, void *cb_data)
00364 {
00365 ipmi_cmd_info_t *cmd_info = cb_data;
00366 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00367 int rv;
00368
00369 ipmi_cmdlang_cmd_info_get(cmd_info);
00370 rv = ipmi_pet_destroy(pet, close_done, cmd_info);
00371 if (rv) {
00372 ipmi_pet_get_name(pet, cmdlang->objstr,
00373 cmdlang->objstr_len);
00374 ipmi_cmdlang_cmd_info_put(cmd_info);
00375 cmdlang->errstr = "Error closing PET";
00376 cmdlang->err = rv;
00377 cmdlang->location = "cmd_pet.c(pet_close)";
00378 }
00379 }
00380
00381 static ipmi_cmdlang_cmd_t *pet_cmds;
00382
00383 static ipmi_cmdlang_init_t cmds_pet[] =
00384 {
00385 { "pet", NULL,
00386 "- Commands dealing with Platform Event Traps (PETs)",
00387 NULL, NULL, &pet_cmds},
00388 { "list", &pet_cmds,
00389 "- List all the pets in the system",
00390 ipmi_cmdlang_domain_handler, pet_list, NULL },
00391 { "new", &pet_cmds,
00392 "<domain> <connection> <channel> <ip addr> <mac_addr> <eft selector>"
00393 " <policy num> <apt selector> <lan dest selector>"
00394 " - Set up the domain to send PET traps from the given connection"
00395 " to the given IP/MAC address over the given channel",
00396 ipmi_cmdlang_domain_handler, pet_new, NULL },
00397 { "mcnew", &pet_cmds,
00398 "<mc> <channel> <ip addr> <mac_addr> <eft selector>"
00399 " <policy num> <apt selector> <lan dest selector>"
00400 " - Set up the domain to send PET traps from the given connection"
00401 " to the given IP/MAC address over the given channel",
00402 ipmi_cmdlang_mc_handler, pet_mcnew, NULL },
00403 { "info", &pet_cmds,
00404 "<pet> - Dump information about a pet",
00405 ipmi_cmdlang_pet_handler, pet_info, NULL },
00406 { "close", &pet_cmds,
00407 "<pet> - Close the pet",
00408 ipmi_cmdlang_pet_handler, pet_close, NULL },
00409 };
00410 #define CMDS_PET_LEN (sizeof(cmds_pet)/sizeof(ipmi_cmdlang_init_t))
00411
00412 int
00413 ipmi_cmdlang_pet_init(os_handler_t *os_hnd)
00414 {
00415 return ipmi_cmdlang_reg_table(cmds_pet, CMDS_PET_LEN);
00416 }