ID: 3528310 - 'lib/ipmi_picmg.c' - possible int *flow

Commit replaces atoi() and strtoul() calls with wrappers in order to prevent
possible int *flow via user input.
Also, limits on user provided values are applied wherever possible.

Reported-by: Dune Idaho
This commit is contained in:
Zdenek Styblik 2013-05-18 06:31:02 +00:00
parent 7472986e1c
commit a8f6341728

View File

@ -130,6 +130,425 @@ struct sAmcAddrMap {
{0x88, "reserved", 0},
};
/* is_amc_channel - wrapper to convert user input into integer
* AMC Channel range seems to be <0..255>, bits [7:0]
*
* @argv_ptr: source string to convert from; usually argv
* @amc_chan_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_amc_channel(const char *argv_ptr, uint8_t *amc_chan_ptr)
{
if (!argv_ptr || !amc_chan_ptr) {
lprintf(LOG_ERR, "is_amc_channel(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, amc_chan_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given AMC Channel '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_amc_dev - wrapper to convert user input into integer.
* AMC Dev ID limits are uknown.
*
* @argv_ptr: source string to convert from; usually argv
* @amc_dev_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_amc_dev(const char *argv_ptr, int32_t *amc_dev_ptr)
{
if (!argv_ptr || !amc_dev_ptr) {
lprintf(LOG_ERR, "is_amc_dev(): invalid argument(s).");
return (-1);
}
if (str2int(argv_ptr, amc_dev_ptr) == 0 && *amc_dev_ptr >= 0) {
return 0;
}
lprintf(LOG_ERR, "Given PICMG Device '%s' is invalid.",
argv_ptr);
return (-1);
}
/* is_amc_intf - wrapper to convert user input into integer.
* AMC Interface (ID) limits are uknown.
*
* @argv_ptr: source string to convert from; usually argv
* @amc_intf_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_amc_intf(const char *argv_ptr, int32_t *amc_intf_ptr)
{
if (!argv_ptr || !amc_intf_ptr) {
lprintf(LOG_ERR, "is_amc_intf(): invalid argument(s).");
return (-1);
}
if (str2int(argv_ptr, amc_intf_ptr) == 0 && *amc_intf_ptr >= 0) {
return 0;
}
lprintf(LOG_ERR, "Given PICMG Interface '%s' is invalid.",
argv_ptr);
return (-1);
}
/* is_amc_port - wrapper to convert user input into integer.
* AMC Port limits are uknown.
*
* @argv_ptr: source string to convert from; usually argv
* @amc_port_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_amc_port(const char *argv_ptr, int32_t *amc_port_ptr)
{
if (!argv_ptr || !amc_port_ptr) {
lprintf(LOG_ERR, "is_amc_port(): invalid argument(s).");
return (-1);
}
if (str2int(argv_ptr, amc_port_ptr) == 0 && *amc_port_ptr >= 0) {
return 0;
}
lprintf(LOG_ERR, "Given PICMG Port '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_clk_acc - wrapper to convert user input into integer.
* Clock Accuracy limits are uknown[1byte by spec].
*
* @argv_ptr: source string to convert from; usually argv
* @clk_acc_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_clk_acc(const char *argv_ptr, uint8_t *clk_acc_ptr)
{
if (!argv_ptr || !clk_acc_ptr) {
lprintf(LOG_ERR, "is_clk_acc(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, clk_acc_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given Clock Accuracy '%s' is invalid.",
argv_ptr);
return (-1);
}
/* is_clk_family - wrapper to convert user input into integer.
* Clock Family limits are uknown[1byte by spec].
*
* @argv_ptr: source string to convert from; usually argv
* @clk_family_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_clk_family(const char *argv_ptr, uint8_t *clk_family_ptr)
{
if (!argv_ptr || !clk_family_ptr) {
lprintf(LOG_ERR, "is_clk_family(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, clk_family_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given Clock Family '%s' is invalid.",
argv_ptr);
return (-1);
}
/* is_clk_freq - wrapper to convert user input into integer.
* Clock Frequency limits are uknown, but specification says
* 3Bytes + 1B checksum
*
* @argv_ptr: source string to convert from; usually argv
* @clk_freq_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_clk_freq(const char *argv_ptr, uint32_t *clk_freq_ptr)
{
if (!argv_ptr || !clk_freq_ptr) {
lprintf(LOG_ERR, "is_clk_freq(): invalid argument(s).");
return (-1);
}
if (str2uint(argv_ptr, clk_freq_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given Clock Frequency '%s' is invalid.",
argv_ptr);
return (-1);
}
/* is_clk_id - wrapper to convert user input into integer.
* Clock ID limits are uknown, however it's 1B by specification and I've
* found two ranges: <1..5> or <0..15>
*
* @argv_ptr: source string to convert from; usually argv
* @clk_id_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_clk_id(const char *argv_ptr, uint8_t *clk_id_ptr)
{
if (!argv_ptr || !clk_id_ptr) {
lprintf(LOG_ERR, "is_clk_id(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, clk_id_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given Clock ID '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_clk_index - wrapper to convert user input into integer.
* Clock Index limits are uknown[1B by spec]
*
* @argv_ptr: source string to convert from; usually argv
* @clk_index_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_clk_index(const char *argv_ptr, uint8_t *clk_index_ptr)
{
if (!argv_ptr || !clk_index_ptr) {
lprintf(LOG_ERR, "is_clk_index(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, clk_index_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given Clock Index '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_clk_resid - wrapper to convert user input into integer.
* Clock Resource Index(?) limits are uknown, but maximum seems to be 15.
*
* @argv_ptr: source string to convert from; usually argv
* @clk_resid_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_clk_resid(const char *argv_ptr, int8_t *clk_resid_ptr)
{
if (!argv_ptr || !clk_resid_ptr) {
lprintf(LOG_ERR, "is_clk_resid(): invalid argument(s).");
return (-1);
}
if (str2char(argv_ptr, clk_resid_ptr) == 0
&& *clk_resid_ptr > (-1)) {
return 0;
}
lprintf(LOG_ERR, "Given Resource ID '%s' is invalid.",
clk_resid_ptr);
return (-1);
}
/* is_clk_setting - wrapper to convert user input into integer.
* Clock Setting is a 1B bitfield:
* x [7:4] - reserved
* x [3] - state - 0/1
* x [2] - direction - 0/1
* x [1:0] - PLL ctrl - 00/01/10/11[Reserved]
*
* @argv_ptr: source string to convert from; usually argv
* @clk_setting_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_clk_setting(const char *argv_ptr, uint8_t *clk_setting_ptr)
{
if (!argv_ptr || !clk_setting_ptr) {
lprintf(LOG_ERR, "is_clk_setting(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, clk_setting_ptr) == 0) {
return 0;
}
/* FIXME - validate bits 4-7 are 0 ? */
lprintf(LOG_ERR, "Given Clock Setting '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_enable - wrapper to convert user input into integer.
* Valid input range for Enable is <0..1>.
*
* @argv_ptr: source string to convert from; usually argv
* @enable_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_enable(const char *argv_ptr, uint8_t *enable_ptr)
{
if (!argv_ptr || !enable_ptr) {
lprintf(LOG_ERR, "is_enable(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, enable_ptr) == 0
&& (*enable_ptr == 0 || *enable_ptr == 1)) {
return 0;
}
lprintf(LOG_ERR, "Given Enable '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_enable - wrapper to convert user input into integer.
* LED colors:
* - valid <1..6>, <0xE..0xF>
* - reserved [0, 7]
* - undefined <8..D>
*
* @argv_ptr: source string to convert from; usually argv
* @enable_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_led_color(const char *argv_ptr, uint8_t *led_color_ptr)
{
if (!argv_ptr || !led_color_ptr) {
lprintf(LOG_ERR, "is_led_color(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, led_color_ptr) != 0) {
lprintf(LOG_ERR, "Given LED Color '%s' is invalid.",
argv_ptr);
lprintf(LOG_ERR,
"LED Color must be from ranges: <1..6>, <0xE..0xF>");
return (-1);
}
if ((*led_color_ptr >= 1 && *led_color_ptr <= 6)
|| (*led_color_ptr >= 0xE && *led_color_ptr <= 0xF)) {
return 0;
}
lprintf(LOG_ERR, "Given LED Color '%s' is out of range.", argv_ptr);
lprintf(LOG_ERR, "LED Color must be from ranges: <1..6>, <0xE..0xF>");
return (-1);
}
/* is_led_duration - wrapper to convert user input into integer.
* LED duration range is <1..127>
*
* @argv_ptr: source string to convert from; usually argv
* @enable_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_led_duration(const char *argv_ptr, uint8_t *led_duration_ptr)
{
if (!argv_ptr || !led_duration_ptr) {
lprintf(LOG_ERR, "is_led_duration(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, led_duration_ptr) == 0
&& *led_duration_ptr > 0 && *led_duration_ptr <= 127) {
return 0;
}
lprintf(LOG_ERR, "Given LED Duration '%s' is invalid", argv_ptr);
return (-1);
}
/* is_led_function - wrapper to convert user input into integer.
* LED functions, however, might differ by OEM:
* - 0x00 - off override
* - <0x01..0xFA> - blinking override
* - 0xFB - lamp test state
* - 0xFC - state restored to local ctrl state
* - <0xFD..0xFE> - reserved
* - 0xFF - on override
*
* @argv_ptr: source string to convert from; usually argv
* @led_fn_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_led_function(const char *argv_ptr, uint8_t *led_fn_ptr)
{
if (!argv_ptr || !led_fn_ptr) {
lprintf(LOG_ERR, "is_led_function(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, led_fn_ptr) == 0
&& (*led_fn_ptr < 0xFD || *led_fn_ptr > 0xFE)) {
return 0;
}
lprintf(LOG_ERR, "Given LED Function '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_led_id - wrapper to convert user input into integer.
* LED ID range seems to be <0..255>
*
* @argv_ptr: source string to convert from; usually argv
* @led_id_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_led_id(const char *argv_ptr, uint8_t *led_id_ptr)
{
if (!argv_ptr || !led_id_ptr) {
lprintf(LOG_ERR, "is_led_id(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, led_id_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given LED ID '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_link_group - wrapper to convert user input into integer.
* Link Grouping ID limis are unknown, bits [31:24] by spec.
*
* @argv_ptr: source string to convert from; usually argv
* @link_grp_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_link_group(const char *argv_ptr, uint8_t *link_grp_ptr)
{
if (!argv_ptr || !link_grp_ptr) {
lprintf(LOG_ERR, "is_link_group(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, link_grp_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given Link Group '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_link_type - wrapper to convert user input into integer.
* Link Type limits are unknown, bits [19:12]
*
* @argv_ptr: source string to convert from; usually argv
* @link_type_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_link_type(const char *argv_ptr, uint8_t *link_type_ptr)
{
if (!argv_ptr || !link_type_ptr) {
lprintf(LOG_ERR, "is_link_type(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, link_type_ptr) == 0) {
return 0;
}
lprintf(LOG_ERR, "Given Link Type '%s' is invalid.", argv_ptr);
return (-1);
}
/* is_link_type_ext - wrapper to convert user input into integer.
* Link Type Extension limits are unknown, bits [23:20] => <0..15> ?
*
* @argv_ptr: source string to convert from; usually argv
* @link_type_ext_ptr: pointer where to store result
* returns: zero on success, other values mean error
*/
int
is_link_type_ext(const char *argv_ptr, uint8_t *link_type_ext_ptr)
{
if (!argv_ptr || !link_type_ext_ptr) {
lprintf(LOG_ERR, "is_link_type_ext(): invalid argument(s).");
return (-1);
}
if (str2uchar(argv_ptr, link_type_ext_ptr) != 0
|| *link_type_ext_ptr > 15) {
lprintf(LOG_ERR,
"Given Link Type Extension '%s' is invalid.",
argv_ptr);
return (-1);
}
return 0;
}
int
ipmi_picmg_getaddr(struct ipmi_intf * intf, int argc, char ** argv)
{
@ -146,7 +565,9 @@ ipmi_picmg_getaddr(struct ipmi_intf * intf, int argc, char ** argv)
msg_data[1] = 0; /* default fru id */
if(argc > 0) {
msg_data[1] = strtoul(argv[0], NULL,0); /* FRU ID */
if (is_fru_id(argv[0], &msg_data[1]) != 0) {
return (-1);
}
}
rsp = intf->sendrecv(intf, &req);
@ -275,7 +696,9 @@ ipmi_picmg_fru_activation(struct ipmi_intf * intf, int argc, char ** argv, unsig
req.msg.data_len = 3;
cmd.picmg_id = 0; /* PICMG identifier */
cmd.fru_id = (unsigned char) atoi(argv[0]); /* FRU ID */
if (is_fru_id(argv[0], &(cmd.fru_id)) != 0) {
return (-1);
}
cmd.fru_state = state;
rsp = intf->sendrecv(intf, &req);
@ -307,8 +730,9 @@ ipmi_picmg_fru_activation_policy_get(struct ipmi_intf * intf, int argc, char **
req.msg.data_len = 2;
msg_data[0] = 0; /* PICMG identifier */
msg_data[1] = (unsigned char) atoi(argv[0]); /* FRU ID */
if (is_fru_id(argv[0], &msg_data[1]) != 0) {
return (-1);
}
rsp = intf->sendrecv(intf, &req);
@ -345,9 +769,24 @@ ipmi_picmg_fru_activation_policy_set(struct ipmi_intf * intf, int argc, char **
req.msg.data_len = 4;
msg_data[0] = 0; /* PICMG identifier */
msg_data[1] = (unsigned char) atoi(argv[0]); /* FRU ID */
msg_data[2] = (unsigned char) atoi(argv[1])& 0x03; /* FRU act policy mask */
msg_data[3] = (unsigned char) atoi(argv[2])& 0x03; /* FRU act policy set bits */
if (is_fru_id(argv[0], &msg_data[1]) != 0) {
return (-1);
}
if (str2uchar(argv[1], &msg_data[2]) != 0 || msg_data[2] > 1) {
/* FRU Lock Mask */
lprintf(LOG_ERR, "Given FRU Lock Mask '%s' is invalid.",
argv[1]);
return (-1);
}
if (str2uchar(argv[2], &msg_data[3]) != 0 || msg_data[3] > 1) {
/* FRU Act Policy */
lprintf(LOG_ERR,
"Given FRU Activation Policy '%s' is invalid.",
argv[2]);
return (-1);
}
msg_data[2]&= 0x03;
msg_data[3]&= 0x03;
rsp = intf->sendrecv(intf, &req);
@ -368,8 +807,8 @@ ipmi_picmg_fru_activation_policy_set(struct ipmi_intf * intf, int argc, char **
#define PICMG_MAX_LINK_PER_CHANNEL 4
int
ipmi_picmg_portstate_get(struct ipmi_intf * intf, int interface,int channel,
int mode)
ipmi_picmg_portstate_get(struct ipmi_intf * intf, int32_t interface,
uint8_t channel, int mode)
{
struct ipmi_rs * rsp = NULL;
struct ipmi_rq req;
@ -508,8 +947,9 @@ ipmi_picmg_portstate_get(struct ipmi_intf * intf, int interface,int channel,
int
ipmi_picmg_portstate_set(struct ipmi_intf * intf, int interface, int channel,
int port, int type, int typeext, int group, int enable)
ipmi_picmg_portstate_set(struct ipmi_intf * intf, int32_t interface,
uint8_t channel, int32_t port, uint8_t type,
uint8_t typeext, uint8_t group, uint8_t enable)
{
struct ipmi_rs * rsp;
struct ipmi_rq req;
@ -528,7 +968,7 @@ ipmi_picmg_portstate_set(struct ipmi_intf * intf, int interface, int channel,
msg_data[2] = (port & 0xf) | ((type & 0xf) << 4);
msg_data[3] = ((type >> 4) & 0xf) | ((typeext & 0xf) << 4);
msg_data[4] = group & 0xff;
msg_data[5] = (unsigned char) (enable & 0x01); /* en/dis */
msg_data[5] = (enable & 0x01); /* enable/disable */
rsp = intf->sendrecv(intf, &req);
@ -553,8 +993,8 @@ ipmi_picmg_portstate_set(struct ipmi_intf * intf, int interface, int channel,
#define PICMG_AMC_MAX_LINK_PER_CHANNEL 4
int
ipmi_picmg_amc_portstate_get(struct ipmi_intf * intf,int device,int channel,
int mode)
ipmi_picmg_amc_portstate_get(struct ipmi_intf * intf, int32_t device,
uint8_t channel, int mode)
{
struct ipmi_rs * rsp;
struct ipmi_rq req;
@ -693,8 +1133,9 @@ ipmi_picmg_amc_portstate_get(struct ipmi_intf * intf,int device,int channel,
int
ipmi_picmg_amc_portstate_set(struct ipmi_intf * intf, int channel, int port,
int type, int typeext, int group, int enable, int device)
ipmi_picmg_amc_portstate_set(struct ipmi_intf * intf, uint8_t channel,
int32_t port, uint8_t type, uint8_t typeext,
uint8_t group, uint8_t enable, int32_t device)
{
struct ipmi_rs * rsp;
struct ipmi_rq req;
@ -755,7 +1196,9 @@ ipmi_picmg_get_led_properties(struct ipmi_intf * intf, int argc, char ** argv)
req.msg.data_len = 2;
msg_data[0] = 0x00; /* PICMG identifier */
msg_data[1] = atoi(argv[0]); /* FRU-ID */
if (is_fru_id(argv[0], &msg_data[1]) != 0) {
return (-1);
}
rsp = intf->sendrecv(intf, &req);
@ -793,9 +1236,10 @@ ipmi_picmg_get_led_capabilities(struct ipmi_intf * intf, int argc, char ** argv)
req.msg.data_len = 3;
msg_data[0] = 0x00; /* PICMG identifier */
msg_data[1] = atoi(argv[0]); /* FRU-ID */
msg_data[2] = atoi(argv[1]); /* LED-ID */
if (is_fru_id(argv[0], &msg_data[1]) != 0
|| is_led_id(argv[1], &msg_data[2]) != 0) {
return (-1);
}
rsp = intf->sendrecv(intf, &req);
@ -841,9 +1285,10 @@ ipmi_picmg_get_led_state(struct ipmi_intf * intf, int argc, char ** argv)
req.msg.data_len = 3;
msg_data[0] = 0x00; /* PICMG identifier */
msg_data[1] = atoi(argv[0]); /* FRU-ID */
msg_data[2] = atoi(argv[1]); /* LED-ID */
if (is_fru_id(argv[0], &msg_data[1]) != 0
|| is_led_id(argv[1], &msg_data[2]) != 0) {
return (-1);
}
rsp = intf->sendrecv(intf, &req);
@ -923,11 +1368,13 @@ ipmi_picmg_set_led_state(struct ipmi_intf * intf, int argc, char ** argv)
req.msg.data_len = 6;
msg_data[0] = 0x00; /* PICMG identifier */
msg_data[1] = atoi(argv[0]); /* FRU-ID */
msg_data[2] = atoi(argv[1]); /* LED-ID */
msg_data[3] = atoi(argv[2]); /* LED function */
msg_data[4] = atoi(argv[3]); /* LED on duration */
msg_data[5] = atoi(argv[4]); /* LED color */
if (is_fru_id(argv[0], &msg_data[1]) != 0
|| is_led_id(argv[1], &msg_data[2]) != 0
|| is_led_function(argv[2], &msg_data[3]) != 0
|| is_led_duration(argv[3], &msg_data[4]) != 0
|| is_led_color(argv[4], &msg_data[5]) != 0) {
return (-1);
}
rsp = intf->sendrecv(intf, &req);
@ -962,9 +1409,15 @@ ipmi_picmg_get_power_level(struct ipmi_intf * intf, int argc, char ** argv)
req.msg.data_len = 3;
msg_data[0] = 0x00; /* PICMG identifier */
msg_data[1] = atoi(argv[0]); /* FRU-ID */
msg_data[2] = atoi(argv[1]); /* Power type */
if (is_fru_id(argv[0], &msg_data[1]) != 0) {
return (-1);
}
/* PICMG Power Type - <0..3> */
if (str2uchar(argv[1], &msg_data[2]) != 0 || msg_data[2] > 3) {
lprintf(LOG_ERR, "Given Power Type '%s' is invalid",
argv[1]);
return (-1);
}
rsp = intf->sendrecv(intf, &req);
@ -1006,9 +1459,24 @@ ipmi_picmg_set_power_level(struct ipmi_intf * intf, int argc, char ** argv)
req.msg.data_len = 4;
msg_data[0] = 0x00; /* PICMG identifier */
msg_data[1] = atoi(argv[0]); /* FRU-ID */
msg_data[2] = atoi(argv[1]); /* power level */
msg_data[3] = atoi(argv[2]); /* present to desired */
if (is_fru_id(argv[0], &msg_data[1]) != 0) {
return (-1);
}
/* PICMG Power Level - <0x00..0x14>, [0xFF] */
if (str2uchar(argv[1], &msg_data[2]) != 0
|| (msg_data[2] > 0x14 && msg_data[2] != 0xFF)) {
lprintf(LOG_ERR,
"Given PICMG Power Level '%s' is invalid.",
argv[1]);
return (-1);
}
/* PICMG Present-to-desired - <0..1> */
if (str2uchar(argv[2], &msg_data[3]) != 0 || msg_data[3] > 1) {
lprintf(LOG_ERR,
"Given PICMG Present-to-desired '%s' is invalid.",
argv[2]);
return (-1);
}
rsp = intf->sendrecv(intf, &req);
@ -1095,8 +1563,16 @@ ipmi_picmg_fru_control(struct ipmi_intf * intf, int argc, char ** argv)
req.msg.data_len = 3;
msg_data[0] = 0x00; /* PICMG identifier */
msg_data[1] = atoi(argv[0]); /* FRU-ID */
msg_data[2] = atoi(argv[1]); /* control option */
if (is_fru_id(argv[0], &msg_data[1]) != 0) {
return (-1);
}
/* FRU Control Option, valid range: <0..4> */
if (str2uchar(argv[1], &msg_data[2]) != 0 || msg_data[2] > 4) {
lprintf(LOG_ERR,
"Given FRU Control Option '%s' is invalid.",
argv[1]);
return (-1);
}
printf("FRU Device Id: %d FRU Control Option: %s\n", msg_data[1], \
val2str( msg_data[2], picmg_frucontrol_vals));
@ -1122,7 +1598,8 @@ ipmi_picmg_fru_control(struct ipmi_intf * intf, int argc, char ** argv)
int
ipmi_picmg_clk_get(struct ipmi_intf * intf, int clk_id,int clk_res,int mode)
ipmi_picmg_clk_get(struct ipmi_intf * intf, uint8_t clk_id, int8_t clk_res,
int mode)
{
struct ipmi_rs * rsp;
struct ipmi_rq req;
@ -1227,8 +1704,8 @@ ipmi_picmg_clk_set(struct ipmi_intf * intf, int argc, char ** argv)
struct ipmi_rs * rsp;
struct ipmi_rq req;
unsigned char msg_data[11];
unsigned long freq=0;
unsigned char msg_data[11] = {0};
uint32_t freq = 0;
memset(&req, 0, sizeof(req));
@ -1237,13 +1714,15 @@ ipmi_picmg_clk_set(struct ipmi_intf * intf, int argc, char ** argv)
req.msg.data = msg_data;
msg_data[0] = 0x00; /* PICMG identifier */
msg_data[1] = strtoul(argv[0], NULL,0); /* clk id */
msg_data[2] = strtoul(argv[1], NULL,0); /* clk index */
msg_data[3] = strtoul(argv[2], NULL,0); /* setting */
msg_data[4] = strtoul(argv[3], NULL,0); /* family */
msg_data[5] = strtoul(argv[4], NULL,0); /* acc */
if (is_clk_id(argv[0], &msg_data[1]) != 0
|| is_clk_index(argv[1], &msg_data[2]) != 0
|| is_clk_setting(argv[2], &msg_data[3]) != 0
|| is_clk_family(argv[3], &msg_data[4]) != 0
|| is_clk_acc(argv[4], &msg_data[5]) != 0
|| is_clk_freq(argv[5], &freq) != 0) {
return (-1);
}
freq = strtoul(argv[5], NULL,0);
msg_data[6] = (freq >> 0)& 0xFF; /* freq */
msg_data[7] = (freq >> 8)& 0xFF; /* freq */
msg_data[8] = (freq >>16)& 0xFF; /* freq */
@ -1255,7 +1734,9 @@ ipmi_picmg_clk_set(struct ipmi_intf * intf, int argc, char ** argv)
if( argc > 7)
{
req.msg.data_len = 11;
msg_data[10] = strtoul(argv[6], NULL,0); /* resource id */
if (is_clk_resid(argv[6], &msg_data[10]) != 0) {
return (-1);
}
}
else
{
@ -1402,9 +1883,8 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
if (argc > 1) {
if (!strncmp(argv[1], "get", 3)) {
int iface;
int channel;
int32_t iface;
uint8_t channel = 0;
lprintf(LOG_DEBUG,"PICMG: get");
@ -1437,8 +1917,10 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
}
}
else if (argc > 3){
iface = atoi(argv[2]);
channel = atoi(argv[3]);
if (is_amc_intf(argv[2], &iface) != 0
|| is_amc_channel(argv[3], &channel) != 0) {
return (-1);
}
lprintf(LOG_DEBUG,"PICMG: requesting interface %d",iface);
lprintf(LOG_DEBUG,"PICMG: requesting channel %d",channel);
@ -1451,13 +1933,22 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
}
else if (!strncmp(argv[1], "set", 3)) {
if (argc == 9) {
int interface = strtoul(argv[2], NULL, 0);
int channel = strtoul(argv[3], NULL, 0);
int port = strtoul(argv[4], NULL, 0);
int type = strtoul(argv[5], NULL, 0);
int typeext = strtoul(argv[6], NULL, 0);
int group = strtoul(argv[7], NULL, 0);
int enable = strtoul(argv[8], NULL, 0);
int32_t interface = 0;
int32_t port = 0;
uint8_t channel = 0;
uint8_t enable = 0;
uint8_t group = 0;
uint8_t type = 0;
uint8_t typeext = 0;
if (is_amc_intf(argv[2], &interface) != 0
|| is_amc_channel(argv[3], &channel) != 0
|| is_amc_port(argv[4], &port) != 0
|| is_link_type(argv[5], &type) != 0
|| is_link_type_ext(argv[6], &typeext) != 0
|| is_link_group(argv[7], &group) != 0
|| is_enable(argv[8], &enable) != 0) {
return (-1);
}
lprintf(LOG_DEBUG,"PICMG: interface %d",interface);
lprintf(LOG_DEBUG,"PICMG: channel %d",channel);
@ -1489,8 +1980,8 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
if (argc > 1) {
if (!strncmp(argv[1], "get", 3)){
int channel;
int device;
int32_t device;
uint8_t channel;
lprintf(LOG_DEBUG,"PICMG: get");
@ -1531,9 +2022,13 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
}
}
else if (argc > 2){
channel = atoi(argv[2]);
if (is_amc_channel(argv[2], &channel) != 0) {
return (-1);
}
if (argc > 3){
device = atoi(argv[3]);
if (is_amc_dev(argv[3], &device) != 0) {
return (-1);
}
}else{
device = -1;
}
@ -1549,15 +2044,25 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
}
else if (!strncmp(argv[1], "set", 3)) {
if (argc > 7) {
int channel = atoi(argv[2]);
int port = atoi(argv[3]);
int type = atoi(argv[4]);
int typeext = atoi(argv[5]);
int group = atoi(argv[6]);
int enable = atoi(argv[7]);
int device = -1;
int32_t device = -1;
int32_t port = 0;
uint8_t channel = 0;
uint8_t enable = 0;
uint8_t group = 0;
uint8_t type = 0;
uint8_t typeext = 0;
if (is_amc_channel(argv[2], &channel) != 0
|| is_amc_port(argv[3], &port) != 0
|| is_link_type(argv[4], &type) !=0
|| is_link_type_ext(argv[5], &typeext) != 0
|| is_link_group(argv[6], &group) != 0
|| is_enable(argv[7], &enable) != 0) {
return (-1);
}
if(argc > 8){
device = atoi(argv[8]);
if (is_amc_dev(argv[8], &device) != 0) {
return (-1);
}
}
lprintf(LOG_DEBUG,"PICMG: channel %d",channel);
@ -1699,9 +2204,9 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
else if (!strncmp(argv[0], "clk", 3)) {
if (argc > 1) {
if (!strncmp(argv[1], "get", 3)) {
int clk_id;
int clk_res = -1;
int max_res = 15;
int8_t clk_res = -1;
uint8_t clk_id;
uint8_t max_res = 15;
if( PicmgCardType == PICMG_CARD_TYPE_AMC ) {
max_res = 0;
@ -1735,9 +2240,13 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
}
}
else if (argc > 2) {
clk_id = atoi(argv[2]);
if (is_clk_id(argv[2], &clk_id) != 0) {
return (-1);
}
if (argc > 3) {
clk_res = atoi(argv[3]);
if (is_clk_resid(argv[3], &clk_res) != 0) {
return (-1);
}
}
rc = ipmi_picmg_clk_get(intf, clk_id, clk_res,