From c5246ce35d8aaec832ac1c01521ae99f2cc89ddd Mon Sep 17 00:00:00 2001 From: Jeremy Ellington Date: Mon, 19 Jul 2004 21:02:08 +0000 Subject: [PATCH] Now sending SOL data to the BMC --- ipmitool/lib/ipmi_sol.c | 76 ++++++++++++++++++++++---- ipmitool/src/plugins/lanplus/lanplus.c | 45 +++++++++++++-- 2 files changed, 104 insertions(+), 17 deletions(-) diff --git a/ipmitool/lib/ipmi_sol.c b/ipmitool/lib/ipmi_sol.c index 29680fe..add2220 100644 --- a/ipmitool/lib/ipmi_sol.c +++ b/ipmitool/lib/ipmi_sol.c @@ -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(); diff --git a/ipmitool/src/plugins/lanplus/lanplus.c b/ipmitool/src/plugins/lanplus/lanplus.c index 7276c99..62e55ec 100644 --- a/ipmitool/src/plugins/lanplus/lanplus.c +++ b/ipmitool/src/plugins/lanplus/lanplus.c @@ -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));