diff options
author | Chris Austen <austenc@us.ibm.com> | 2015-10-13 12:43:27 -0500 |
---|---|---|
committer | Chris Austen <austenc@us.ibm.com> | 2015-10-13 12:43:27 -0500 |
commit | ac4604a2f709b228def4dbc9706d31f0b62ae9cb (patch) | |
tree | 6844f91e1d9633e29133ae8228751a6377cedc8f | |
parent | 6caf28bd4653890dedfaf8179b68eb2262b96ff0 (diff) | |
download | phosphor-host-ipmid-ac4604a2f709b228def4dbc9706d31f0b62ae9cb.tar.gz phosphor-host-ipmid-ac4604a2f709b228def4dbc9706d31f0b62ae9cb.zip |
Add sensor ipmi commands
-rwxr-xr-x | Makefile | 12 | ||||
-rw-r--r-- | sensorhandler.C | 213 | ||||
-rw-r--r-- | sensorhandler.h | 13 |
3 files changed, 233 insertions, 5 deletions
@@ -1,20 +1,22 @@ CXX ?= $(CROSS_COMPILE)g++ DAEMON = ipmid -DAEMON_OBJ = $(DAEMON).o -LIB_OBJ = apphandler.o -LIBS = libapphandler.so +DAEMON_OBJ = $(DAEMON).o +LIB_APP_OBJ = apphandler.o \ + sensorhandler.o \ + +LIB_APP = libapphandler.so INC_FLAG += $(shell pkg-config --cflags --libs libsystemd) -I. -O2 --std=gnu++11 LIB_FLAG += $(shell pkg-config --libs libsystemd) -rdynamic IPMID_PATH ?= -DHOST_IPMI_LIB_PATH=\"/usr/lib/host-ipmid/\" -all: $(DAEMON) $(LIBS) +all: $(DAEMON) $(LIB_APP) %.o: %.C $(CXX) -fpic -c $< $(CXXFLAGS) $(INC_FLAG) $(IPMID_PATH) -o $@ -$(LIBS): $(LIB_OBJ) +$(LIB_APP): $(LIB_APP_OBJ) $(CXX) $^ -shared $(LDFLAGS) $(LIB_FLAG) -o $@ $(DAEMON): $(DAEMON_OBJ) diff --git a/sensorhandler.C b/sensorhandler.C new file mode 100644 index 0000000..9f0c975 --- /dev/null +++ b/sensorhandler.C @@ -0,0 +1,213 @@ +#include "sensorhandler.h" +#include "ipmid-api.h" +#include <stdio.h> +#include <string.h> +#include <stdint.h> + + +void register_netfn_sen_functions() __attribute__((constructor)); + + +struct sensor_data_t { + uint8_t sennum; +} __attribute__ ((packed)) ; + +unsigned char g_sensortype [][2] = { + {0xc7, 58}, +{0x01, 113}, +{0xc7, 56}, +{0x01, 114}, +{0xc6, 54}, +{0x07, 40}, +{0xC1, 121}, +{0xC2, 137}, +{0x07, 36}, +{0x07, 43}, +{0xC1, 122}, +{0xC1, 119}, +{0x01, 12}, +{0x01, 111}, +{0x01, 116}, +{0xC1, 127}, +{0xC2, 134}, +{0xC2, 130}, +{0xc, 33}, +{0xC1, 125}, +{0x01, 115}, +{0x22, 4}, +{0xC2, 138}, +{0x01, 108}, +{0x01, 102}, +{0xc, 46}, +{0x7, 11}, +{0xC1, 120}, +{0x07, 39}, +{0x07, 42}, +{0x5, 21}, +{0xC2, 131}, +{0xc1, 48}, +{0x12, 53}, +{0xC1, 124}, +{0x01, 117}, +{0xC1, 126}, +{0xf, 5}, +{0x23, 0}, +{0xC2, 139}, +{0x07, 34}, +{0x09, 146}, +{0x02, 178}, +{0xC2, 140}, +{0xC1, 118}, +{0xC2, 133}, +{0x07, 38}, +{0xC2, 143}, +{0x01, 101}, +{0xc3, 9}, +{0x7, 10}, +{0xc2, 51}, +{0x01, 109}, +{0xc, 32}, +{0x7, 8}, +{0xC1, 129}, +{0x01, 112}, +{0x01, 107}, +{0x07, 37}, +{0x07, 44}, +{0x1f, 50}, +{0xC2, 144}, +{0xc7, 52}, +{0xC2, 141}, +{0x01, 106}, +{0x01, 110}, +{0x01, 103}, +{0x9, 28}, +{0x07, 35}, +{0xc7, 55}, +{0x03, 179}, +{0x07, 41}, +{0xc, 30}, +{0x01, 100}, +{0xC1, 128}, +{0xC2, 135}, +{0x01, 105}, +{0x7, 47}, +{0xC2, 145}, +{0xc7, 57}, +{0x01, 104}, +{0x07, 45}, +{0xC2, 132}, +{0xc4, 49}, +{0xC1, 123}, +{0xC2, 142}, +{0x01, 13}, +{0xC2, 136}, +{0xc, 31}, +{0xff,0xff} +}; + + +unsigned char findSensor(char sensor_number) { + + int i=0; + + // TODO : This function should actually call + // a dbus object and have it return the data + // it is not ready yet so use a Palmetto + // based lookup table for now. The g_sensortype + // can be removed once the dbus method exists + while (g_sensortype[i][0] != 0xff) { + if (g_sensortype[i][1] == sensor_number) { + break; + } else { + i++; + } + + } + + return g_sensortype[i][0]; + +} + +ipmi_ret_t ipmi_sen_get_sensor_type(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + ipmi_request_t request, ipmi_response_t response, + ipmi_data_len_t data_len, ipmi_context_t context) +{ + sensor_data_t *reqptr = (sensor_data_t*)request; + ipmi_ret_t rc = IPMI_CC_OK; + + printf("IPMI GET_SENSOR_TYPE [0x%02X]\n",reqptr->sennum); + + // TODO Not sure what the System-event-sensor is suppose to return + // need to ask Hostboot team + unsigned char buf[] = {0x00,0x6F}; + + buf[0] = findSensor(reqptr->sennum); + + *data_len = sizeof(buf); + memcpy(response, &buf, *data_len); + + + + return rc; +} + + + +// TODO: Saves the sensor information to a file in /tmp. This +// will need to change to calling the correct method +// once it exists in the stack. +ipmi_ret_t ipmi_sen_set_sensor(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + ipmi_request_t request, ipmi_response_t response, + ipmi_data_len_t data_len, ipmi_context_t context) +{ + FILE *fp; + char string[16]; + sensor_data_t *reqptr = (sensor_data_t*)request; + ipmi_ret_t rc = IPMI_CC_OK; + unsigned short rlen; + + rlen = (unsigned short) *data_len - 1; + + sprintf(string, "%s%02x", "/tmp/sen", reqptr->sennum); + + printf("IPMI SET_SENSOR [%s]\n",string); + + if ((fp = fopen(string, "wb")) != NULL) { + fwrite(reqptr+1,rlen,1,fp); + fclose(fp); + } else { + fprintf(stderr, "Error trying to write to sensor file %s\n",string); + ipmi_ret_t rc = IPMI_CC_INVALID; + } + + *data_len=0; + + + return rc; +} + +ipmi_ret_t ipmi_sen_wildcard(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + ipmi_request_t request, ipmi_response_t response, + ipmi_data_len_t data_len, ipmi_context_t context) +{ + ipmi_ret_t rc = IPMI_CC_OK; + + printf("IPMI S/E Wildcard Netfn:[0x%X], Cmd:[0x%X]\n",netfn,cmd); + *data_len = 0; + + return rc; +} + + +void register_netfn_sen_functions() +{ + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_SENSOR, IPMI_CMD_WILDCARD); + ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_WILDCARD, NULL, ipmi_sen_wildcard); + + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_SENSOR, IPMI_CMD_GET_SENSOR_TYPE); + ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_GET_SENSOR_TYPE, NULL, ipmi_sen_get_sensor_type); + + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_SENSOR, IPMI_CMD_SET_SENSOR); + ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_SET_SENSOR, NULL, ipmi_sen_set_sensor); + return; +} diff --git a/sensorhandler.h b/sensorhandler.h new file mode 100644 index 0000000..da63bcb --- /dev/null +++ b/sensorhandler.h @@ -0,0 +1,13 @@ +#ifndef __HOST_IPMI_SEN_HANDLER_H__ +#define __HOST_IPMI_SEN_HANDLER_H__ + +// IPMI commands for net functions. +enum ipmi_netfn_sen_cmds +{ + // Get capability bits + IPMI_CMD_GET_SENSOR_TYPE = 0x2F, + IPMI_CMD_SET_SENSOR = 0x30, + +}; + +#endif |