On 03/25/2013 05:29 AM, Zdenek Styblik wrote:
> On Mon, Mar 25, 2013 at 10:16 AM, Zdenek Styblik
> <zdenek.styb...@gmail.com> wrote:
>> On Fri, Mar 22, 2013 at 2:40 PM, Corey Minyard <tcminy...@gmail.com> 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.

Plus, nothing else in that code works the way you suggest, so I was just 
following style.   Using unsigned was probably a mistake, as it was 
passed signed into the function.  The way you suggest is certainly 
better than what is already there, though, so I'll make the change.

>>
>> ~~~
>> -            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.

-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);


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to