Hello,

I have been working on OEM LED controls with the IPMI plugin and
discovered some errors in handling colors.

The CtrlRec.Num field for the LED needs to be set to the "well-defined"
number in the SAIM-HPI-B.01.01-ATCA spec.

Also the ATCAHPI_LED_<color> defines are used in a few places where it
should be the ATCAHPI_LED_COLOR_<color> defines and the test for the
supported color needs to be more explicit since the bit test as
currently implemented does not work; the values being used are not bit
fields so a bit test is inappropriate.

A patch is below for comments.

Regards,
Drew Moseley

diff -rub openhpi-2.8.1-clean/plugins/ipmi/ipmi_control_event.c 
openhpi-2.8.1/plugins/ipmi/ipmi_control_event.c
--- openhpi-2.8.1-clean/plugins/ipmi/ipmi_control_event.c       2007-08-03 
10:34:54.000000000 -0700
+++ openhpi-2.8.1/plugins/ipmi/ipmi_control_event.c     2007-08-03 
10:35:34.000000000 -0700
@@ -80,7 +80,7 @@
                return ATCAHPI_LED_COLOR_ORANGE;
        default:
                dbg("strange color %d, return WHITE", ipmi_color);
-               return ATCAHPI_LED_WHITE;
+               return ATCAHPI_LED_COLOR_WHITE;
        }
 }
 
@@ -381,7 +381,29 @@
                 dbg("No info in resource(%d)\n", rid);
                 return 1;
         }
-        rdr.RdrTypeUnion.CtrlRec.Num = ++info->ctrl_count;
+       if (strcasecmp((char *)rdr.IdString.Data, "blue led") == 0) {
+               rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_BLUE_LED;
+       } else if (strcasecmp((char *)rdr.IdString.Data, "led 1") == 0) {
+               rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED1;
+       } else if (strcasecmp((char *)rdr.IdString.Data, "led 2") == 0) {
+               rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED2;
+       } else if (strcasecmp((char *)rdr.IdString.Data, "led 3") == 0) {
+               rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED3;
+       } else if (strcasestr((char *)rdr.IdString.Data, "application-specific 
led ") ==
+                  (char *)rdr.IdString.Data) {
+               char *appnum = 
+                       (char *)&rdr.IdString.Data[strlen("application-specific 
led ")];
+               if (strlen(appnum) <= 3) {
+                       rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_APP_LED 
+
+                               strtoul(appnum, NULL, 0);
+               } else {
+                       dbg("Invalid data in LED Control\n");
+                       return 1;
+               }
+       } else {
+               dbg("Invalid data in LED Control\n");
+               return 1;
+       }
 
         rid = oh_uid_lookup(&rdr.Entity);
         
diff -rub openhpi-2.8.1-clean/plugins/ipmi/ipmi_controls.c 
openhpi-2.8.1/plugins/ipmi/ipmi_controls.c
--- openhpi-2.8.1-clean/plugins/ipmi/ipmi_controls.c    2007-08-03 
10:34:54.000000000 -0700
+++ openhpi-2.8.1/plugins/ipmi/ipmi_controls.c  2007-08-03 11:02:26.000000000 
-0700
@@ -543,6 +543,44 @@
        }
 }
 
+/**
+ * is_supported_color
+ * @hpi_color: HPI Color to test if supported
+ * @rdr: RDR object containing control record for LED.
+ *
+ * Check if hpi_color is supported by the LED associated with rdr.
+ *
+ * Return value: 0 if color is supported, 1 otherwise.
+ **/
+static int is_supported_color(AtcaHpiLedColorT hpi_color, 
+                             SaHpiRdrT *rdr)
+{
+       AtcaHpiColorCapabilitiesT supported_colors = 
rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.ConfigData[0];
+
+       switch(hpi_color)
+       {
+               case ATCAHPI_LED_COLOR_BLUE:
+                       return ((supported_colors & ATCAHPI_LED_BLUE) != 0);
+               case ATCAHPI_LED_COLOR_RED:
+                       return ((supported_colors & ATCAHPI_LED_RED) != 0);
+               case ATCAHPI_LED_COLOR_GREEN:
+                       return ((supported_colors & ATCAHPI_LED_GREEN) != 0);
+               case ATCAHPI_LED_COLOR_AMBER:
+                       return ((supported_colors & ATCAHPI_LED_AMBER) != 0);
+               case ATCAHPI_LED_COLOR_ORANGE:
+                       return ((supported_colors & ATCAHPI_LED_ORANGE) != 0);
+               case ATCAHPI_LED_COLOR_WHITE:
+                       return ((supported_colors & ATCAHPI_LED_WHITE) != 0);
+               case ATCAHPI_LED_COLOR_NO_CHANGE:
+                       return 1;
+               case ATCAHPI_LED_COLOR_USE_DEFAULT:
+                       return 1;
+               case ATCAHPI_LED_COLOR_RESERVED:
+                       return 0;
+       }
+
+       return 0;
+}
 
 SaErrorT orig_set_control_state(struct oh_handler_state *handler,
                                 struct ohoi_control_info *c,
@@ -577,7 +615,7 @@
                                /* exactly one color must be set */
                                return SA_ERR_HPI_INVALID_DATA;
                        }
-                       if (!(body[2] & 
rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.ConfigData[0])) {
+                       if (!is_supported_color(body[2], rdr)) {
                                /* LED doesn't support this color */
                                return SA_ERR_HPI_INVALID_DATA;
                        }

-- 
mailto:[EMAIL PROTECTED]



-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Openhpi-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openhpi-devel

Reply via email to