diff --git a/include/ipmitool/ipmi_intf.h b/include/ipmitool/ipmi_intf.h index 2ca409f..68668ed 100644 --- a/include/ipmitool/ipmi_intf.h +++ b/include/ipmitool/ipmi_intf.h @@ -241,6 +241,15 @@ struct ipmi_intf { void (*set_max_response_data_size)(struct ipmi_intf * intf, uint16_t size); }; +/* Interface method wrappers to perform any host-specific actions */ +struct ipmi_rs *ipmi_sendrecv(struct ipmi_intf * intf, struct ipmi_rq * req); +struct ipmi_rs *ipmi_recv_sol(struct ipmi_intf * intf); +struct ipmi_rs *ipmi_send_sol(struct ipmi_intf * intf, struct ipmi_v2_payload * payload); +int ipmi_keepalive(struct ipmi_intf * intf); +int ipmi_set_my_addr(struct ipmi_intf * intf, uint8_t addr); +void ipmi_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size); +void ipmi_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size); + struct ipmi_intf * ipmi_intf_load(char * name); void ipmi_intf_print(struct ipmi_intf_support * intflist); diff --git a/src/ipmitool.c b/src/ipmitool.c index 3ee8b50..2b7a691 100644 --- a/src/ipmitool.c +++ b/src/ipmitool.c @@ -132,6 +132,12 @@ main(int argc, char ** argv) { int rc; +#ifdef WORDS_BIGENDIAN + printf("BIG ENDIAN\n"); +#else + printf("LITTLE ENDIAN\n"); +#endif + rc = ipmi_main(argc, argv, ipmitool_cmd_list, NULL); if (rc < 0) diff --git a/src/plugins/ipmi_intf.c b/src/plugins/ipmi_intf.c index f6bd2f6..f223490 100644 --- a/src/plugins/ipmi_intf.c +++ b/src/plugins/ipmi_intf.c @@ -623,3 +623,53 @@ ipmi_intf_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size) intf->max_response_data_size = size; } } + +/* + * Interface method wrappers. + * Do any host-specific things like byteswapping here. + * Command-specific data manipulation is not done here, + * only the common headers are mangled. + */ +struct ipmi_rs *ipmi_sendrecv(struct ipmi_intf * intf, struct ipmi_rq * req) +{ + struct ipmi_rs *rsp; + + /* Data length must be in IPMI order (LE) */ + htoipmi16(req->msg.data_len, &req->msg.data_len); + rsp = intf->sendrecv(intf, req); + if (rsp) { + rsp->data_len = ipmi16toh(&rsp->data_len); + } + + return rsp; +} + +struct ipmi_rs *ipmi_recv_sol(struct ipmi_intf * intf) +{ + return intf->recv_sol(intf); +} + +struct ipmi_rs *ipmi_send_sol(struct ipmi_intf * intf, struct ipmi_v2_payload * payload) +{ + return intf->send_sol(intf, payload); +} + +int ipmi_keepalive(struct ipmi_intf * intf) +{ + return intf->keepalive(intf); +} + +int ipmi_set_my_addr(struct ipmi_intf * intf, uint8_t addr) +{ + return intf->set_my_addr(intf, addr); +} + +void ipmi_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size) +{ + intf->set_max_request_data_size(intf, size); +} + +void ipmi_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size) +{ + intf->set_max_response_data_size(intf, size); +} diff --git a/src/plugins/lanplus/lanplus.c b/src/plugins/lanplus/lanplus.c index b7dfc3d..4591078 100644 --- a/src/plugins/lanplus/lanplus.c +++ b/src/plugins/lanplus/lanplus.c @@ -909,46 +909,38 @@ void read_open_session_response(struct ipmi_rs * rsp, int offset) { memset(&rsp->payload.open_session_response, 0, - sizeof(rsp->payload.open_session_response)); + sizeof(rsp->payload.open_session_response)); - /* Message tag */ - rsp->payload.open_session_response.message_tag = rsp->data[offset]; + /* Message tag */ + rsp->payload.open_session_response.message_tag = rsp->data[offset]; - /* RAKP response code */ - rsp->payload.open_session_response.rakp_return_code = rsp->data[offset + 1]; + /* RAKP response code */ + rsp->payload.open_session_response.rakp_return_code = rsp->data[offset + 1]; - /* Maximum privilege level */ - rsp->payload.open_session_response.max_priv_level = rsp->data[offset + 2]; + /* Maximum privilege level */ + rsp->payload.open_session_response.max_priv_level = rsp->data[offset + 2]; - /*** offset + 3 is reserved ***/ + /*** offset + 3 is reserved ***/ - /* Remote console session ID */ - memcpy(&(rsp->payload.open_session_response.console_id), - rsp->data + offset + 4, - 4); - #if WORDS_BIGENDIAN - rsp->payload.open_session_response.console_id = - BSWAP_32(rsp->payload.open_session_response.console_id); - #endif + /* Remote console session ID */ + rsp->payload.open_session_response.console_id + = ipmi32toh(&rsp->data[offset + 4]); /* only tag, status, privlvl, and console id are returned if error */ - if (rsp->payload.open_session_response.rakp_return_code != - IPMI_RAKP_STATUS_NO_ERRORS) - return; + if (rsp->payload.open_session_response.rakp_return_code + != IPMI_RAKP_STATUS_NO_ERRORS) + { + return; + } - /* BMC session ID */ - memcpy(&(rsp->payload.open_session_response.bmc_id), - rsp->data + offset + 8, - 4); - #if WORDS_BIGENDIAN - rsp->payload.open_session_response.bmc_id = - BSWAP_32(rsp->payload.open_session_response.bmc_id); - #endif + /* BMC session ID */ + rsp->payload.open_session_response.bmc_id + = ipmi32toh(&rsp->data[offset + 8]); - /* And of course, our negotiated algorithms */ - rsp->payload.open_session_response.auth_alg = rsp->data[offset + 16]; - rsp->payload.open_session_response.integrity_alg = rsp->data[offset + 24]; - rsp->payload.open_session_response.crypt_alg = rsp->data[offset + 32]; + /* And of course, our negotiated algorithms */ + rsp->payload.open_session_response.auth_alg = rsp->data[offset + 16]; + rsp->payload.open_session_response.integrity_alg = rsp->data[offset + 24]; + rsp->payload.open_session_response.crypt_alg = rsp->data[offset + 32]; } @@ -976,13 +968,13 @@ read_rakp2_message( int offset, uint8_t auth_alg) { - int i; + int i; - /* Message tag */ - rsp->payload.rakp2_message.message_tag = rsp->data[offset]; + /* Message tag */ + rsp->payload.rakp2_message.message_tag = rsp->data[offset]; - /* RAKP response code */ - rsp->payload.rakp2_message.rakp_return_code = rsp->data[offset + 1]; + /* RAKP response code */ + rsp->payload.rakp2_message.rakp_return_code = rsp->data[offset + 1]; /* Console session ID */ rsp->payload.rakp2_message.console_id = ipmi32toh(&rsp->data[offset + 4]); @@ -1004,38 +996,39 @@ read_rakp2_message( /* Nothing to do here */ break; - case IPMI_AUTH_RAKP_HMAC_SHA1: - /* We need to copy 20 bytes */ - for (i = 0; i < IPMI_SHA_DIGEST_LENGTH; ++i) { - rsp->payload.rakp2_message.key_exchange_auth_code[i] = - rsp->data[offset + 40 + i]; - } - break; + case IPMI_AUTH_RAKP_HMAC_SHA1: + /* We need to copy 20 bytes */ + for (i = 0; i < IPMI_SHA_DIGEST_LENGTH; ++i) { + rsp->payload.rakp2_message.key_exchange_auth_code[i] + = rsp->data[offset + 40 + i]; + } + break; - case IPMI_AUTH_RAKP_HMAC_MD5: - /* We need to copy 16 bytes */ - for (i = 0; i < IPMI_MD5_DIGEST_LENGTH; ++i) { - rsp->payload.rakp2_message.key_exchange_auth_code[i] = - rsp->data[offset + 40 + i]; - } - break; + case IPMI_AUTH_RAKP_HMAC_MD5: + /* We need to copy 16 bytes */ + for (i = 0; i < IPMI_MD5_DIGEST_LENGTH; ++i) { + rsp->payload.rakp2_message.key_exchange_auth_code[i] + = rsp->data[offset + 40 + i]; + } + break; #ifdef HAVE_CRYPTO_SHA256 - case IPMI_AUTH_RAKP_HMAC_SHA256: - /* We need to copy 32 bytes */ - for (i = 0; i < IPMI_SHA256_DIGEST_LENGTH; ++i) { - rsp->payload.rakp2_message.key_exchange_auth_code[i] = - rsp->data[offset + 40 + i]; - } - break; + case IPMI_AUTH_RAKP_HMAC_SHA256: + /* We need to copy 32 bytes */ + for (i = 0; i < IPMI_SHA256_DIGEST_LENGTH; ++i) { + rsp->payload.rakp2_message.key_exchange_auth_code[i] + = rsp->data[offset + 40 + i]; + } + break; #endif /* HAVE_CRYPTO_SHA256 */ - default: - lprintf(LOG_ERR, "read_rakp2_message: no support " - "for authentication algorithm 0x%x", auth_alg); - assert(0); - break; - } + default: + lprintf(LOG_ERR, + "read_rakp2_message: no support " + "for authentication algorithm 0x%x", auth_alg); + assert(0); + break; + } }