From 90448837ec603006512bbd8ea8512d2729bef70e Mon Sep 17 00:00:00 2001 From: Duncan Laurie Date: Wed, 20 Apr 2005 23:04:00 +0000 Subject: [PATCH] add ability to configure session retry and timeout settings, add chassis power status command with return value indicating status --- ipmitool/include/ipmitool/ipmi_chassis.h | 1 + ipmitool/include/ipmitool/ipmi_intf.h | 3 +++ ipmitool/lib/ipmi_chassis.c | 11 +++++++++-- ipmitool/src/plugins/ipmi_intf.c | 18 ++++++++++++++++++ ipmitool/src/plugins/lan/lan.c | 10 +++++++--- ipmitool/src/plugins/lanplus/lanplus.c | 7 +++++-- 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/ipmitool/include/ipmitool/ipmi_chassis.h b/ipmitool/include/ipmitool/ipmi_chassis.h index 85ee1e2..8f338b4 100644 --- a/ipmitool/include/ipmitool/ipmi_chassis.h +++ b/ipmitool/include/ipmitool/ipmi_chassis.h @@ -52,5 +52,6 @@ #define IPMI_CHASSIS_POLICY_ALWAYS_OFF 0x0 int ipmi_chassis_main(struct ipmi_intf *, int, char **); +int ipmi_chassis_power_status(struct ipmi_intf * intf); #endif /*IPMI_CHASSIS_H*/ diff --git a/ipmitool/include/ipmitool/ipmi_intf.h b/ipmitool/include/ipmitool/ipmi_intf.h index 83a2f76..8bbe49d 100644 --- a/ipmitool/include/ipmitool/ipmi_intf.h +++ b/ipmitool/include/ipmitool/ipmi_intf.h @@ -85,6 +85,7 @@ struct ipmi_session { int password; int port; int active; + int retry; uint32_t session_id; uint32_t in_seq; @@ -193,6 +194,8 @@ void ipmi_intf_session_set_privlvl(struct ipmi_intf * intf, uint8_t privlvl); void ipmi_intf_session_set_cipher_suite_id(struct ipmi_intf * intf, uint8_t cipher_suite_id); void ipmi_intf_session_set_port(struct ipmi_intf * intf, int port); void ipmi_intf_session_set_authtype(struct ipmi_intf * intf, uint8_t authtype); +void ipmi_intf_session_set_timeout(struct ipmi_intf * intf, uint32_t timeout); +void ipmi_intf_session_set_retry(struct ipmi_intf * intf, int retry); void ipmi_cleanup(struct ipmi_intf * intf); #endif /* IPMI_INTF_H */ diff --git a/ipmitool/lib/ipmi_chassis.c b/ipmitool/lib/ipmi_chassis.c index da5bcd4..58d1b3c 100644 --- a/ipmitool/lib/ipmi_chassis.c +++ b/ipmitool/lib/ipmi_chassis.c @@ -46,7 +46,7 @@ extern int verbose; -static int +int ipmi_chassis_power_status(struct ipmi_intf * intf) { struct ipmi_rs * rsp; @@ -68,7 +68,14 @@ ipmi_chassis_power_status(struct ipmi_intf * intf) return -1; } - printf("Chassis Power is %s\n", (rsp->data[0] & 0x1) ? "on" : "off"); + return rsp->data[0] & 1; +} + +static int +ipmi_chassis_print_power_status(struct ipmi_intf * intf) +{ + printf("Chassis Power is %s\n", + ipmi_chassis_power_status(intf) ? "on" : "off"); return 0; } diff --git a/ipmitool/src/plugins/ipmi_intf.c b/ipmitool/src/plugins/ipmi_intf.c index abd25d1..7bb855a 100644 --- a/ipmitool/src/plugins/ipmi_intf.c +++ b/ipmitool/src/plugins/ipmi_intf.c @@ -242,6 +242,24 @@ ipmi_intf_session_set_authtype(struct ipmi_intf * intf, uint8_t authtype) intf->session->authtype_set = authtype; } +void +ipmi_intf_session_set_timeout(struct ipmi_intf * intf, uint32_t timeout) +{ + if (intf->session == NULL) + return; + + intf->session->timeout = timeout; +} + +void +ipmi_intf_session_set_retry(struct ipmi_intf * intf, int retry) +{ + if (intf->session == NULL) + return; + + intf->session->retry = retry; +} + void ipmi_cleanup(struct ipmi_intf * intf) { diff --git a/ipmitool/src/plugins/lan/lan.c b/ipmitool/src/plugins/lan/lan.c index cba2c14..da6c8f7 100644 --- a/ipmitool/src/plugins/lan/lan.c +++ b/ipmitool/src/plugins/lan/lan.c @@ -223,7 +223,7 @@ struct ipmi_rs * ipmi_lan_recv_packet(struct ipmi_intf * intf) return NULL; } - alarm(IPMI_LAN_TIMEOUT); + alarm(intf->session->timeout); rc = recv(intf->fd, &rsp.data, IPMI_BUF_SIZE, 0); alarm(0); @@ -238,7 +238,7 @@ struct ipmi_rs * ipmi_lan_recv_packet(struct ipmi_intf * intf) * response is read before the connection refused is returned) */ if (rc < 0) { - alarm(IPMI_LAN_TIMEOUT); + alarm(intf->session->timeout); rc = recv(intf->fd, &rsp.data, IPMI_BUF_SIZE, 0); alarm(0); if (rc < 0) { @@ -726,7 +726,7 @@ ipmi_lan_send_cmd(struct ipmi_intf * intf, struct ipmi_rq * req) break; usleep(5000); - if (++try >= IPMI_LAN_RETRY) { + if (++try >= intf->session->retry) { lprintf(LOG_DEBUG, " No response from remote controller"); break; } @@ -1336,6 +1336,10 @@ int ipmi_lan_open(struct ipmi_intf * intf) s->port = IPMI_LAN_PORT; if (s->privlvl == 0) s->privlvl = IPMI_SESSION_PRIV_ADMIN; + if (s->timeout == 0) + s->timeout = IPMI_LAN_TIMEOUT; + if (s->retry == 0) + s->retry = IPMI_LAN_RETRY; if (s->hostname == NULL || strlen(s->hostname) == 0) { lprintf(LOG_ERR, "No hostname specified!"); diff --git a/ipmitool/src/plugins/lanplus/lanplus.c b/ipmitool/src/plugins/lanplus/lanplus.c index 1daf45e..1734d95 100644 --- a/ipmitool/src/plugins/lanplus/lanplus.c +++ b/ipmitool/src/plugins/lanplus/lanplus.c @@ -2010,7 +2010,7 @@ ipmi_lanplus_send_payload( } - while (try < IPMI_LAN_RETRY) { + while (try < session->retry) { if (ipmi_lan_send_packet(intf, msg_data, msg_length) < 0) { @@ -3022,6 +3022,10 @@ ipmi_lanplus_open(struct ipmi_intf * intf) session->port = IPMI_LANPLUS_PORT; if (!session->privlvl) session->privlvl = IPMI_SESSION_PRIV_USER; + if (!session->timeout) + session->timeout = IPMI_LAN_TIMEOUT; + if (!session->retry) + session->retry = IPMI_LAN_RETRY; if (session->hostname == NULL || strlen(session->hostname) == 0) { lprintf(LOG_ERR, "No hostname specified!"); @@ -3042,7 +3046,6 @@ ipmi_lanplus_open(struct ipmi_intf * intf) //session->sol_data.last_received_byte_count = 0; memset(session->v2_data.sik, 0, IPMI_SIK_BUFFER_SIZE); memset(session->v2_data.kg, 0, IPMI_KG_BUFFER_SIZE); - session->timeout = IPMI_LAN_TIMEOUT; /* open port to BMC */