mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47: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)
|
||||
{
|
||||
struct ipmi_v2_payload v2_payload;
|
||||
char buffer[255];
|
||||
int bShouldExit = 0;
|
||||
fd_set read_fds;
|
||||
@ -709,26 +710,35 @@ static int ipmi_sol_red_pill(struct ipmi_intf * intf)
|
||||
/*
|
||||
* Received input from the user
|
||||
*/
|
||||
bzero(buffer, sizeof(buffer));
|
||||
num_read = read(0, buffer, sizeof(buffer));
|
||||
printf("read %d characters\n", num_read);
|
||||
printf("buffer : %s\n", buffer);
|
||||
bzero(&v2_payload, sizeof(v2_payload));
|
||||
v2_payload.payload_length =
|
||||
read(0,
|
||||
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))
|
||||
{
|
||||
/*
|
||||
* Received input from the BMC
|
||||
* Received input from the BMC.
|
||||
*/
|
||||
char buffer[256];
|
||||
int i;
|
||||
|
||||
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);
|
||||
printf("sol data is %d bytes\n", rs->data_len);
|
||||
for (i = 0; i < rs->data_len; ++i)
|
||||
putc(rs->data[i], 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
|
||||
*/
|
||||
@ -932,6 +979,13 @@ int ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
else if (!strncmp(argv[0], "activate", 8))
|
||||
retval = ipmi_sol_activate(intf);
|
||||
|
||||
/*
|
||||
* Dectivate
|
||||
*/
|
||||
else if (!strncmp(argv[0], "deactivate", 10))
|
||||
retval = ipmi_sol_deactivate(intf);
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
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_ipmi_response(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 = {
|
||||
.open = ipmi_lanplus_open,
|
||||
.close = ipmi_lanplus_close,
|
||||
.sendrecv = ipmi_lanplus_send_ipmi_cmd,
|
||||
.recv_sol = ipmi_lanplus_recv_sol
|
||||
/* .send_sol = ipmi_lanplus_send_sol */
|
||||
.recv_sol = ipmi_lanplus_recv_sol,
|
||||
.send_sol = ipmi_lanplus_send_sol
|
||||
};
|
||||
|
||||
|
||||
@ -524,8 +526,6 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
|
||||
rsp->session.msglen,
|
||||
rsp->data + offset,
|
||||
&payload_size);
|
||||
|
||||
printf("DECRYPTING PAYLOAD size %d\n", payload_size);
|
||||
}
|
||||
else
|
||||
payload_size = rsp->session.msglen;
|
||||
@ -665,6 +665,8 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
|
||||
rsp->data_len = extra_data_length;
|
||||
memmove(rsp->data, rsp->data + offset, extra_data_length);
|
||||
}
|
||||
else
|
||||
rsp->data_len = 0;
|
||||
|
||||
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
|
||||
*
|
||||
@ -1888,7 +1921,7 @@ struct ipmi_rs * ipmi_lanplus_recv_sol(struct ipmi_intf * intf)
|
||||
struct ipmi_rs * rsp = ipmi_lan_poll_recv(intf);
|
||||
|
||||
/* If the SOL packet looks good, ACK it */
|
||||
if (rsp)
|
||||
if (rsp && (rsp->data_len > 4))
|
||||
{
|
||||
bzero(&ack, sizeof(struct ipmi_v2_payload));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user