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_lanparm.h>
00041 #include <OpenIPMI/ipmi_cmdlang.h>
00042 #include <OpenIPMI/ipmi_mc.h>
00043
00044
00045 #include <OpenIPMI/internal/ipmi_malloc.h>
00046 #include <OpenIPMI/internal/locked_list.h>
00047
00048 static locked_list_t *lancs;
00049
00050 static void
00051 lanparm_list_handler(ipmi_lanparm_t *lanparm, void *cb_data)
00052 {
00053 ipmi_cmd_info_t *cmd_info = cb_data;
00054 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00055 char lanparm_name[IPMI_LANPARM_NAME_LEN];
00056
00057 if (cmdlang->err)
00058 return;
00059
00060 ipmi_lanparm_get_name(lanparm, lanparm_name, sizeof(lanparm_name));
00061
00062 ipmi_cmdlang_out(cmd_info, "Name", lanparm_name);
00063 }
00064
00065 static void
00066 lanparm_list(ipmi_domain_t *domain, void *cb_data)
00067 {
00068 ipmi_cmd_info_t *cmd_info = cb_data;
00069 char domain_name[IPMI_DOMAIN_NAME_LEN];
00070
00071 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00072 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00073 ipmi_cmdlang_down(cmd_info);
00074 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00075 ipmi_cmdlang_out(cmd_info, "LANPARMs", NULL);
00076 ipmi_cmdlang_down(cmd_info);
00077 ipmi_lanparm_iterate_lanparms(domain, lanparm_list_handler, cmd_info);
00078 ipmi_cmdlang_up(cmd_info);
00079 ipmi_cmdlang_up(cmd_info);
00080 }
00081
00082 static void
00083 get_mc_name(ipmi_mc_t *mc, void *cb_data)
00084 {
00085 ipmi_cmd_info_t *cmd_info = cb_data;
00086 char mc_name[IPMI_MC_NAME_LEN];
00087
00088 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name));
00089 ipmi_cmdlang_out(cmd_info, "MC", mc_name);
00090 }
00091
00092 static void
00093 lanparm_info(ipmi_lanparm_t *lanparm, void *cb_data)
00094 {
00095 ipmi_cmd_info_t *cmd_info = cb_data;
00096 int rv;
00097 char lanparm_name[IPMI_LANPARM_NAME_LEN];
00098
00099 ipmi_lanparm_get_name(lanparm, lanparm_name, sizeof(lanparm_name));
00100
00101 ipmi_cmdlang_out(cmd_info, "LANPARM", NULL);
00102 ipmi_cmdlang_down(cmd_info);
00103 ipmi_cmdlang_out(cmd_info, "Name", lanparm_name);
00104 rv = ipmi_mc_pointer_cb(ipmi_lanparm_get_mc_id(lanparm), get_mc_name,
00105 cmd_info);
00106 ipmi_cmdlang_out_int(cmd_info, "Channel",
00107 ipmi_lanparm_get_channel(lanparm));
00108 ipmi_cmdlang_up(cmd_info);
00109 }
00110
00111 static void
00112 lanparm_new(ipmi_mc_t *mc, void *cb_data)
00113 {
00114 ipmi_cmd_info_t *cmd_info = cb_data;
00115 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00116 int channel;
00117 int rv;
00118 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00119 int argc = ipmi_cmdlang_get_argc(cmd_info);
00120 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00121 ipmi_lanparm_t *lanparm;
00122 char lanparm_name[IPMI_LANPARM_NAME_LEN];
00123
00124 if ((argc - curr_arg) < 1) {
00125
00126 cmdlang->errstr = "Not enough parameters";
00127 cmdlang->err = EINVAL;
00128 goto out_err;
00129 }
00130
00131 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00132 if (cmdlang->err) {
00133 cmdlang->errstr = "channel invalid";
00134 goto out_err;
00135 }
00136 curr_arg++;
00137
00138 rv = ipmi_lanparm_alloc(mc, channel, &lanparm);
00139 if (rv) {
00140 cmdlang->errstr = "Error from ipmi_lanparm_alloc";
00141 cmdlang->err = rv;
00142 goto out_err;
00143 }
00144
00145 ipmi_lanparm_get_name(lanparm, lanparm_name, sizeof(lanparm_name));
00146 ipmi_cmdlang_out(cmd_info, "LANPARM", lanparm_name);
00147
00148 return;
00149
00150 out_err:
00151 ipmi_mc_get_name(mc, cmdlang->objstr,
00152 cmdlang->objstr_len);
00153 cmdlang->location = "cmd_lanparm.c(lanparm_new)";
00154 }
00155
00156 typedef struct lanparm_info_s
00157 {
00158 char name[IPMI_LANPARM_NAME_LEN];
00159 ipmi_cmd_info_t *cmd_info;
00160 } lanparm_info_t;
00161
00162 static void
00163 lanparm_close_done(ipmi_lanparm_t *lanparm, int err, void *cb_data)
00164 {
00165 lanparm_info_t *info = cb_data;
00166 ipmi_cmd_info_t *cmd_info = info->cmd_info;
00167 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00168
00169 ipmi_cmdlang_lock(cmd_info);
00170 if (err) {
00171 ipmi_lanparm_get_name(lanparm, cmdlang->objstr,
00172 cmdlang->objstr_len);
00173 cmdlang->errstr = "Error closing LANPARM";
00174 cmdlang->err = err;
00175 cmdlang->location = "cmd_lanparm.c(lanparm_close_done)";
00176 goto out;
00177 }
00178
00179 ipmi_cmdlang_out(cmd_info, "LANPARM destroyed", info->name);
00180
00181 out:
00182 ipmi_cmdlang_unlock(cmd_info);
00183 ipmi_cmdlang_cmd_info_put(cmd_info);
00184 ipmi_mem_free(info);
00185 }
00186
00187 static void
00188 lanparm_close(ipmi_lanparm_t *lanparm, void *cb_data)
00189 {
00190 ipmi_cmd_info_t *cmd_info = cb_data;
00191 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00192 int rv;
00193 lanparm_info_t *info;
00194
00195 info = ipmi_mem_alloc(sizeof(*info));
00196 if (!info) {
00197 cmdlang->errstr = "Out of memory";
00198 cmdlang->err = ENOMEM;
00199 goto out_err;
00200 }
00201 info->cmd_info = cmd_info;
00202 ipmi_lanparm_get_name(lanparm, info->name, sizeof(info->name));
00203
00204 ipmi_cmdlang_cmd_info_get(cmd_info);
00205 rv = ipmi_lanparm_destroy(lanparm, lanparm_close_done, info);
00206 if (rv) {
00207 ipmi_cmdlang_cmd_info_put(cmd_info);
00208 ipmi_lanparm_get_name(lanparm, cmdlang->objstr,
00209 cmdlang->objstr_len);
00210 cmdlang->errstr = "Error closing LANPARM";
00211 cmdlang->err = rv;
00212 ipmi_mem_free(info);
00213 }
00214 return;
00215
00216 out_err:
00217 cmdlang->location = "cmd_lanparm.c(lanparm_close)";
00218 }
00219
00220 #define LAN_CONFIG_NAME_LEN 80
00221 typedef struct lan_config_info_s
00222 {
00223 char name[LAN_CONFIG_NAME_LEN];
00224 ipmi_lan_config_t *config;
00225 } lan_config_info_t;
00226
00227 static unsigned int unique_num = 0;
00228
00229 typedef struct find_config_s
00230 {
00231 char *name;
00232 ipmi_lan_config_t *config;
00233 int delete;
00234 } find_config_t;
00235
00236 static int
00237 find_config_handler(void *cb_data, void *item1, void *item2)
00238 {
00239 lan_config_info_t *info = item1;
00240 find_config_t *find = cb_data;
00241
00242 if (strcmp(find->name, info->name) == 0) {
00243 find->config = info->config;
00244 if (find->delete) {
00245 locked_list_remove(lancs, item1, item2);
00246 ipmi_mem_free(info);
00247 }
00248 return LOCKED_LIST_ITER_STOP;
00249 }
00250
00251 return LOCKED_LIST_ITER_CONTINUE;
00252 }
00253
00254 static ipmi_lan_config_t *
00255 find_config(char *name, int delete)
00256 {
00257 find_config_t find;
00258
00259 find.name = name;
00260 find.config = NULL;
00261 find.delete = delete;
00262 locked_list_iterate(lancs, find_config_handler, &find);
00263 return find.config;
00264 }
00265
00266 typedef void (*lp_set)(ipmi_cmd_info_t *cmd_info, char *val,
00267 ipmi_lan_config_t *lanc, void *func);
00268 typedef void (*lp_out)(ipmi_cmd_info_t *cmd_info, char *name,
00269 ipmi_lan_config_t *lanc, void *func);
00270 typedef struct lp_item_s
00271 {
00272 lp_set set;
00273 lp_out out;
00274 } lp_item_t;
00275
00276 static void
00277 set_retint(ipmi_cmd_info_t *cmd_info, char *val,
00278 ipmi_lan_config_t *lanc, void *func)
00279 {
00280 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00281 int (*f)(ipmi_lan_config_t *l, unsigned int v) = func;
00282 int v;
00283
00284 ipmi_cmdlang_get_int(val, &v, cmd_info);
00285 if (!cmdlang->err) {
00286 cmdlang->err = f(lanc, v);
00287 if (cmdlang->err) {
00288 cmdlang->errstr = "Error setting parameter";
00289 }
00290 }
00291 }
00292 static void
00293 out_retint(ipmi_cmd_info_t *cmd_info, char *name,
00294 ipmi_lan_config_t *lanc, void *func)
00295 {
00296 unsigned int (*f)(ipmi_lan_config_t *l) = func;
00297 ipmi_cmdlang_out_int(cmd_info, name, f(lanc));
00298 }
00299 static lp_item_t lp_retint = {set_retint, out_retint};
00300
00301 static void
00302 set_retbool(ipmi_cmd_info_t *cmd_info, char *val,
00303 ipmi_lan_config_t *lanc, void *func)
00304 {
00305 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00306 int (*f)(ipmi_lan_config_t *l, unsigned int v) = func;
00307 int v;
00308
00309 ipmi_cmdlang_get_bool(val, &v, cmd_info);
00310 if (!cmdlang->err) {
00311 cmdlang->err = f(lanc, v);
00312 if (cmdlang->err) {
00313 cmdlang->errstr = "Error setting parameter";
00314 }
00315 }
00316 }
00317 static void
00318 out_retbool(ipmi_cmd_info_t *cmd_info, char *name,
00319 ipmi_lan_config_t *lanc, void *func)
00320 {
00321 unsigned int (*f)(ipmi_lan_config_t *l) = func;
00322 ipmi_cmdlang_out_bool(cmd_info, name, f(lanc));
00323 }
00324 static lp_item_t lp_retbool = {set_retbool, out_retbool};
00325
00326 static void
00327 set_int(ipmi_cmd_info_t *cmd_info, char *val,
00328 ipmi_lan_config_t *lanc, void *func)
00329 {
00330 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00331 int (*f)(ipmi_lan_config_t *l, unsigned int v) = func;
00332 int v;
00333
00334 ipmi_cmdlang_get_int(val, &v, cmd_info);
00335 if (!cmdlang->err) {
00336 cmdlang->err = f(lanc, v);
00337 if (cmdlang->err) {
00338 cmdlang->errstr = "Error setting parameter";
00339 }
00340 }
00341 }
00342 static void
00343 out_int(ipmi_cmd_info_t *cmd_info, char *name,
00344 ipmi_lan_config_t *lanc, void *func)
00345 {
00346 unsigned int v;
00347 int rv;
00348 int (*f)(ipmi_lan_config_t *l, unsigned int *v) = func;
00349
00350 rv = f(lanc, &v);
00351 if (!rv)
00352 ipmi_cmdlang_out_int(cmd_info, name, v);
00353 }
00354 static lp_item_t lp_int = {set_int, out_int};
00355
00356 static void
00357 set_bool(ipmi_cmd_info_t *cmd_info, char *val,
00358 ipmi_lan_config_t *lanc, void *func)
00359 {
00360 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00361 int (*f)(ipmi_lan_config_t *l, unsigned int v) = func;
00362 int v;
00363
00364 ipmi_cmdlang_get_bool(val, &v, cmd_info);
00365 if (!cmdlang->err) {
00366 cmdlang->err = f(lanc, v);
00367 if (cmdlang->err) {
00368 cmdlang->errstr = "Error setting parameter";
00369 }
00370 }
00371 }
00372 static void
00373 out_bool(ipmi_cmd_info_t *cmd_info, char *name,
00374 ipmi_lan_config_t *lanc, void *func)
00375 {
00376 unsigned int v;
00377 int rv;
00378 int (*f)(ipmi_lan_config_t *l, unsigned int *v) = func;
00379
00380 rv = f(lanc, &v);
00381 if (!rv)
00382 ipmi_cmdlang_out_bool(cmd_info, name, v);
00383 }
00384 static lp_item_t lp_bool = {set_bool, out_bool};
00385
00386 static void
00387 set_ip(ipmi_cmd_info_t *cmd_info, char *val,
00388 ipmi_lan_config_t *lanc, void *func)
00389 {
00390 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00391 int (*f)(ipmi_lan_config_t *l, unsigned char *v,
00392 unsigned int dl) = func;
00393 struct in_addr v;
00394
00395 ipmi_cmdlang_get_ip(val, &v, cmd_info);
00396 if (!cmdlang->err) {
00397 cmdlang->err = f(lanc, (unsigned char *) &v, sizeof(v));
00398 if (cmdlang->err) {
00399 cmdlang->errstr = "Error setting parameter";
00400 }
00401 }
00402 }
00403 static void
00404 out_ip(ipmi_cmd_info_t *cmd_info, char *name,
00405 ipmi_lan_config_t *lanc, void *func)
00406 {
00407 struct in_addr v;
00408 int rv;
00409 int (*f)(ipmi_lan_config_t *l, unsigned char *v,
00410 unsigned int *dl) = func;
00411 unsigned int len = sizeof(v);
00412
00413 rv = f(lanc, (unsigned char *) &v, &len);
00414 if (!rv)
00415 ipmi_cmdlang_out_ip(cmd_info, name, &v);
00416 }
00417 static lp_item_t lp_ip = {set_ip, out_ip};
00418
00419 static void
00420 set_port(ipmi_cmd_info_t *cmd_info, char *val,
00421 ipmi_lan_config_t *lanc, void *func)
00422 {
00423 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00424 int (*f)(ipmi_lan_config_t *l, unsigned char *v,
00425 unsigned int dl) = func;
00426 int v;
00427 short sv;
00428
00429 ipmi_cmdlang_get_int(val, &v, cmd_info);
00430 sv = htons(v);
00431 if (!cmdlang->err) {
00432 cmdlang->err = f(lanc, (unsigned char *) &v, sizeof(v));
00433 if (cmdlang->err) {
00434 cmdlang->errstr = "Error setting parameter";
00435 }
00436 }
00437 }
00438 static void
00439 out_port(ipmi_cmd_info_t *cmd_info, char *name,
00440 ipmi_lan_config_t *lanc, void *func)
00441 {
00442 short v;
00443 int rv;
00444 int (*f)(ipmi_lan_config_t *l, unsigned char *v,
00445 unsigned int *dl) = func;
00446 unsigned int len = sizeof(v);
00447
00448 rv = f(lanc, (unsigned char *) &v, &len);
00449 if (!rv) {
00450 v = ntohs(v);
00451 ipmi_cmdlang_out_int(cmd_info, name, v);
00452 }
00453 }
00454 static lp_item_t lp_port = {set_port, out_port};
00455
00456 static void
00457 set_mac(ipmi_cmd_info_t *cmd_info, char *val,
00458 ipmi_lan_config_t *lanc, void *func)
00459 {
00460 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00461 int (*f)(ipmi_lan_config_t *l, unsigned char *v,
00462 unsigned int dl) = func;
00463 unsigned char v[6];
00464
00465 ipmi_cmdlang_get_mac(val, v, cmd_info);
00466 if (!cmdlang->err) {
00467 cmdlang->err = f(lanc, v, sizeof(v));
00468 if (cmdlang->err) {
00469 cmdlang->errstr = "Error setting parameter";
00470 }
00471 }
00472 }
00473 static void
00474 out_mac(ipmi_cmd_info_t *cmd_info, char *name,
00475 ipmi_lan_config_t *lanc, void *func)
00476 {
00477 unsigned char v[6];
00478 int rv;
00479 int (*f)(ipmi_lan_config_t *l, unsigned char *v,
00480 unsigned int *dl) = func;
00481 unsigned int len = sizeof(v);
00482
00483 rv = f(lanc, v, &len);
00484 if (!rv)
00485 ipmi_cmdlang_out_mac(cmd_info, name, v);
00486 }
00487 static lp_item_t lp_mac = {set_mac, out_mac};
00488
00489 static void
00490 set_str(ipmi_cmd_info_t *cmd_info, char *val,
00491 ipmi_lan_config_t *lanc, void *func)
00492 {
00493 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00494 int (*f)(ipmi_lan_config_t *l, char *v,
00495 unsigned int dl) = func;
00496
00497 if (!cmdlang->err) {
00498 cmdlang->err = f(lanc, val, strlen(val));
00499 if (cmdlang->err) {
00500 cmdlang->errstr = "Error setting parameter";
00501 }
00502 }
00503 }
00504 static void
00505 out_str(ipmi_cmd_info_t *cmd_info, char *name,
00506 ipmi_lan_config_t *lanc, void *func)
00507 {
00508 char v[100];
00509 int rv;
00510 int (*f)(ipmi_lan_config_t *l, char *v,
00511 unsigned int *dl) = func;
00512 unsigned int len = sizeof(v);
00513
00514 rv = f(lanc, v, &len);
00515 if (!rv)
00516 ipmi_cmdlang_out(cmd_info, name, v);
00517 }
00518 static lp_item_t lp_str = {set_str, out_str};
00519
00520 static struct lps_s
00521 {
00522 char *name;
00523 lp_item_t *lpi;
00524 void *get_func;
00525 void *set_func;
00526 } lps[] =
00527
00528 #define FR(name, type) { #name, &lp_ ## type, ipmi_lanconfig_get_ ## name, \
00529 NULL }
00530
00531 #define F(name, type) { #name, &lp_ ## type, ipmi_lanconfig_get_ ## name, \
00532 ipmi_lanconfig_set_ ## name }
00533 {
00534 FR(support_auth_oem, retbool),
00535 FR(support_auth_straight, retbool),
00536 FR(support_auth_md5, retbool),
00537 FR(support_auth_md2, retbool),
00538 FR(support_auth_none, retbool),
00539 F(ip_addr_source, retint),
00540 FR(num_alert_destinations, retint),
00541 F(ipv4_ttl, int),
00542 F(ipv4_flags, int),
00543 F(ipv4_precedence, int),
00544 F(ipv4_tos, int),
00545 F(ip_addr, ip),
00546 F(mac_addr, mac),
00547 F(subnet_mask, ip),
00548 F(primary_rmcp_port, port),
00549 F(secondary_rmcp_port, port),
00550 F(bmc_generated_arps, bool),
00551 F(bmc_generated_garps, bool),
00552 F(garp_interval, int),
00553 F(default_gateway_ip_addr, ip),
00554 F(default_gateway_mac_addr, mac),
00555 F(backup_gateway_ip_addr, ip),
00556 F(backup_gateway_mac_addr, mac),
00557 F(community_string, str),
00558 F(vlan_id_enable, bool),
00559 F(vlan_id, int),
00560 F(vlan_priority, int),
00561 { NULL }
00562 };
00563
00564
00565
00566
00567 typedef void (*ulp_set)(ipmi_cmd_info_t *cmd_info, int sel, char *val,
00568 ipmi_lan_config_t *lanc, void *func);
00569 typedef void (*ulp_out)(ipmi_cmd_info_t *cmd_info, int sel, char *name,
00570 ipmi_lan_config_t *lanc, void *func);
00571 typedef struct ulp_item_s
00572 {
00573 ulp_set set;
00574 ulp_out out;
00575 } ulp_item_t;
00576
00577 static void
00578 uset_bool(ipmi_cmd_info_t *cmd_info, int sel, char *val,
00579 ipmi_lan_config_t *lanc, void *func)
00580 {
00581 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00582 int (*f)(ipmi_lan_config_t *l, unsigned int sel,
00583 unsigned int v) = func;
00584 int v;
00585
00586 ipmi_cmdlang_get_bool(val, &v, cmd_info);
00587 if (!cmdlang->err) {
00588 cmdlang->err = f(lanc, sel, v);
00589 if (cmdlang->err) {
00590 cmdlang->errstr = "Error setting parameter";
00591 }
00592 }
00593 }
00594 static void
00595 uout_bool(ipmi_cmd_info_t *cmd_info, int sel, char *name,
00596 ipmi_lan_config_t *lanc, void *func)
00597 {
00598 unsigned int v;
00599 int rv;
00600 int (*f)(ipmi_lan_config_t *l, unsigned int sel,
00601 unsigned int *v) = func;
00602
00603 rv = f(lanc, sel, &v);
00604 if (!rv)
00605 ipmi_cmdlang_out_bool(cmd_info, name, v);
00606 }
00607 static ulp_item_t lp_ubool = {uset_bool, uout_bool};
00608
00609 static struct ulps_s
00610 {
00611 char *name;
00612 ulp_item_t *lpi;
00613 void *get_func;
00614 void *set_func;
00615 } ulps[] =
00616 {
00617 F(enable_auth_oem, ubool),
00618 F(enable_auth_straight, ubool),
00619 F(enable_auth_md5, ubool),
00620 F(enable_auth_md2, ubool),
00621 F(enable_auth_none, ubool),
00622 { NULL }
00623 };
00624
00625
00626
00627
00628 static void
00629 uset_int(ipmi_cmd_info_t *cmd_info, int sel, char *val,
00630 ipmi_lan_config_t *lanc, void *func)
00631 {
00632 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00633 int (*f)(ipmi_lan_config_t *l, unsigned int sel,
00634 unsigned int v) = func;
00635 int v;
00636
00637 ipmi_cmdlang_get_int(val, &v, cmd_info);
00638 if (!cmdlang->err) {
00639 cmdlang->err = f(lanc, sel, v);
00640 if (cmdlang->err) {
00641 cmdlang->errstr = "Error setting parameter";
00642 }
00643 }
00644 }
00645 static void
00646 uout_int(ipmi_cmd_info_t *cmd_info, int sel, char *name,
00647 ipmi_lan_config_t *lanc, void *func)
00648 {
00649 unsigned int v;
00650 int rv;
00651 int (*f)(ipmi_lan_config_t *l, unsigned int sel,
00652 unsigned int *v) = func;
00653
00654 rv = f(lanc, sel, &v);
00655 if (!rv)
00656 ipmi_cmdlang_out_int(cmd_info, name, v);
00657 }
00658 static ulp_item_t lp_uint = {uset_int, uout_int};
00659
00660 static void
00661 uset_ip(ipmi_cmd_info_t *cmd_info, int sel, char *val,
00662 ipmi_lan_config_t *lanc, void *func)
00663 {
00664 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00665 int (*f)(ipmi_lan_config_t *l, unsigned int sel,
00666 unsigned char *v, unsigned int dl) = func;
00667 struct in_addr v;
00668
00669 ipmi_cmdlang_get_ip(val, &v, cmd_info);
00670 if (!cmdlang->err) {
00671 cmdlang->err = f(lanc, sel, (unsigned char *) &v, sizeof(v));
00672 if (cmdlang->err) {
00673 cmdlang->errstr = "Error setting parameter";
00674 }
00675 }
00676 }
00677 static void
00678 uout_ip(ipmi_cmd_info_t *cmd_info, int sel, char *name,
00679 ipmi_lan_config_t *lanc, void *func)
00680 {
00681 struct in_addr v;
00682 int rv;
00683 int (*f)(ipmi_lan_config_t *l, unsigned int sel,
00684 unsigned char *v, unsigned int *dl) = func;
00685 unsigned int len = sizeof(v);
00686
00687 rv = f(lanc, sel, (unsigned char *) &v, &len);
00688 if (!rv)
00689 ipmi_cmdlang_out_ip(cmd_info, name, &v);
00690 }
00691 static ulp_item_t lp_uip = {uset_ip, uout_ip};
00692
00693 static void
00694 uset_mac(ipmi_cmd_info_t *cmd_info, int sel, char *val,
00695 ipmi_lan_config_t *lanc, void *func)
00696 {
00697 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00698 int (*f)(ipmi_lan_config_t *l, unsigned int sel,
00699 unsigned char *v, unsigned int dl) = func;
00700 unsigned char v[6];
00701
00702 ipmi_cmdlang_get_mac(val, v, cmd_info);
00703 if (!cmdlang->err) {
00704 cmdlang->err = f(lanc, sel, v, sizeof(v));
00705 if (cmdlang->err) {
00706 cmdlang->errstr = "Error setting parameter";
00707 }
00708 }
00709 }
00710 static void
00711 uout_mac(ipmi_cmd_info_t *cmd_info, int sel, char *name,
00712 ipmi_lan_config_t *lanc, void *func)
00713 {
00714 unsigned char v[6];
00715 int rv;
00716 int (*f)(ipmi_lan_config_t *l, unsigned int sel,
00717 unsigned char *v, unsigned int *dl) = func;
00718 unsigned int len = sizeof(v);
00719
00720 rv = f(lanc, sel, v, &len);
00721 if (!rv)
00722 ipmi_cmdlang_out_mac(cmd_info, name, v);
00723 }
00724 static ulp_item_t lp_umac = {uset_mac, uout_mac};
00725
00726 static struct ulps_s alps[] =
00727 {
00728 F(alert_ack, ubool),
00729 F(dest_type, uint),
00730 F(alert_retry_interval, uint),
00731 F(max_alert_retries, uint),
00732 F(dest_format, uint),
00733 F(gw_to_use, uint),
00734 F(dest_ip_addr, uip),
00735 F(dest_mac_addr, umac),
00736 F(dest_vlan_tag_type, uint),
00737 F(dest_vlan_tag, uint),
00738 { NULL }
00739 };
00740
00741 static struct ulps_s clps[] =
00742 {
00743 F(cipher_suite_entry, uint),
00744 F(max_priv_for_cipher_suite, uint),
00745 { NULL }
00746 };
00747
00748 static char *user_names[5] =
00749 { "callback", "user", "operator", "admin", "oem" };
00750
00751 static void
00752 config_info(ipmi_cmd_info_t *cmd_info, ipmi_lan_config_t *config)
00753 {
00754 int i;
00755 int user;
00756 int num;
00757
00758
00759 for (i=0; lps[i].name; i++) {
00760 lp_item_t *lp = lps[i].lpi;
00761 lp->out(cmd_info, lps[i].name, config, lps[i].get_func);
00762 }
00763
00764
00765 for (user=0; user<5; user++) {
00766 ipmi_cmdlang_out(cmd_info, "User", NULL);
00767 ipmi_cmdlang_down(cmd_info);
00768 ipmi_cmdlang_out(cmd_info, "Name", user_names[user]);
00769 for (i=0; ulps[i].name; i++) {
00770 ulp_item_t *lp = ulps[i].lpi;
00771 lp->out(cmd_info, user, ulps[i].name, config, ulps[i].get_func);
00772 }
00773 ipmi_cmdlang_up(cmd_info);
00774 }
00775
00776
00777 num = ipmi_lanconfig_get_num_alert_destinations(config);
00778 for (user=0; user<num; user++) {
00779 ipmi_cmdlang_out(cmd_info, "Alert Destination", NULL);
00780 ipmi_cmdlang_down(cmd_info);
00781 ipmi_cmdlang_out_int(cmd_info, "Number", user);
00782 for (i=0; alps[i].name; i++) {
00783 ulp_item_t *lp = alps[i].lpi;
00784 lp->out(cmd_info, user, alps[i].name, config, alps[i].get_func);
00785 }
00786 ipmi_cmdlang_up(cmd_info);
00787 }
00788
00789
00790 num = ipmi_lanconfig_get_num_cipher_suites(config);
00791 for (user=0; user<num; user++) {
00792 ipmi_cmdlang_out(cmd_info, "Cipher Suite", NULL);
00793 ipmi_cmdlang_down(cmd_info);
00794 ipmi_cmdlang_out_int(cmd_info, "Number", user);
00795 for (i=0; clps[i].name; i++) {
00796 ulp_item_t *lp = clps[i].lpi;
00797 lp->out(cmd_info, user, clps[i].name, config, clps[i].get_func);
00798 }
00799 ipmi_cmdlang_up(cmd_info);
00800 }
00801 }
00802
00803 static void
00804 lanparm_config_get_done(ipmi_lanparm_t *lanparm,
00805 int err,
00806 ipmi_lan_config_t *config,
00807 void *cb_data)
00808 {
00809 ipmi_cmd_info_t *cmd_info = cb_data;
00810 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00811 char lanparm_name[IPMI_LANPARM_NAME_LEN];
00812 lan_config_info_t *info;
00813
00814 ipmi_cmdlang_lock(cmd_info);
00815 if (err) {
00816 cmdlang->errstr = "Error getting LANPARM";
00817 cmdlang->err = err;
00818 goto out;
00819 }
00820
00821 ipmi_lanparm_get_name(lanparm, lanparm_name, sizeof(lanparm_name));
00822
00823 info = ipmi_mem_alloc(sizeof(*info));
00824 if (!info) {
00825 cmdlang->errstr = "Out of memory";
00826 cmdlang->err = ENOMEM;
00827 ipmi_lan_free_config(config);
00828 goto out;
00829 }
00830 snprintf(info->name, sizeof(info->name), "%s.%u",
00831 lanparm_name, unique_num);
00832 info->config = config;
00833 if (!locked_list_add(lancs, info, NULL)) {
00834 cmdlang->errstr = "Out of memory";
00835 cmdlang->err = ENOMEM;
00836 ipmi_lan_free_config(config);
00837 ipmi_mem_free(info);
00838 goto out;
00839 }
00840 unique_num++;
00841
00842 ipmi_cmdlang_out(cmd_info, "LANPARM Config", NULL);
00843 ipmi_cmdlang_down(cmd_info);
00844 ipmi_cmdlang_out(cmd_info, "Name", info->name);
00845 config_info(cmd_info, config);
00846 ipmi_cmdlang_up(cmd_info);
00847
00848 out:
00849 if (cmdlang->err) {
00850 ipmi_lanparm_get_name(lanparm, cmdlang->objstr,
00851 cmdlang->objstr_len);
00852 cmdlang->location = "cmd_lanparm.c(lanparm_config_get_done)";
00853 }
00854 ipmi_cmdlang_unlock(cmd_info);
00855 ipmi_cmdlang_cmd_info_put(cmd_info);
00856 }
00857
00858 static void
00859 lanparm_config_get(ipmi_lanparm_t *lanparm, void *cb_data)
00860 {
00861 ipmi_cmd_info_t *cmd_info = cb_data;
00862 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00863 int rv;
00864
00865 ipmi_cmdlang_cmd_info_get(cmd_info);
00866 rv = ipmi_lan_get_config(lanparm, lanparm_config_get_done, cmd_info);
00867 if (rv) {
00868 ipmi_lanparm_get_name(lanparm, cmdlang->objstr,
00869 cmdlang->objstr_len);
00870 ipmi_cmdlang_cmd_info_put(cmd_info);
00871 cmdlang->errstr = "Error getting LANPARM";
00872 cmdlang->err = rv;
00873 cmdlang->location = "cmd_lanparm.c(lanparm_config_get)";
00874 }
00875 }
00876
00877 typedef struct lp_config_op_s
00878 {
00879 char name[LAN_CONFIG_NAME_LEN];
00880 ipmi_cmd_info_t *cmd_info;
00881 } lp_config_op_t;
00882
00883 static void
00884 lanparm_config_set_done(ipmi_lanparm_t *lanparm,
00885 int err,
00886 void *cb_data)
00887 {
00888 lp_config_op_t *info = cb_data;
00889 ipmi_cmd_info_t *cmd_info = info->cmd_info;
00890 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00891
00892 ipmi_cmdlang_lock(cmd_info);
00893 if (err) {
00894 ipmi_lanparm_get_name(lanparm, cmdlang->objstr,
00895 cmdlang->objstr_len);
00896 cmdlang->errstr = "Error setting LANPARM";
00897 cmdlang->err = err;
00898 cmdlang->location = "cmd_lanparm.c(lanparm_config_set_done)";
00899 goto out;
00900 }
00901
00902 ipmi_cmdlang_out(cmd_info, "LANPARM config set", info->name);
00903
00904 out:
00905 ipmi_mem_free(info);
00906 ipmi_cmdlang_unlock(cmd_info);
00907 ipmi_cmdlang_cmd_info_put(cmd_info);
00908 }
00909
00910 static void
00911 lanparm_config_set(ipmi_lanparm_t *lanparm, void *cb_data)
00912 {
00913 ipmi_cmd_info_t *cmd_info = cb_data;
00914 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00915 int rv;
00916 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00917 int argc = ipmi_cmdlang_get_argc(cmd_info);
00918 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00919 ipmi_lan_config_t *lanc;
00920 lp_config_op_t *info = cb_data;
00921 char *name;
00922
00923 if ((argc - curr_arg) < 1) {
00924
00925 cmdlang->errstr = "Not enough parameters";
00926 cmdlang->err = EINVAL;
00927 goto out_err;
00928 }
00929
00930 name = argv[curr_arg];
00931 curr_arg++;
00932
00933 lanc = find_config(name, 0);
00934 if (!lanc) {
00935 cmdlang->errstr = "Invalid LAN config";
00936 cmdlang->err = EINVAL;
00937 goto out_err;
00938 }
00939
00940 info = ipmi_mem_alloc(sizeof(*info));
00941 if (!info) {
00942 cmdlang->errstr = "Out of memory";
00943 cmdlang->err = ENOMEM;
00944 goto out_err;
00945 }
00946 info->cmd_info = cmd_info;
00947 strncpy(info->name, name, sizeof(info->name));
00948
00949 ipmi_cmdlang_cmd_info_get(cmd_info);
00950 rv = ipmi_lan_set_config(lanparm, lanc, lanparm_config_set_done, info);
00951 if (rv) {
00952 ipmi_cmdlang_cmd_info_put(cmd_info);
00953 cmdlang->errstr = "Error setting LANPARM";
00954 cmdlang->err = rv;
00955 ipmi_mem_free(info);
00956 goto out_err;
00957 }
00958
00959 return;
00960
00961 out_err:
00962 ipmi_lanparm_get_name(lanparm, cmdlang->objstr,
00963 cmdlang->objstr_len);
00964 cmdlang->location = "cmd_lanparm.c(lanparm_config_set)";
00965 }
00966
00967 static void
00968 lanparm_config_unlock_done(ipmi_lanparm_t *lanparm,
00969 int err,
00970 void *cb_data)
00971 {
00972 lp_config_op_t *info = cb_data;
00973 ipmi_cmd_info_t *cmd_info = info->cmd_info;
00974 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00975
00976 ipmi_cmdlang_lock(cmd_info);
00977 if (err) {
00978 ipmi_lanparm_get_name(lanparm, cmdlang->objstr,
00979 cmdlang->objstr_len);
00980 cmdlang->errstr = "Error unlocking LANPARM";
00981 cmdlang->err = err;
00982 cmdlang->location = "cmd_lanparm.c(lanparm_config_unlock_done)";
00983 goto out;
00984 }
00985
00986 ipmi_cmdlang_out(cmd_info, "LANPARM config unlocked", info->name);
00987
00988 out:
00989 ipmi_mem_free(info);
00990 ipmi_cmdlang_unlock(cmd_info);
00991 ipmi_cmdlang_cmd_info_put(cmd_info);
00992 }
00993
00994 static void
00995 lanparm_config_unlock(ipmi_lanparm_t *lanparm, void *cb_data)
00996 {
00997 ipmi_cmd_info_t *cmd_info = cb_data;
00998 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00999 int rv;
01000 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
01001 int argc = ipmi_cmdlang_get_argc(cmd_info);
01002 char **argv = ipmi_cmdlang_get_argv(cmd_info);
01003 ipmi_lan_config_t *lanc;
01004 lp_config_op_t *info = cb_data;
01005 char *name;
01006
01007 if ((argc - curr_arg) < 1) {
01008
01009 cmdlang->errstr = "Not enough parameters";
01010 cmdlang->err = EINVAL;
01011 goto out_err;
01012 }
01013
01014 name = argv[curr_arg];
01015 curr_arg++;
01016 lanc = find_config(name, 0);
01017 if (!lanc) {
01018 cmdlang->errstr = "Invalid LAN config";
01019 cmdlang->err = EINVAL;
01020 goto out_err;
01021 }
01022
01023 info = ipmi_mem_alloc(sizeof(*info));
01024 if (!info) {
01025 cmdlang->errstr = "Out of memory";
01026 cmdlang->err = ENOMEM;
01027 goto out_err;
01028 }
01029 info->cmd_info = cmd_info;
01030 strncpy(info->name, name, sizeof(info->name));
01031
01032 ipmi_cmdlang_cmd_info_get(cmd_info);
01033 rv = ipmi_lan_clear_lock(lanparm, lanc, lanparm_config_unlock_done, info);
01034 if (rv) {
01035 ipmi_cmdlang_cmd_info_put(cmd_info);
01036 cmdlang->errstr = "Error getting LANPARM";
01037 cmdlang->err = rv;
01038 ipmi_mem_free(info);
01039 goto out_err;
01040 }
01041
01042 return;
01043
01044 out_err:
01045 ipmi_lanparm_get_name(lanparm, cmdlang->objstr,
01046 cmdlang->objstr_len);
01047 cmdlang->location = "cmd_lanparm.c(lanparm_config_unlock)";
01048 }
01049
01050 static void
01051 lanparm_config_close(ipmi_cmd_info_t *cmd_info)
01052 {
01053 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
01054 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
01055 int argc = ipmi_cmdlang_get_argc(cmd_info);
01056 char **argv = ipmi_cmdlang_get_argv(cmd_info);
01057 ipmi_lan_config_t *lanc;
01058 char *lanc_name;
01059
01060 if ((argc - curr_arg) < 1) {
01061
01062 cmdlang->errstr = "Not enough parameters";
01063 cmdlang->err = EINVAL;
01064 lanc_name = "";
01065 goto out_err;
01066 }
01067