mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-11 19:17:22 +00:00
Now sending SOL data to the BMC
This commit is contained in:
parent
e687d531a3
commit
c5246ce35d
@ -675,6 +675,7 @@ static int ipmi_sol_set_param(struct ipmi_intf * intf,
|
|||||||
*/
|
*/
|
||||||
static int ipmi_sol_red_pill(struct ipmi_intf * intf)
|
static int ipmi_sol_red_pill(struct ipmi_intf * intf)
|
||||||
{
|
{
|
||||||
|
struct ipmi_v2_payload v2_payload;
|
||||||
char buffer[255];
|
char buffer[255];
|
||||||
int bShouldExit = 0;
|
int bShouldExit = 0;
|
||||||
fd_set read_fds;
|
fd_set read_fds;
|
||||||
@ -709,26 +710,35 @@ static int ipmi_sol_red_pill(struct ipmi_intf * intf)
|
|||||||
/*
|
/*
|
||||||
* Received input from the user
|
* Received input from the user
|
||||||
*/
|
*/
|
||||||
bzero(buffer, sizeof(buffer));
|
bzero(&v2_payload, sizeof(v2_payload));
|
||||||
num_read = read(0, buffer, sizeof(buffer));
|
v2_payload.payload_length =
|
||||||
printf("read %d characters\n", num_read);
|
read(0,
|
||||||
printf("buffer : %s\n", buffer);
|
v2_payload.payload.sol_packet.data,
|
||||||
|
sizeof(v2_payload.payload.sol_packet.data));
|
||||||
|
|
||||||
|
if (v2_payload.payload_length > 0)
|
||||||
|
{
|
||||||
|
if (intf->send_sol(intf, &v2_payload))
|
||||||
|
{
|
||||||
|
printf("Error sending SOL data\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* ERROR */
|
||||||
|
perror("read of remote console input");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (FD_ISSET(intf->fd, &read_fds))
|
else if (FD_ISSET(intf->fd, &read_fds))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Received input from the BMC
|
* Received input from the BMC.
|
||||||
*/
|
*/
|
||||||
char buffer[256];
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
bzero(buffer, sizeof(buffer));
|
bzero(buffer, sizeof(buffer));
|
||||||
|
//printf("The BMC has data for us...\n");
|
||||||
printf("The BMC has data for us...\n");
|
|
||||||
|
|
||||||
struct ipmi_rs * rs =intf->recv_sol(intf);
|
struct ipmi_rs * rs =intf->recv_sol(intf);
|
||||||
printf("sol data is %d bytes\n", rs->data_len);
|
|
||||||
for (i = 0; i < rs->data_len; ++i)
|
for (i = 0; i < rs->data_len; ++i)
|
||||||
putc(rs->data[i], stdout);
|
putc(rs->data[i], stdout);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
@ -747,6 +757,43 @@ static int ipmi_sol_red_pill(struct ipmi_intf * intf)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* impi_sol_deactivate
|
||||||
|
*/
|
||||||
|
static int ipmi_sol_deactivate(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char data[6];
|
||||||
|
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = IPMI_DEACTIVATE_PAYLOAD;
|
||||||
|
req.msg.data_len = 6;
|
||||||
|
req.msg.data = data;
|
||||||
|
|
||||||
|
bzero(data, sizeof(data));
|
||||||
|
data[0] = IPMI_PAYLOAD_TYPE_SOL; /* payload type */
|
||||||
|
data[1] = 1; /* payload instance. Guess! */
|
||||||
|
|
||||||
|
/* Lots of important data */
|
||||||
|
data[2] = 0;
|
||||||
|
data[3] = 0;
|
||||||
|
data[4] = 0;
|
||||||
|
data[5] = 0;
|
||||||
|
|
||||||
|
//rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x Dectivating SOL payload\n",
|
||||||
|
rsp ? rsp->ccode : 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* impi_sol_activate
|
* impi_sol_activate
|
||||||
*/
|
*/
|
||||||
@ -932,6 +979,13 @@ int ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
else if (!strncmp(argv[0], "activate", 8))
|
else if (!strncmp(argv[0], "activate", 8))
|
||||||
retval = ipmi_sol_activate(intf);
|
retval = ipmi_sol_activate(intf);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dectivate
|
||||||
|
*/
|
||||||
|
else if (!strncmp(argv[0], "deactivate", 10))
|
||||||
|
retval = ipmi_sol_deactivate(intf);
|
||||||
|
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
print_sol_usage();
|
print_sol_usage();
|
||||||
|
@ -101,15 +101,17 @@ static void read_session_data_v15(struct ipmi_rs * rsp, int * offset, struct ipm
|
|||||||
static void read_session_data_v2x(struct ipmi_rs * rsp, int * offset, struct ipmi_session *s);
|
static void read_session_data_v2x(struct ipmi_rs * rsp, int * offset, struct ipmi_session *s);
|
||||||
static void read_ipmi_response(struct ipmi_rs * rsp, int * offset);
|
static void read_ipmi_response(struct ipmi_rs * rsp, int * offset);
|
||||||
static void read_sol_packet(struct ipmi_rs * rsp, int * offset);
|
static void read_sol_packet(struct ipmi_rs * rsp, int * offset);
|
||||||
struct ipmi_rs * ipmi_lanplus_recv_sol(struct ipmi_intf * intf);
|
static struct ipmi_rs * ipmi_lanplus_recv_sol(struct ipmi_intf * intf);
|
||||||
|
static int ipmi_lanplus_send_sol(struct ipmi_intf * intf,
|
||||||
|
struct ipmi_v2_payload * payload);
|
||||||
|
|
||||||
|
|
||||||
struct ipmi_intf ipmi_lanplus_intf = {
|
struct ipmi_intf ipmi_lanplus_intf = {
|
||||||
.open = ipmi_lanplus_open,
|
.open = ipmi_lanplus_open,
|
||||||
.close = ipmi_lanplus_close,
|
.close = ipmi_lanplus_close,
|
||||||
.sendrecv = ipmi_lanplus_send_ipmi_cmd,
|
.sendrecv = ipmi_lanplus_send_ipmi_cmd,
|
||||||
.recv_sol = ipmi_lanplus_recv_sol
|
.recv_sol = ipmi_lanplus_recv_sol,
|
||||||
/* .send_sol = ipmi_lanplus_send_sol */
|
.send_sol = ipmi_lanplus_send_sol
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -524,8 +526,6 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
|
|||||||
rsp->session.msglen,
|
rsp->session.msglen,
|
||||||
rsp->data + offset,
|
rsp->data + offset,
|
||||||
&payload_size);
|
&payload_size);
|
||||||
|
|
||||||
printf("DECRYPTING PAYLOAD size %d\n", payload_size);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
payload_size = rsp->session.msglen;
|
payload_size = rsp->session.msglen;
|
||||||
@ -665,6 +665,8 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
|
|||||||
rsp->data_len = extra_data_length;
|
rsp->data_len = extra_data_length;
|
||||||
memmove(rsp->data, rsp->data + offset, extra_data_length);
|
memmove(rsp->data, rsp->data + offset, extra_data_length);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
rsp->data_len = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1876,6 +1878,37 @@ struct ipmi_rs *
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ipmi_lanplus_send_sol
|
||||||
|
*
|
||||||
|
* Sends a SOL packet
|
||||||
|
*
|
||||||
|
* return 0 on success
|
||||||
|
* -1 on error
|
||||||
|
*/
|
||||||
|
int ipmi_lanplus_send_sol(struct ipmi_intf * intf,
|
||||||
|
struct ipmi_v2_payload * v2_payload)
|
||||||
|
{
|
||||||
|
v2_payload->payload_type = IPMI_PAYLOAD_TYPE_SOL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Payload length is just the length of the character
|
||||||
|
* data here.
|
||||||
|
*/
|
||||||
|
v2_payload->payload.sol_packet.acked_packet_number = 0; /* NA */
|
||||||
|
|
||||||
|
v2_payload->payload.sol_packet.packet_sequence_number =
|
||||||
|
intf->session->sol_data.sequence_number++;
|
||||||
|
|
||||||
|
v2_payload->payload.sol_packet.accepted_character_count = 0; /* NA */
|
||||||
|
|
||||||
|
ipmi_lanplus_send_payload(intf, v2_payload);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ipmi_lanplus_recv_sol
|
* ipmi_lanplus_recv_sol
|
||||||
*
|
*
|
||||||
@ -1888,7 +1921,7 @@ struct ipmi_rs * ipmi_lanplus_recv_sol(struct ipmi_intf * intf)
|
|||||||
struct ipmi_rs * rsp = ipmi_lan_poll_recv(intf);
|
struct ipmi_rs * rsp = ipmi_lan_poll_recv(intf);
|
||||||
|
|
||||||
/* If the SOL packet looks good, ACK it */
|
/* If the SOL packet looks good, ACK it */
|
||||||
if (rsp)
|
if (rsp && (rsp->data_len > 4))
|
||||||
{
|
{
|
||||||
bzero(&ack, sizeof(struct ipmi_v2_payload));
|
bzero(&ack, sizeof(struct ipmi_v2_payload));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user