Now sending SOL data to the BMC

This commit is contained in:
Jeremy Ellington 2004-07-19 21:02:08 +00:00
parent e687d531a3
commit c5246ce35d
2 changed files with 104 additions and 17 deletions

View File

@ -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();

View File

@ -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));