Cory,
Just an idea. In PICMG HPM.2 we added that capability to use 255 serial
ports per IPM Controller and and can query the name of each.
Only 14(might be +1/-1) are allowed active per IPMI at one time. Maybe the
sytanx should allow for mapping X to Y where X is an active IPMI SOL
session(one of 14) and Y is one of the 255.
http://www.jblade.com/products/hemi/hpm2/sol/Hpm2SolOverview.jsf
Hank Bruning

On Fri, Mar 22, 2013 at 9:40 AM, Corey Minyard <tcminy...@gmail.com> wrote:

> The SOL protocol supports multiple serial ports using the "instance",
> allow this to be passed in to ipmitool.
>
> 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    22 Mar 2013 13:33:41 -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    22 Mar 2013 13:33:42 -0000
> @@ -1292,7 +1292,7 @@
>    * 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;
> @@ -1305,8 +1305,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 +1533,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 +1679,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 +1689,7 @@
>           exit(1);
>       }
>       else
> -        ipmi_sol_deactivate(intf);
> +        ipmi_sol_deactivate(intf, instance);
>
>       return 0;
>   }
> @@ -1701,7 +1701,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;
> @@ -1737,7 +1738,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 +1844,7 @@
>
>       if(looptest == 1)
>       {
> -        ipmi_sol_deactivate(intf);
> +        ipmi_sol_deactivate(intf, instance);
>           usleep(interval*1000);
>           return 0;
>       }
> @@ -1854,7 +1855,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,8 +1875,8 @@
>       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, "              activate
> [<usesolkeepalive|nokeepalive>] [instance=<number>]");
> +    lprintf(LOG_NOTICE, "              deactivate [instance=<number>]");
>       lprintf(LOG_NOTICE, "              looptest [<loop times>] [<loop
> interval(in ms)>]");
>   }
>
> @@ -2029,32 +2030,60 @@
>        * Activate
>        */
>        else if (!strncmp(argv[0], "activate", 8)) {
> +        int i;
> +        unsigned int 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)) {
> +                char *end;
> +                instance = strtoul(argv[i] + 9, &end, 0);
> +                if (*end != 0 || instance == 0 || instance > 15)
> +                {
> +                    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;
> +        unsigned int instance = 1;
> +
> +        for (i = 1; i < argc; i++) {
> +            if (!strncmp(argv[i], "instance=", 9)) {
> +                char *end;
> +                instance = strtoul(argv[i] + 9, &end, 0);
> +                if (*end != 0 || instance == 0 || instance > 15)
> +                {
> +                    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
> @@ -2083,7 +2112,7 @@
>           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, 1);
>               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
>
------------------------------------------------------------------------------
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