On Mon, Mar 25, 2013 at 5:01 PM, Corey Minyard <[email protected]> wrote:
> On 03/25/2013 05:29 AM, Zdenek Styblik wrote:
>>
>> On Mon, Mar 25, 2013 at 10:16 AM, Zdenek Styblik
>> <[email protected]> wrote:
>>>
>>> On Fri, Mar 22, 2013 at 2:40 PM, Corey Minyard <[email protected]>
>>> wrote:
>>>>
>>>> The SOL protocol supports multiple serial ports using the "instance",
>>>> allow this to be passed in to ipmitool.
>>>>
>>> Corey,
>>>
>>> please, use str2*() functions from 'lib/helper.c' rather than
>>> strtol(). Unless this is fixed, I'm against getting this one into CVS.
>>> Is it really necessary to use 'unsigned int' for 'instance' since its
>>> range is only <1..15>, resp. <1..255>? Wouldn't it be sufficient to
>>> use 'uint8_t'?
>>> Would it be possible to use int types from 'stdint.h'?
>
>
> Well, yes, but that can often lead to subtle bugs and reduced performance.
> It's generally best to use the natural integer unless you really need a
> reduced size.
>
Alright. I guess my drive for saving resources(or lack of experience)
tends to over-do things from time to time.
[...]
>>> ~~~
>>> - retval = ipmi_sol_activate(intf, 1, interval);
>>> + retval = ipmi_sol_activate(intf, 1, interval, 1);
>>> ~~~
>>> Hard-coded instance number to '1'; is this on purpose(just
>>> checking/asking)?
>
>
> Laziness on my part :). I can fix that. The UI for that particular option
> is, well, not ideal, and that's why I didn't fix this at first.
>
I wasn't sure whether this was on purpose or bug. It's better to ask
sooner than later ;)
Anyway, I'm ok with proposed changes. Please, send me the diff file
and I'll commit it. I don't like to scrape diffs off the e-mail.
Thanks,
Z.
> -corey
>
>
>>> Best regards,
>>> Z.
>>>
>> Ignore previous e-mail as it had 'instance > 14' in it which is wrong.
>> I don't know why I put '14' there.
>>
>> One more thing. I think this check ``if (instance < 1 || instance >
>> 15) { /* Error */ }'' should be moved into ipmi_sol_activate(), resp.
>> ipmi_sol_deactivate() or perhaps even create new function(wrapper) for
>> it.
>
>
> Yes, that's a good idea. New patch is appended:
>
> -corey
>
>
> Index: doc/ipmitool.1
> ===================================================================
> RCS file: /cvsroot/ipmitool/ipmitool/doc/ipmitool.1,v
> retrieving revision 1.50
> diff -u -r1.50 ipmitool.1
> --- doc/ipmitool.1 5 Sep 2012 14:22:36 -0000 1.50
> +++ doc/ipmitool.1 25 Mar 2013 15:56:51 -0000
>
> @@ -2586,7 +2586,7 @@
> by the IPMI over serial channel.
> .RE
> .TP
> -\fIactivate\fP [\fIusesolkeepalive\fP | \fInokeepalive\fP]
> +\fIactivate\fP [\fIusesolkeepalive\fP | \fInokeepalive\fP]
> [\fIinstance=<number>\fP]
> .br
>
> Causes ipmitool to enter Serial Over LAN
> @@ -2596,6 +2596,9 @@
> sent to the serial console on the remote server.
> On exit,the the SOL payload mode is deactivated and
> the terminal is reset to its original settings.
> +
> +If the instance is given, it will activate using the given instance
> +number. The default is 1.
> .RS
>
> Special escape sequences are provided to control the SOL session:
> @@ -2617,7 +2620,7 @@
> Note that escapes are only recognized immediately after newline.
> .RE
> .TP
> -\fIdeactivate\fP
> +\fIdeactivate\fP [\fIinstance=<number>\fP]
> .br
>
> Deactivates Serial Over LAN mode on the BMC.
> @@ -2625,6 +2628,9 @@
> this command to be sent to the BMC, but in the case of an
> unintentional exit from SOL mode, this command may be
> necessary to reset the state of the BMC.
> +
> +If the instance is given, it will deactivate the given instance
> +number. The default is 1.
> .RE
> .TP
> \fIspd\fP <\fBi2cbus\fR> <\fBi2caddr\fR> [<\fBchannel\fR>] [<\fmaxread\fR>]
> Index: lib/ipmi_sol.c
> ===================================================================
> RCS file: /cvsroot/ipmitool/ipmitool/lib/ipmi_sol.c,v
> retrieving revision 1.62
> diff -u -r1.62 ipmi_sol.c
> --- lib/ipmi_sol.c 18 Jan 2013 12:37:27 -0000 1.62
> +++ lib/ipmi_sol.c 25 Mar 2013 15:56:51 -0000
> @@ -1292,12 +1292,18 @@
>
> * ipmi_sol_deactivate
> */
> static int
> -ipmi_sol_deactivate(struct ipmi_intf * intf)
> +ipmi_sol_deactivate(struct ipmi_intf * intf, int instance)
> {
> struct ipmi_rs * rsp;
> struct ipmi_rq req;
> uint8_t data[6];
>
> + if ((instance <= 0) || (instance > 15))
> + {
> + lprintf(LOG_ERR, "Error: Instance must range from 1 to 15");
>
> + return -1;
> + }
> +
> memset(&req, 0, sizeof(req));
> req.msg.netfn = IPMI_NETFN_APP;
> req.msg.cmd = IPMI_DEACTIVATE_PAYLOAD;
> @@ -1305,8 +1311,8 @@
>
> req.msg.data = data;
>
> bzero(data, sizeof(data));
> - data[0] = IPMI_PAYLOAD_TYPE_SOL; /* payload type */
> - data[1] = 1; /* payload instance. Guess! */
> + data[0] = IPMI_PAYLOAD_TYPE_SOL; /* payload type */
> + data[1] = instance; /* payload instance. */
>
> /* Lots of important data */
> data[2] = 0;
> @@ -1533,7 +1539,7 @@
>
> * ipmi_sol_red_pill
> */
> static int
> -ipmi_sol_red_pill(struct ipmi_intf * intf)
> +ipmi_sol_red_pill(struct ipmi_intf * intf, int instance)
> {
> char * buffer;
> int numRead;
> @@ -1679,7 +1685,7 @@
>
> {
> lprintf(LOG_ERR, "Error: No response to keepalive - Terminating
> session");
> /* attempt to clean up anyway */
> - ipmi_sol_deactivate(intf);
> + ipmi_sol_deactivate(intf, instance);
> exit(1);
> }
>
> @@ -1689,7 +1695,7 @@
>
> exit(1);
> }
> else
> - ipmi_sol_deactivate(intf);
> + ipmi_sol_deactivate(intf, instance);
>
> return 0;
> }
> @@ -1701,7 +1707,8 @@
>
> * ipmi_sol_activate
> */
> static int
> -ipmi_sol_activate(struct ipmi_intf * intf, int looptest, int interval)
> +ipmi_sol_activate(struct ipmi_intf * intf, int looptest, int interval,
> + int instance)
> {
> struct ipmi_rs * rsp;
> struct ipmi_rq req;
> @@ -1721,6 +1728,12 @@
> return -1;
> }
>
> + if ((instance <= 0) || (instance > 15))
> + {
> + lprintf(LOG_ERR, "Error: Instance must range from 1 to 15");
>
> + return -1;
> + }
> +
>
> /*
> * Setup a callback so that the lanplus processing knows what
> @@ -1737,7 +1750,7 @@
>
> req.msg.data = data;
>
> data[0] = IPMI_PAYLOAD_TYPE_SOL; /* payload type */
> - data[1] = 1; /* payload instance */
> + data[1] = instance; /* payload instance */
>
> /* Lots of important data. Most is default */
> data[2] = bSolEncryption? 0x80 : 0;
> @@ -1843,7 +1856,7 @@
>
>
> if(looptest == 1)
> {
> - ipmi_sol_deactivate(intf);
> + ipmi_sol_deactivate(intf, instance);
> usleep(interval*1000);
> return 0;
> }
> @@ -1854,7 +1867,7 @@
>
> * 1) STDIN for user input
> * 2) The FD for incoming SOL packets
> */
> - if (ipmi_sol_red_pill(intf))
> + if (ipmi_sol_red_pill(intf, instance))
> {
> lprintf(LOG_ERR, "Error in SOL session");
> return -1;
> @@ -1874,9 +1887,9 @@
>
> lprintf(LOG_NOTICE, "SOL Commands: info [<channel number>]");
> lprintf(LOG_NOTICE, " set <parameter> <value> [channel]");
> lprintf(LOG_NOTICE, " payload <enable|disable|status>
> [channel] [userid]");
> - lprintf(LOG_NOTICE, " activate
> [<usesolkeepalive|nokeepalive>]");
> - lprintf(LOG_NOTICE, " deactivate");
> - lprintf(LOG_NOTICE, " looptest [<loop times>] [<loop
> interval(in ms)>]");
>
> + lprintf(LOG_NOTICE, " activate
> [<usesolkeepalive|nokeepalive>] [instance=<number>]");
> + lprintf(LOG_NOTICE, " deactivate [instance=<number>]");
> + lprintf(LOG_NOTICE, " looptest [<loop times> [<loop
> interval(in ms)> [<instance>]]]");
> }
>
>
> @@ -2029,32 +2042,54 @@
>
> * Activate
> */
> else if (!strncmp(argv[0], "activate", 8)) {
> + int i;
> + uint8_t instance = 1;
>
>
> - if (argc > 2) {
> - print_sol_usage();
> - return -1;
> - }
> -
> - if (argc == 2) {
> - if (!strncmp(argv[1], "usesolkeepalive", 15))
> + for (i = 1; i < argc; i++) {
> + if (!strncmp(argv[i], "usesolkeepalive", 15))
> _use_sol_for_keepalive = 1;
> - else if (!strncmp(argv[1], "nokeepalive", 11))
> + else if (!strncmp(argv[i], "nokeepalive", 11))
> _disable_keepalive = 1;
> - else {
> + else if (!strncmp(argv[i], "instance=", 9)) {
> + if (str2uchar(argv[i] + 9, &instance) != 0) {
>
> + lprintf(LOG_ERR,
> + "instance invalid: '%s'",
> + argv[i] + 9);
> + print_sol_usage();
> + return -1;
> + }
> + } else {
> print_sol_usage();
> return -1;
> }
> }
> - retval = ipmi_sol_activate(intf, 0, 0);
> + retval = ipmi_sol_activate(intf, 0, 0, instance);
> }
>
>
> /*
> * Dectivate
> */
> - else if (!strncmp(argv[0], "deactivate", 10))
> - retval = ipmi_sol_deactivate(intf);
> -
> + else if (!strncmp(argv[0], "deactivate", 10)) {
> + int i;
> + uint8_t instance = 1;
>
> +
> + for (i = 1; i < argc; i++) {
> + if (!strncmp(argv[i], "instance=", 9)) {
> + if (str2uchar(argv[i] + 9, &instance) != 0) {
>
> + lprintf(LOG_ERR,
> + "instance invalid: '%s'",
> + argv[i] + 9);
> + print_sol_usage();
> + return -1;
> + }
> + } else {
> + print_sol_usage();
> + return -1;
> + }
> + }
> + retval = ipmi_sol_deactivate(intf, instance);
> + }
>
> /*
> * SOL loop test: Activate and then Dectivate
> @@ -2063,8 +2098,9 @@
> {
> int cnt = 200;
> int interval = 100; /* Unit is: ms */
> + uint8_t instance;
>
> - if (argc > 3)
> + if (argc > 4)
> {
> print_sol_usage();
> return -1;
> @@ -2074,16 +2110,25 @@
> cnt = strtol(argv[1], NULL, 10);
> if(cnt <= 0) cnt = 200;
> }
> - if (argc == 3)
> + if (argc >= 3)
> {
> interval = strtol(argv[2], NULL, 10);
> if(interval < 0) interval = 0;
> }
> + if (argc >= 4)
> + {
> + if (str2uchar(argv[3], &instance) != 0) {
> + lprintf(LOG_ERR, "instance invalid: '%s'",
> + argv[3]);
>
> + print_sol_usage();
> + return -1;
> + }
> + }
>
> while (cnt > 0)
> {
> printf("remain loop test counter: %d\n", cnt);
> - retval = ipmi_sol_activate(intf, 1, interval);
> + retval = ipmi_sol_activate(intf, 1, interval, instance);
>
> if (retval)
> {
> printf("SOL looptest failed: %d\n", retval);
>
------------------------------------------------------------------------------
Own the Future-Intel® Level Up Game Demo Contest 2013
Rise to greatness in Intel's independent game demo contest.
Compete for recognition, cash, and the chance to get your game
on Steam. $5K grand prize plus 10 genre and skill prizes.
Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d
_______________________________________________
Ipmitool-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel