Main Page | Class List | Directories | File List | Class Members | File Members

cmd_lanparm.c

Go to the documentation of this file.
00001 /*
00002  * cmd_lanparm.c
00003  *
00004  * A command interpreter for OpenIPMI
00005  *
00006  * Author: MontaVista Software, Inc.
00007  *         Corey Minyard <minyard@mvista.com>
00008  *         source@mvista.com
00009  *
00010  * Copyright 2004 MontaVista Software Inc.
00011  *
00012  *  This program is free software; you can redistribute it and/or
00013  *  modify it under the terms of the GNU Lesser General Public License
00014  *  as published by the Free Software Foundation; either version 2 of
00015  *  the License, or (at your option) any later version.
00016  *
00017  *
00018  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
00019  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00020  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00021  *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00022  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00023  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
00024  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00025  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
00026  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
00027  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00028  *
00029  *  You should have received a copy of the GNU Lesser General Public
00030  *  License along with this program; if not, write to the Free
00031  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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 /* Internal includes, do not use in your programs */
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         /* Not enough parameters */
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 /* read-only */
00528 #define FR(name, type) { #name, &lp_ ## type, ipmi_lanconfig_get_ ## name, \
00529                          NULL }
00530 /* Writable */
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  * per-user items
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  * per-alert-dest items
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     /* Basic items */
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     /* per-user items */
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     /* per-destination items */
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     /* per-cipher-suite items */
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         /* Not enough parameters */
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         /* Not enough parameters */
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         /* Not enough parameters */
01062         cmdlang->errstr = "Not enough parameters";
01063         cmdlang->err = EINVAL;
01064         lanc_name = "";
01065         goto out_err;
01066     }
01067