send errors to stderr

This commit is contained in:
Duncan Laurie 2005-01-07 22:14:30 +00:00
parent 014040610f
commit db9614572b
3 changed files with 266 additions and 214 deletions

View File

@ -52,6 +52,7 @@
#include <config.h>
#include <ipmitool/helper.h>
#include <ipmitool/log.h>
#include <ipmitool/ipmi.h>
#include <ipmitool/ipmi_lanp.h>
#include <ipmitool/ipmi_channel.h>
@ -417,23 +418,26 @@ ipmiv2_lan_ping(struct ipmi_intf * intf)
int rv;
data = malloc(len);
if (data == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return -1;
}
memset(data, 0, len);
memcpy(data, &rmcp_ping, sizeof(rmcp_ping));
memcpy(data+sizeof(rmcp_ping), &asf_ping, sizeof(asf_ping));
if (verbose)
printf("Sending IPMI/RMCP presence ping packet\n");
lprintf(LOG_DEBUG, "Sending IPMI/RMCP presence ping packet");
rv = ipmi_lan_send_packet(intf, data, len);
free(data);
if (rv < 0) {
printf("Unable to send IPMI presence ping packet\n");
lprintf(LOG_ERR, "Unable to send IPMI presence ping packet");
return -1;
}
if (!ipmi_lan_poll_recv(intf))
if (ipmi_lan_poll_recv(intf) == 0)
return 0;
return 1;
@ -465,7 +469,7 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
* Not positive why we're looping. Do we sometimes get stuff we don't
* expect?
*/
while (rsp) {
while (rsp != NULL) {
/* parse response headers */
memcpy(&rmcp_rsp, rsp->data, 4);
@ -477,7 +481,8 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
}
if (rmcp_rsp.class != RMCP_CLASS_IPMI) {
printf("Invalid RMCP class: %x\n", rmcp_rsp.class);
lprintf(LOG_DEBUG, "Invalid RMCP class: %x",
rmcp_rsp.class);
rsp = ipmi_lan_recv_packet(intf);
continue;
}
@ -506,9 +511,9 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
read_session_data(rsp, &offset, intf->session);
if (! lanplus_has_valid_auth_code(rsp, intf->session))
if (lanplus_has_valid_auth_code(rsp, intf->session) == 0)
{
printf("ERROR: Received message with invalid authcode!\n");
lprintf(LOG_ERR, "ERROR: Received message with invalid authcode!");
rsp = ipmi_lan_recv_packet(intf);
assert(0);
//continue;
@ -541,48 +546,45 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
int extra_data_length;
read_ipmi_response(rsp, &offset);
if (verbose > 2) {
printf("<< IPMI Response Session Header\n");
printf("<< Authtype : %s\n",
val2str(rsp->session.authtype, ipmi_authtype_vals));
printf("<< Payload type : 0x%x\n",
rsp->session.payloadtype);
printf("<< Session ID : 0x%08lx\n",
(long)rsp->session.id);
printf("<< Sequence : 0x%08lx\n",
(long)rsp->session.seq);
printf("<< IPMI Msg/Payload Length : %d\n",
rsp->session.msglen);
printf("<< IPMI Response Message Header\n");
printf("<< Rq Addr : %02x\n",
rsp->payload.ipmi_response.rq_addr);
printf("<< NetFn : %02x\n",
rsp->payload.ipmi_response.netfn);
printf("<< Rq LUN : %01x\n",
rsp->payload.ipmi_response.rq_lun);
printf("<< Rs Addr : %02x\n",
rsp->payload.ipmi_response.rs_addr);
printf("<< Rq Seq : %02x\n",
rsp->payload.ipmi_response.rq_seq);
printf("<< Rs Lun : %01x\n",
rsp->payload.ipmi_response.rs_lun);
printf("<< Command : %02x\n",
rsp->payload.ipmi_response.cmd);
printf("<< Compl Code : 0x%02x\n",
rsp->ccode);
}
lprintf(LOG_DEBUG+1, "<< IPMI Response Session Header");
lprintf(LOG_DEBUG+1, "<< Authtype : %s",
val2str(rsp->session.authtype, ipmi_authtype_vals));
lprintf(LOG_DEBUG+1, "<< Payload type : 0x%x",
rsp->session.payloadtype);
lprintf(LOG_DEBUG+1, "<< Session ID : 0x%08lx",
(long)rsp->session.id);
lprintf(LOG_DEBUG+1, "<< Sequence : 0x%08lx",
(long)rsp->session.seq);
lprintf(LOG_DEBUG+1, "<< IPMI Msg/Payload Length : %d",
rsp->session.msglen);
lprintf(LOG_DEBUG+1, "<< IPMI Response Message Header");
lprintf(LOG_DEBUG+1, "<< Rq Addr : %02x",
rsp->payload.ipmi_response.rq_addr);
lprintf(LOG_DEBUG+1, "<< NetFn : %02x",
rsp->payload.ipmi_response.netfn);
lprintf(LOG_DEBUG+1, "<< Rq LUN : %01x",
rsp->payload.ipmi_response.rq_lun);
lprintf(LOG_DEBUG+1, "<< Rs Addr : %02x",
rsp->payload.ipmi_response.rs_addr);
lprintf(LOG_DEBUG+1, "<< Rq Seq : %02x",
rsp->payload.ipmi_response.rq_seq);
lprintf(LOG_DEBUG+1, "<< Rs Lun : %01x",
rsp->payload.ipmi_response.rs_lun);
lprintf(LOG_DEBUG+1, "<< Command : %02x",
rsp->payload.ipmi_response.cmd);
lprintf(LOG_DEBUG+1, "<< Compl Code : 0x%02x",
rsp->ccode);
/* Are we expecting this packet? */
entry = ipmi_req_lookup_entry(rsp->payload.ipmi_response.rq_seq,
rsp->payload.ipmi_response.cmd);
if (entry) {
if (verbose > 2)
printf("IPMI Request Match found\n");
if (entry != NULL) {
lprintf(LOG_DEBUG+2, "IPMI Request Match found");
ipmi_req_remove_entry(rsp->payload.ipmi_response.rq_seq,
rsp->payload.ipmi_response.cmd);
} else {
printf("WARNING: IPMI Request Match NOT FOUND!\n");
lprintf(LOG_INFO, "IPMI Request Match NOT FOUND");
rsp = ipmi_lan_recv_packet(intf);
continue;
}
@ -594,7 +596,7 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
* rsp->data_len becomes the length of that data
*/
extra_data_length = payload_size - (offset - payload_start) - 1;
if (rsp && extra_data_length)
if (rsp != NULL && extra_data_length)
{
rsp->data_len = extra_data_length;
memmove(rsp->data, rsp->data + offset, extra_data_length);
@ -613,8 +615,8 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
if (session->v2_data.session_state !=
LANPLUS_STATE_OPEN_SESSION_SENT)
{
printf("Error: Received an Unexpected Open Session "
"Response\n");
lprintf(LOG_ERR, "Error: Received an Unexpected Open Session "
"Response");
rsp = ipmi_lan_recv_packet(intf);
continue;
}
@ -631,7 +633,7 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
{
if (session->v2_data.session_state != LANPLUS_STATE_RAKP_1_SENT)
{
printf("Error: Received an Unexpected RAKP 2 message\n");
lprintf(LOG_ERR, "Error: Received an Unexpected RAKP 2 message");
rsp = ipmi_lan_recv_packet(intf);
continue;
}
@ -648,7 +650,7 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
{
if (session->v2_data.session_state != LANPLUS_STATE_RAKP_3_SENT)
{
printf("Error: Received an Unexpected RAKP 4 message\n");
lprintf(LOG_ERR, "Error: Received an Unexpected RAKP 4 message");
rsp = ipmi_lan_recv_packet(intf);
continue;
}
@ -668,7 +670,7 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
if (session->v2_data.session_state != LANPLUS_STATE_ACTIVE)
{
printf("Error: Received an Unexpected SOL packet\n");
lprintf(LOG_ERR, "Error: Received an Unexpected SOL packet");
rsp = ipmi_lan_recv_packet(intf);
continue;
}
@ -688,7 +690,7 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
else
{
printf("Invalid RMCP+ payload type : 0x%x\n",
lprintf(LOG_ERR, "Invalid RMCP+ payload type : 0x%x",
rsp->session.payloadtype);
assert(0);
}
@ -822,8 +824,8 @@ read_rakp2_message(
break;
case IPMI_AUTH_RAKP_HMAC_MD5:
printf("read_rakp2_message: no support for "
"IPMI_AUTH_RAKP_HMAC_MD5\n");
lprintf(LOG_ERR, "read_rakp2_message: no support for "
"IPMI_AUTH_RAKP_HMAC_MD5");
assert(0);
break;
}
@ -889,8 +891,8 @@ read_rakp4_message(
case IPMI_INTEGRITY_HMAC_MD5_128:
case IPMI_INTEGRITY_MD5_128:
printf("read_rakp4_message: no support for integrity algorithm "
"0x%x\n", integrity_alg);
lprintf(LOG_ERR, "read_rakp4_message: no support "
"for integrity algorithm 0x%x", integrity_alg);
assert(0);
break;
}
@ -978,8 +980,9 @@ read_session_data_v2x(
if ((s->v2_data.session_state == LANPLUS_STATE_ACTIVE) &&
(rsp->session.id != s->v2_data.console_id))
{
printf("packet session id 0x%x does not match active session 0x%0x\n",
rsp->session.id, s->v2_data.console_id);
lprintf(LOG_ERR, "packet session id 0x%x does not "
"match active session 0x%0x",
rsp->session.id, s->v2_data.console_id);
assert(0);
}
@ -1113,32 +1116,29 @@ void read_sol_packet(struct ipmi_rs * rsp, int * offset)
rsp->payload.sol_packet.break_detected =
rsp->data[(*offset)++] & 0x04;
if (verbose)
{
printf("SOL sequence number : 0x%02x\n",
rsp->payload.sol_packet.packet_sequence_number);
lprintf(LOG_DEBUG, "SOL sequence number : 0x%02x",
rsp->payload.sol_packet.packet_sequence_number);
printf("SOL acked packet : 0x%02x\n",
rsp->payload.sol_packet.acked_packet_number);
lprintf(LOG_DEBUG, "SOL acked packet : 0x%02x",
rsp->payload.sol_packet.acked_packet_number);
printf("SOL accepted char count : 0x%02x\n",
rsp->payload.sol_packet.accepted_character_count);
lprintf(LOG_DEBUG, "SOL accepted char count : 0x%02x",
rsp->payload.sol_packet.accepted_character_count);
printf("SOL is nack : %s\n",
rsp->payload.sol_packet.is_nack? "true" : "false");
lprintf(LOG_DEBUG, "SOL is nack : %s",
rsp->payload.sol_packet.is_nack? "true" : "false");
printf("SOL xfer unavailable : %s\n",
rsp->payload.sol_packet.transfer_unavailable? "true" : "false");
lprintf(LOG_DEBUG, "SOL xfer unavailable : %s",
rsp->payload.sol_packet.transfer_unavailable? "true" : "false");
printf("SOL inactive : %s\n",
rsp->payload.sol_packet.sol_inactive? "true" : "false");
lprintf(LOG_DEBUG, "SOL inactive : %s",
rsp->payload.sol_packet.sol_inactive? "true" : "false");
printf("SOL transmit overrun : %s\n",
rsp->payload.sol_packet.transmit_overrun? "true" : "false");
lprintf(LOG_DEBUG, "SOL transmit overrun : %s",
rsp->payload.sol_packet.transmit_overrun? "true" : "false");
printf("SOL break detected : %s\n",
rsp->payload.sol_packet.break_detected? "true" : "false");
}
lprintf(LOG_DEBUG, "SOL break detected : %s",
rsp->payload.sol_packet.break_detected? "true" : "false");
}
@ -1305,6 +1305,10 @@ ipmi_lanplus_build_v2x_msg(
msg = malloc(len);
if (msg == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return;
}
memset(msg, 0, len);
/*
@ -1406,7 +1410,8 @@ ipmi_lanplus_build_v2x_msg(
break;
default:
printf("unsupported payload type 0x%x\n", payload->payload_type);
lprintf(LOG_ERR, "unsupported payload type 0x%x",
payload->payload_type);
assert(0);
break;
}
@ -1557,6 +1562,10 @@ ipmi_lanplus_build_v2x_ipmi_cmd(
curr_seq = 0;
entry = malloc(sizeof(struct ipmi_rq_entry));
if (entry == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return NULL;
}
memset(entry, 0, sizeof(struct ipmi_rq_entry));
memcpy(&entry->req, req, sizeof(struct ipmi_rq));
@ -1571,9 +1580,8 @@ ipmi_lanplus_build_v2x_ipmi_cmd(
ipmi_req_entries_tail = entry;
if (verbose > 3)
printf("added list entry seq=0x%02x cmd=0x%02x\n",
curr_seq, req->msg.cmd);
lprintf(LOG_DEBUG+3, "added list entry seq=0x%02x cmd=0x%02x\n",
curr_seq, req->msg.cmd);
// Build our payload
@ -1638,6 +1646,10 @@ ipmi_lanplus_build_v15_ipmi_cmd(
struct ipmi_rq_entry * entry;
entry = malloc(sizeof(struct ipmi_rq_entry));
if (entry == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return NULL;
}
memset(entry, 0, sizeof(struct ipmi_rq_entry));
memcpy(&entry->req, req, sizeof(struct ipmi_rq));
@ -1654,6 +1666,10 @@ ipmi_lanplus_build_v15_ipmi_cmd(
len = req->msg.data_len + 21;
msg = malloc(len);
if (msg == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return NULL;
}
memset(msg, 0, len);
/* rmcp header */
@ -1700,22 +1716,22 @@ ipmi_lanplus_build_v15_ipmi_cmd(
msg[len++] = entry->rq_seq << 2;
msg[len++] = req->msg.cmd;
if (verbose > 2) {
printf(">> IPMI Request Session Header\n");
printf(">> Authtype : %s\n", val2str(IPMI_SESSION_AUTHTYPE_NONE,
ipmi_authtype_vals));
printf(">> Sequence : 0x%08lx\n", (long)session->out_seq);
printf(">> Session ID : 0x%08lx\n", (long)0);
lprintf(LOG_DEBUG+1, ">> IPMI Request Session Header");
lprintf(LOG_DEBUG+1, ">> Authtype : %s",
val2str(IPMI_SESSION_AUTHTYPE_NONE, ipmi_authtype_vals));
lprintf(LOG_DEBUG+1, ">> Sequence : 0x%08lx",
(long)session->out_seq);
lprintf(LOG_DEBUG+1, ">> Session ID : 0x%08lx",
(long)0);
printf(">> IPMI Request Message Header\n");
printf(">> Rs Addr : %02x\n", IPMI_BMC_SLAVE_ADDR);
printf(">> NetFn : %02x\n", req->msg.netfn);
printf(">> Rs LUN : %01x\n", 0);
printf(">> Rq Addr : %02x\n", IPMI_REMOTE_SWID);
printf(">> Rq Seq : %02x\n", entry->rq_seq);
printf(">> Rq Lun : %01x\n", 0);
printf(">> Command : %02x\n", req->msg.cmd);
}
lprintf(LOG_DEBUG+1, ">> IPMI Request Message Header");
lprintf(LOG_DEBUG+1, ">> Rs Addr : %02x", IPMI_BMC_SLAVE_ADDR);
lprintf(LOG_DEBUG+1, ">> NetFn : %02x", req->msg.netfn);
lprintf(LOG_DEBUG+1, ">> Rs LUN : %01x", 0);
lprintf(LOG_DEBUG+1, ">> Rq Addr : %02x", IPMI_REMOTE_SWID);
lprintf(LOG_DEBUG+1, ">> Rq Seq : %02x", entry->rq_seq);
lprintf(LOG_DEBUG+1, ">> Rq Lun : %01x", 0);
lprintf(LOG_DEBUG+1, ">> Command : %02x", req->msg.cmd);
/* message data */
if (req->msg.data_len) {
@ -1791,19 +1807,18 @@ ipmi_lanplus_send_payload(
struct ipmi_rq_entry * entry;
struct ipmi_rq * ipmi_request = payload->payload.ipmi_request.request;
if (verbose >= 1)
lprintf(LOG_DEBUG, "");
lprintf(LOG_DEBUG, ">> Sending IPMI command payload");
lprintf(LOG_DEBUG, ">> netfn : 0x%02x", ipmi_request->msg.netfn);
lprintf(LOG_DEBUG, ">> command : 0x%02x", ipmi_request->msg.cmd);
if (verbose > 1)
{
uint16_t i;
printf("\n");
printf(">> Sending IPMI command payload\n");
printf(">> netfn : 0x%02x\n", ipmi_request->msg.netfn);
printf(">> command : 0x%02x\n", ipmi_request->msg.cmd);
printf(">> data : ");
fprintf(stderr, ">> data : ");
for (i = 0; i < ipmi_request->msg.data_len; ++i)
printf("0x%02x ", ipmi_request->msg.data[i]);
printf("\n\n");
fprintf(stderr, "0x%02x ", ipmi_request->msg.data[i]);
fprintf(stderr, "\n\n");
}
@ -1817,19 +1832,17 @@ ipmi_lanplus_send_payload(
(ipmi_request->msg.cmd == IPMI_GET_CHANNEL_AUTH_CAP) &&
(session->v2_data.bmc_id == 0)) // jme - check
{
if (verbose >= 2)
printf("BUILDING A v1.5 COMMAND\n");
lprintf(LOG_DEBUG+1, "BUILDING A v1.5 COMMAND");
entry = ipmi_lanplus_build_v15_ipmi_cmd(intf, ipmi_request);
}
else
{
if (verbose >= 2)
printf("BUILDING A v2 COMMAND\n");
lprintf(LOG_DEBUG+1, "BUILDING A v2 COMMAND");
entry = ipmi_lanplus_build_v2x_ipmi_cmd(intf, ipmi_request);
}
if (!entry) {
printf("Aborting send command, unable to build.\n");
if (entry == NULL) {
lprintf(LOG_ERR, "Aborting send command, unable to build");
return NULL;
}
@ -1839,8 +1852,7 @@ ipmi_lanplus_send_payload(
else if (payload->payload_type == IPMI_PAYLOAD_TYPE_RMCP_OPEN_REQUEST)
{
if (verbose)
printf(">> SENDING AN OPEN SESSION REQUEST\n\n");
lprintf(LOG_DEBUG, ">> SENDING AN OPEN SESSION REQUEST\n");
assert(session->v2_data.session_state == LANPLUS_STATE_PRESESSION);
ipmi_lanplus_build_v2x_msg(intf, /* in */
@ -1852,8 +1864,7 @@ ipmi_lanplus_send_payload(
else if (payload->payload_type == IPMI_PAYLOAD_TYPE_RAKP_1)
{
if (verbose)
printf(">> SENDING A RAKP 1 MESSAGE \n\n");
lprintf(LOG_DEBUG, ">> SENDING A RAKP 1 MESSAGE\n");
assert(session->v2_data.session_state ==
LANPLUS_STATE_OPEN_SESSION_RECEIEVED);
@ -1866,8 +1877,7 @@ ipmi_lanplus_send_payload(
else if (payload->payload_type == IPMI_PAYLOAD_TYPE_RAKP_3)
{
if (verbose)
printf(">> SENDING A RAKP 3 MESSAGE \n\n");
lprintf(LOG_DEBUG, ">> SENDING A RAKP 3 MESSAGE\n");
assert(session->v2_data.session_state ==
LANPLUS_STATE_RAKP_2_RECEIVED);
@ -1880,8 +1890,7 @@ ipmi_lanplus_send_payload(
else if (payload->payload_type == IPMI_PAYLOAD_TYPE_SOL)
{
if (verbose)
printf(">> SENDING A SOL MESSAGE \n\n");
lprintf(LOG_DEBUG, ">> SENDING A SOL MESSAGE\n");
assert(session->v2_data.session_state == LANPLUS_STATE_ACTIVE);
ipmi_lanplus_build_v2x_msg(intf, /* in */
@ -1892,9 +1901,8 @@ ipmi_lanplus_send_payload(
else
{
printf("we dont yet support sending other payload types (0x%0x)!\n",
payload->payload_type);
lprintf(LOG_ERR, "Payload type 0x%0x is unsupported!",
payload->payload_type);
assert(0);
}
@ -1903,7 +1911,7 @@ ipmi_lanplus_send_payload(
if (ipmi_lan_send_packet(intf, msg_data, msg_length) < 0) {
printf("ipmi_lan_send_cmd failed\n");
lprintf(LOG_ERR, "IPMI LAN send command failed");
return NULL;
}
@ -2305,8 +2313,7 @@ ipmi_get_auth_capabilities_cmd(
rsp = intf->sendrecv(intf, &req);
if (!rsp || rsp->ccode) {
if (rsp == NULL || rsp->ccode > 0) {
/*
* It's very possible that this failed because we asked for IPMI
* v2 data. Ask again, without requesting IPMI v2 data.
@ -2315,9 +2322,13 @@ ipmi_get_auth_capabilities_cmd(
rsp = intf->sendrecv(intf, &req);
if (!rsp || rsp->ccode) {
if (rsp && verbose)
printf("Get Auth Capabilities error: %02x\n", rsp->ccode);
if (rsp == NULL) {
lprintf(LOG_INFO, "Get Auth Capabilities error");
return 1;
}
if (rsp->ccode > 0) {
lprintf(LOG_INFO, "Get Auth Capabilities error: %s",
val2str(rsp->ccode, completion_code_vals));
return 1;
}
}
@ -2359,25 +2370,28 @@ impi_close_session_cmd(struct ipmi_intf * intf)
req.msg.data_len = 4;
rsp = intf->sendrecv(intf, &req);
if (!rsp) {
if (rsp == NULL) {
/* Looks like the session was closed */
lprintf(LOG_ERR, "Close Session command failed");
return -1;
}
if (verbose > 2)
printbuf(rsp->data, rsp->data_len, "close_session");
if (rsp->ccode == 0x87) {
printf("Failed to Close Session: invalid session ID %08lx\n",
(long)intf->session->v2_data.bmc_id);
lprintf(LOG_ERR, "Failed to Close Session: invalid "
"session ID %08lx",
(long)intf->session->v2_data.bmc_id);
return -1;
}
if (rsp->ccode) {
printf("Failed to Close Session: %x\n", rsp->ccode);
if (rsp->ccode > 0) {
lprintf(LOG_ERR, "Close Session command failed: %s",
val2str(rsp->ccode, completion_code_vals));
return -1;
}
if (verbose > 1)
printf("\nClosed Session %08lx\n\n", (long)intf->session->v2_data.bmc_id);
lprintf(LOG_DEBUG, "Closed Session %08lx\n",
(long)intf->session->v2_data.bmc_id);
return 0;
}
@ -2404,6 +2418,11 @@ ipmi_lanplus_open_session(struct ipmi_intf * intf)
* Build an Open Session Request Payload
*/
msg = (uint8_t*)malloc(IPMI_OPEN_SESSION_REQUEST_SIZE);
if (msg == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return -1;
}
memset(msg, 0, IPMI_OPEN_SESSION_REQUEST_SIZE);
msg[0] = 0; /* Message tag */
@ -2469,17 +2488,18 @@ ipmi_lanplus_open_session(struct ipmi_intf * intf)
if (rsp->payload.open_session_response.rakp_return_code !=
IPMI_RAKP_STATUS_NO_ERRORS)
{
if (verbose)
printf("Error in open session response message : %s\n",
val2str(rsp->payload.open_session_response.rakp_return_code,
ipmi_rakp_return_codes));
return rc = 1;
lprintf(LOG_WARNING, "Error in open session response message : %s\n",
val2str(rsp->payload.open_session_response.rakp_return_code,
ipmi_rakp_return_codes));
return -1;
}
else
{
if (rsp->payload.open_session_response.console_id !=
session->v2_data.console_id)
printf("Warning: Console session ID is not what we requested\n");
session->v2_data.console_id) {
lprintf(LOG_WARNING, "Warning: Console session ID is not "
"what we requested");
}
session->v2_data.max_priv_level =
rsp->payload.open_session_response.max_priv_level;
@ -2530,6 +2550,10 @@ ipmi_lanplus_rakp1(struct ipmi_intf * intf)
* Build a RAKP 1 message
*/
msg = (uint8_t*)malloc(IPMI_RAKP1_MESSAGE_SIZE);
if (msg == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return 1;
}
memset(msg, 0, IPMI_RAKP1_MESSAGE_SIZE);
@ -2550,7 +2574,8 @@ ipmi_lanplus_rakp1(struct ipmi_intf * intf)
if (lanplus_rand(session->v2_data.console_rand, 16))
{
// ERROR;
printf("ERROR generating random number in ipmi_lanplus_rakp1\n");
lprintf(LOG_ERR, "ERROR generating random number "
"in ipmi_lanplus_rakp1");
return 1;
}
memcpy(msg + 8, session->v2_data.console_rand, 16);
@ -2578,8 +2603,9 @@ ipmi_lanplus_rakp1(struct ipmi_intf * intf)
msg[27] = strlen(session->username);
if (msg[27] > IPMI_MAX_USER_NAME_LENGTH)
{
printf("ERROR: user name too long. (Exceeds %d characters)\n",
IPMI_MAX_USER_NAME_LENGTH);
lprintf(LOG_ERR, "ERROR: user name too long. "
"(Exceeds %d characters)",
IPMI_MAX_USER_NAME_LENGTH);
return 1;
}
memcpy(msg + 28, session->username, msg[27]);
@ -2591,10 +2617,9 @@ ipmi_lanplus_rakp1(struct ipmi_intf * intf)
rsp = ipmi_lanplus_send_payload(intf, &v2_payload);
if (! rsp)
if (rsp == NULL)
{
if (verbose)
printf("> Error: no response from RAKP 1 message\n");
lprintf(LOG_INFO, "> Error: no response from RAKP 1 message");
return 1;
}
@ -2607,10 +2632,9 @@ ipmi_lanplus_rakp1(struct ipmi_intf * intf)
if (rsp->payload.rakp2_message.rakp_return_code != IPMI_RAKP_STATUS_NO_ERRORS)
{
if (verbose)
printf("RAKP 2 message indicates an error : %s\n",
val2str(rsp->payload.rakp2_message.rakp_return_code,
ipmi_rakp_return_codes));
lprintf(LOG_INFO, "RAKP 2 message indicates an error : %s",
val2str(rsp->payload.rakp2_message.rakp_return_code,
ipmi_rakp_return_codes));
rc = 1;
}
@ -2627,8 +2651,7 @@ ipmi_lanplus_rakp1(struct ipmi_intf * intf)
rsp->payload.rakp2_message.key_exchange_auth_code))
{
/* Error */
if (verbose)
printf("> RAKP 2 HMAC is invalid\n");
lprintf(LOG_INFO, "> RAKP 2 HMAC is invalid");
session->v2_data.rakp2_return_code = IPMI_RAKP_STATUS_INVALID_INTEGRITY_CHECK_VALUE;
}
else
@ -2673,6 +2696,10 @@ ipmi_lanplus_rakp3(struct ipmi_intf * intf)
* Build a RAKP 3 message
*/
msg = (uint8_t*)malloc(IPMI_RAKP3_MESSAGE_MAX_SIZE);
if (msg == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return 1;
}
memset(msg, 0, IPMI_RAKP3_MESSAGE_MAX_SIZE);
@ -2705,9 +2732,7 @@ ipmi_lanplus_rakp3(struct ipmi_intf * intf)
if (lanplus_generate_rakp3_authcode(msg + 8, session, &auth_length))
{
/* Error */
if (verbose)
printf("> Error generating RAKP 3 authcode\n");
lprintf(LOG_INFO, "> Error generating RAKP 3 authcode");
return 1;
}
else
@ -2720,22 +2745,19 @@ ipmi_lanplus_rakp3(struct ipmi_intf * intf)
if (lanplus_generate_sik(session))
{
/* Error */
if (verbose)
printf("> Error generating session integrity key\n");
lprintf(LOG_INFO, "> Error generating session integrity key");
return 1;
}
else if (lanplus_generate_k1(session))
{
/* Error */
if (verbose)
printf("> Error generating K1 key\n");
lprintf(LOG_INFO, "> Error generating K1 key");
return 1;
}
else if (lanplus_generate_k2(session))
{
/* Error */
if (verbose)
printf("> Error generating K1 key\n");
lprintf(LOG_INFO, "> Error generating K1 key");
return 1;
}
}
@ -2752,10 +2774,9 @@ ipmi_lanplus_rakp3(struct ipmi_intf * intf)
*/
return 1;
}
else if (! rsp)
else if (rsp == NULL)
{
if (verbose)
printf("> Error: no response from RAKP 3 message\n");
lprintf(LOG_INFO, "> Error: no response from RAKP 3 message");
return 1;
}
@ -2769,10 +2790,9 @@ ipmi_lanplus_rakp3(struct ipmi_intf * intf)
if (rsp->payload.open_session_response.rakp_return_code != IPMI_RAKP_STATUS_NO_ERRORS)
{
if (verbose)
printf("RAKP 4 message indicates an error : %s\n",
val2str(rsp->payload.rakp4_message.rakp_return_code,
ipmi_rakp_return_codes));
lprintf(LOG_INFO, "RAKP 4 message indicates an error : %s",
val2str(rsp->payload.rakp4_message.rakp_return_code,
ipmi_rakp_return_codes));
return 1;
}
@ -2788,8 +2808,7 @@ ipmi_lanplus_rakp3(struct ipmi_intf * intf)
else
{
/* Error */
if (verbose)
printf("> RAKP 4 message has invalid integrity check value\n");
lprintf(LOG_INFO, "> RAKP 4 message has invalid integrity check value");
return 1;
}
}
@ -2846,8 +2865,8 @@ ipmi_lanplus_open(struct ipmi_intf * intf)
if (!session->privlvl)
session->privlvl = IPMI_SESSION_PRIV_USER;
if (!session->hostname) {
printf("No hostname specified!\n");
if (session->hostname == NULL || strlen(session->hostname) == 0) {
lprintf(LOG_ERR, "No hostname specified!");
return -1;
}
@ -2876,21 +2895,21 @@ ipmi_lanplus_open(struct ipmi_intf * intf)
rc = inet_pton(AF_INET, session->hostname, &addr.sin_addr);
if (rc <= 0) {
struct hostent *host = gethostbyname(session->hostname);
if (!host) {
printf("address lookup failed\n");
if (host == NULL) {
lprintf(LOG_ERR, "Address lookup for %s failed",
session->hostname);
return -1;
}
addr.sin_family = host->h_addrtype;
memcpy(&addr.sin_addr, host->h_addr, host->h_length);
}
if (verbose > 1)
printf("IPMI LAN host %s port %d\n",
session->hostname, ntohs(addr.sin_port));
lprintf(LOG_DEBUG, "IPMI LAN host %s port %d",
session->hostname, ntohs(addr.sin_port));
intf->fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (intf->fd < 0) {
perror("socket failed");
lperror(LOG_ERR, "Socket failed");
return -1;
}
@ -2899,7 +2918,7 @@ ipmi_lanplus_open(struct ipmi_intf * intf)
rc = connect(intf->fd,
(struct sockaddr *)&addr, sizeof(struct sockaddr_in));
if (rc < 0) {
perror("connect failed");
lperror(LOG_ERR, "Connect failed");
intf->close(intf);
return -1;
}
@ -2907,8 +2926,9 @@ ipmi_lanplus_open(struct ipmi_intf * intf)
/* setup alarm handler */
act.sa_handler = query_alarm;
act.sa_flags = 0;
if (!sigemptyset(&act.sa_mask) && sigaction(SIGALRM, &act, NULL) < 0) {
perror("alarm signal");
if (sigemptyset(&act.sa_mask) == 0 &&
sigaction(SIGALRM, &act, NULL) < 0) {
lperror(LOG_ERR, "alarm signal");
intf->close(intf);
return -1;
}
@ -2925,17 +2945,15 @@ ipmi_lanplus_open(struct ipmi_intf * intf)
sleep(1);
if (ipmi_get_auth_capabilities_cmd(intf, &auth_cap));
{
if (verbose)
printf("Error issuing Get Channel Authentication "
"Capabilies request\n");
lprintf(LOG_INFO, "Error issuing Get Channel "
"Authentication Capabilies request");
goto fail;
}
}
if (! auth_cap.v20_data_available)
{
if (verbose)
printf("This BMC does not support IPMI v2 / RMCP+\n");
lprintf(LOG_INFO, "This BMC does not support IPMI v2 / RMCP+");
goto fail;
}
@ -2965,13 +2983,12 @@ ipmi_lanplus_open(struct ipmi_intf * intf)
}
if (verbose)
printf("IPMIv2 / RMCP+ SESSION OPENED SUCCESSFULLY\n\n");
lprintf(LOG_DEBUG, "IPMIv2 / RMCP+ SESSION OPENED SUCCESSFULLY\n");
return intf->fd;
fail:
printf("Error: Unable to establish IPMI v2 / RMCP+ session\n");
lprintf(LOG_ERR, "Error: Unable to establish IPMI v2 / RMCP+ session");
intf->opened = 0;
return -1;
}
@ -3003,7 +3020,7 @@ void test_crypt1()
encrypt_buffer,
&bytes_encrypted))
{
printf("test encrypt failed\n");
lprintf(LOG_ERR, "Encrypt test failed");
assert(0);
}
printbuf(encrypt_buffer, bytes_encrypted, "encrypted payload");
@ -3016,12 +3033,12 @@ void test_crypt1()
decrypt_buffer,
&bytes_decrypted))
{
printf("test decrypt failed\n");
lprintf(LOG_ERR, "Decrypt test failed\n");
assert(0);
}
printbuf(decrypt_buffer, bytes_decrypted, "decrypted payload");
printf("\nDone testing the encrypt/decyrpt methods!\n\n");
lprintf(LOG_DEBUG, "\nDone testing the encrypt/decyrpt methods!\n");
exit(0);
}
@ -3038,9 +3055,9 @@ void test_crypt2()
uint8_t * data = "12345678";
char encrypt_buffer[1000];
char decrypt_buffer[1000];
int bytes_encrypted;
int bytes_decrypted;
char decrypt_buffer[1000];
int bytes_encrypted;
int bytes_decrypted;
printbuf(data, strlen(data), "input data");
@ -3060,7 +3077,7 @@ void test_crypt2()
&bytes_decrypted);
printbuf(decrypt_buffer, bytes_decrypted, "decrypt_buffer");
printf("\nDone testing the encrypt/decyrpt methods!\n\n");
lprintf(LOG_INFO, "\nDone testing the encrypt/decyrpt methods!\n");
exit(0);
}
@ -3081,7 +3098,13 @@ ipmi_lanplus_keepalive(struct ipmi_intf * intf)
return 0;
rsp = intf->sendrecv(intf, &req);
return (!rsp || rsp->ccode) ? -1 : 0;
if (rsp == NULL)
return -1;
if (rsp->ccode > 0)
return -1;
return 0;
}
@ -3091,12 +3114,16 @@ ipmi_lanplus_keepalive(struct ipmi_intf * intf)
static int ipmi_lanplus_setup(struct ipmi_intf * intf)
{
//test_crypt1();
assert("lanplus_intf_setup");
assert("ipmi_lanplus_setup");
if (lanplus_seed_prng(16))
return -1;
intf->session = malloc(sizeof(struct ipmi_session));
if (intf->session == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return -1;
}
memset(intf->session, 0, sizeof(struct ipmi_session));
return (intf->session) ? 0 : -1;
return 0;
}

View File

@ -38,6 +38,7 @@
#include <string.h>
#include <config.h>
#include <ipmitool/bswap.h>
#include <ipmitool/log.h>
#include "lanplus.h"
#include "lanplus_crypt.h"
#include "lanplus_crypt_impl.h"
@ -98,6 +99,10 @@ int lanplus_rakp2_hmac_matches(const struct ipmi_session * session,
strlen(session->username); /* optional */
buffer = malloc(bufferLength);
if (buffer == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return 1;
}
/*
* Fill the buffer. I'm assuming that we're using the LSBF representation of the
@ -232,6 +237,10 @@ int lanplus_rakp4_hmac_matches(const struct ipmi_session * session,
16; /* GUIDc */
buffer = (char*)malloc(bufferLength);
if (buffer == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return 1;
}
/*
* Fill the buffer. I'm assuming that we're using the LSBF representation of the
@ -348,6 +357,10 @@ int lanplus_generate_rakp3_authcode(char * output_buffer,
strlen(session->username);
input_buffer = malloc(input_buffer_length);
if (input_buffer == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return 1;
}
/*
* Fill the buffer. I'm assuming that we're using the LSBF representation of the
@ -458,6 +471,10 @@ int lanplus_generate_sik(struct ipmi_session * session)
strlen(session->username);
input_buffer = malloc(input_buffer_length);
if (input_buffer == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return 1;
}
/*
* Fill the buffer. I'm assuming that we're using the LSBF representation of the
@ -501,7 +518,7 @@ int lanplus_generate_sik(struct ipmi_session * session)
* using Kg. It specifies that Kg should not be truncated, but I
* do not know what is meant by that.
*/
printf("lanplus_generate_sik: We dont yet support hashing with Kg");
lprintf(LOG_ERR, "lanplus_generate_sik: We dont yet support hashing with Kg");
assert(0);
input_key = session->v2_data.kg;
@ -658,7 +675,7 @@ int lanplus_encrypt_payload(uint8_t crypt_alg,
if (crypt_alg == IPMI_CRYPT_NONE)
{
printf("NOT ENCRYPTING\n");
lprintf(LOG_WARNING, "NOT ENCRYPTING");
/* Just copy the input to the output */
*bytes_written = input_length;
return 0;
@ -679,6 +696,10 @@ int lanplus_encrypt_payload(uint8_t crypt_alg,
pad_length = IPMI_CRYPT_AES_CBC_128_BLOCK_SIZE - mod;
padded_input = (uint8_t*)malloc(input_length + pad_length + 1);
if (padded_input == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return 1;
}
memcpy(padded_input, input, input_length);
/* add the pad */
@ -691,8 +712,7 @@ int lanplus_encrypt_payload(uint8_t crypt_alg,
/* Generate an initialization vector, IV, for the encryption process */
if (lanplus_rand(output, IPMI_CRYPT_AES_CBC_128_BLOCK_SIZE))
{
printf("lanplus_encrypt_payload: Error generating IV\n");
assert(0);
lprintf(LOG_ERR, "lanplus_encrypt_payload: Error generating IV");
return 1;
}
@ -774,7 +794,7 @@ int lanplus_has_valid_auth_code(struct ipmi_rs * rs,
if (verbose > 3)
{
printf("Validating authcode\n");
lprintf(LOG_DEBUG+2, "Validating authcode");
printbuf(session->v2_data.k1, 20, "K1");
printbuf(rs->data + IMPI_LANPLUS_OFFSET_AUTHTYPE,
rs->data_len - IMPI_LANPLUS_OFFSET_AUTHTYPE - IPMI_SHA1_AUTHCODE_SIZE,
@ -824,6 +844,11 @@ int lanplus_decrypt_payload(uint8_t crypt_alg,
assert(crypt_alg == IPMI_CRYPT_AES_CBC_128);
decrypted_payload = (uint8_t*)malloc(input_length);
if (decrypted_payload == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
return 1;
}
lanplus_decrypt_aes_cbc_128(input, /* IV */
key, /* Key */
@ -859,14 +884,14 @@ int lanplus_decrypt_payload(uint8_t crypt_alg,
{
if (decrypted_payload[*payload_size + i] == i)
{
printf("ERROR: Malformed payload padding\n");
lprintf(LOG_ERR, "Malformed payload padding");
assert(0);
}
}
}
else
{
printf("ERROR: lanplus_decrypt_aes_cbc_128 decryptd 0 bytes\n");
lprintf(LOG_ERR, "ERROR: lanplus_decrypt_aes_cbc_128 decryptd 0 bytes");
assert(0);
}

View File

@ -128,7 +128,7 @@ lanplus_HMAC(uint8_t mac,
evp_md = EVP_sha1();
else
{
printf("Invalid mac type 0x%x in lanplus_HMAC\n", mac);
fprintf(stderr, "Invalid mac type 0x%x in lanplus_HMAC\n", mac);
assert(0);
}
@ -259,10 +259,10 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
assert((input_length % IPMI_CRYPT_AES_CBC_128_BLOCK_SIZE) == 0);
if(!EVP_DecryptUpdate(&ctx, output, bytes_written, input, input_length))
if (!EVP_DecryptUpdate(&ctx, output, bytes_written, input, input_length))
{
/* Error */
printf("ERROR: decrypt update failed\n");
fprintf(stderr, "ERROR: decrypt update failed");
*bytes_written = 0;
return;
}
@ -270,12 +270,12 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
{
uint32_t tmplen;
if(!EVP_DecryptFinal_ex(&ctx, output + *bytes_written, &tmplen))
if (!EVP_DecryptFinal_ex(&ctx, output + *bytes_written, &tmplen))
{
char buffer[1000];
ERR_error_string(ERR_get_error(), buffer);
printf("the ERR error %s\n", buffer);
printf("ERROR: decrypt final failed\n");
fprintf(stderr, "the ERR error %s", buffer);
fprintf(stderr, "ERROR: decrypt final failed");
*bytes_written = 0;
return; /* Error */
}
@ -289,7 +289,7 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv,
if (verbose > 1)
{
printf("Decrypted %d encrypted bytes\n", input_length);
fprintf(stderr, "Decrypted %d encrypted bytes", input_length);
printbuf(output, *bytes_written, "Decrypted this data");
}
}