summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Johnson <mjj29@adonis.trinhall.cam.ac.uk>2009-03-22 17:04:37 +0000
committerMatthew Johnson <mjj29@adonis.trinhall.cam.ac.uk>2009-03-22 17:04:37 +0000
commit26e1ac5bc4e2ba9c26f1384e6c1dc06ec078a7d6 (patch)
tree99a5e61c6d1b97f12be365a46a769db259a35a89
parent1a8c2fc5969f76999cc067a3065c2942fc675882 (diff)
final ipmitool changes
-rw-r--r--debian/patches/20_ipmi_isol695
-rw-r--r--debian/patches/series1
2 files changed, 0 insertions, 696 deletions
diff --git a/debian/patches/20_ipmi_isol b/debian/patches/20_ipmi_isol
deleted file mode 100644
index 85e684f..0000000
--- a/debian/patches/20_ipmi_isol
+++ /dev/null
@@ -1,695 +0,0 @@
-## 20_ipmi_isol.dpatch by <mjj29@debian.org>
-##
-## 20_ipmi_isol, closes #412816
-Index: ipmitool-1.8.11/include/ipmitool/ipmi_isol.h.orig
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ ipmitool-1.8.11/include/ipmitool/ipmi_isol.h.orig 2009-03-22 16:48:34.633972562 +0000
-@@ -0,0 +1,56 @@
-+/*
-+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ *
-+ * Redistribution of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ *
-+ * Redistribution in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name of Sun Microsystems, Inc. or the names of
-+ * contributors may be used to endorse or promote products derived
-+ * from this software without specific prior written permission.
-+ *
-+ * This software is provided "AS IS," without a warranty of any kind.
-+ * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
-+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
-+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
-+ * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
-+ * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
-+ * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
-+ * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
-+ * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
-+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
-+ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
-+ * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-+ */
-+
-+#ifndef IPMI_ISOL_H
-+#define IPMI_ISOL_H
-+
-+#include <ipmitool/ipmi.h>
-+
-+#define ACTIVATE_ISOL 0x01
-+#define SET_ISOL_CONFIG 0x03
-+#define GET_ISOL_CONFIG 0x04
-+
-+#define ISOL_ENABLE_PARAM 0x01
-+#define ISOL_AUTHENTICATION_PARAM 0x02
-+#define ISOL_ENABLE_FLAG 0x01
-+#define ISOL_PRIVILEGE_LEVEL_USER 0x02
-+#define ISOL_BAUD_RATE_PARAM 0x05
-+#define ISOL_BAUD_RATE_9600 0x06
-+#define ISOL_BAUD_RATE_19200 0x07
-+#define ISOL_BAUD_RATE_38400 0x08
-+#define ISOL_BAUD_RATE_57600 0x09
-+#define ISOL_BAUD_RATE_115200 0x0A
-+#define ISOL_PREFERRED_BAUD_RATE 0x07
-+
-+int ipmi_isol_main(struct ipmi_intf *, int, char **);
-+
-+#endif /* IPMI_SOL_H */
-Index: ipmitool-1.8.11/lib/ipmi_isol.c.orig
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ ipmitool-1.8.11/lib/ipmi_isol.c.orig 2009-03-22 16:48:34.661974936 +0000
-@@ -0,0 +1,191 @@
-+/*
-+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ *
-+ * Redistribution of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ *
-+ * Redistribution in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * Neither the name of Sun Microsystems, Inc. or the names of
-+ * contributors may be used to endorse or promote products derived
-+ * from this software without specific prior written permission.
-+ *
-+ * This software is provided "AS IS," without a warranty of any kind.
-+ * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
-+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
-+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
-+ * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
-+ * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
-+ * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
-+ * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
-+ * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
-+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
-+ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
-+ * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-+ */
-+
-+#include <stdlib.h>
-+#include <string.h>
-+#include <stdio.h>
-+
-+#include <ipmitool/helper.h>
-+#include <ipmitool/log.h>
-+#include <ipmitool/ipmi.h>
-+#include <ipmitool/ipmi_strings.h>
-+#include <ipmitool/ipmi_intf.h>
-+#include <ipmitool/ipmi_isol.h>
-+
-+const struct valstr ipmi_isol_baud_vals[] = {
-+ { ISOL_BAUD_RATE_9600, "9600" },
-+ { ISOL_BAUD_RATE_19200, "19200" },
-+ { ISOL_BAUD_RATE_38400, "38400" },
-+ { ISOL_BAUD_RATE_57600, "57600" },
-+ { ISOL_BAUD_RATE_115200, "115200" },
-+ { 0x00, NULL }
-+};
-+
-+extern int verbose;
-+
-+static int ipmi_isol_setup(struct ipmi_intf * intf, char baudsetting)
-+{
-+ struct ipmi_rs * rsp;
-+ struct ipmi_rq req;
-+ unsigned char data[6];
-+
-+ /* TEST FOR AVAILABILITY */
-+
-+ memset(data, 0, 6);
-+ data[0] = 0x00;
-+ data[1] = ISOL_ENABLE_PARAM;
-+ data[2] = ISOL_ENABLE_FLAG;
-+
-+ memset(&req, 0, sizeof(req));
-+ req.msg.netfn = IPMI_NETFN_ISOL;
-+ req.msg.cmd = SET_ISOL_CONFIG;
-+ req.msg.data = data;
-+ req.msg.data_len = 3;
-+
-+ rsp = intf->sendrecv(intf, &req);
-+ if (rsp == NULL) {
-+ lprintf(LOG_ERR, "Error in Set ISOL Config Command");
-+ return -1;
-+ }
-+ if (rsp->ccode == 0xc1) {
-+ lprintf(LOG_ERR, "IPMI v1.5 Serial Over Lan (ISOL) not supported!");
-+ return -1;
-+ }
-+ if (rsp->ccode > 0) {
-+ lprintf(LOG_ERR, "Error in Set ISOL Config Command: %s",
-+ val2str(rsp->ccode, completion_code_vals));
-+ return -1;
-+ }
-+
-+ /* GET ISOL CONFIG */
-+
-+ memset(data, 0, 6);
-+ data[0] = 0x00;
-+ data[1] = ISOL_AUTHENTICATION_PARAM;
-+ data[2] = 0x00; /* block */
-+ data[3] = 0x00; /* selector */
-+ req.msg.cmd = GET_ISOL_CONFIG;
-+ req.msg.data_len = 4;
-+
-+ rsp = intf->sendrecv(intf, &req);
-+ if (rsp == NULL) {
-+ lprintf(LOG_ERR, "Error in Get ISOL Config Command");
-+ return -1;
-+ }
-+ if (rsp->ccode > 0) {
-+ lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s",
-+ val2str(rsp->ccode, completion_code_vals));
-+ return -1;
-+ }
-+
-+ if (verbose > 1)
-+ printbuf(rsp->data, rsp->data_len, "ISOL Config");
-+
-+ /* SET ISOL CONFIG - AUTHENTICATION */
-+
-+ memset(data, 0, 6);
-+ data[0] = 0x00;
-+ data[1] = ISOL_AUTHENTICATION_PARAM;
-+ data[2] = ISOL_PRIVILEGE_LEVEL_USER | (rsp->data[1] & 0x80);
-+ req.msg.cmd = SET_ISOL_CONFIG;
-+ req.msg.data_len = 3;
-+
-+ rsp = intf->sendrecv(intf, &req);
-+ if (rsp == NULL) {
-+ lprintf(LOG_ERR, "Error in Set ISOL Config (Authentication) Command");
-+ return -1;
-+ }
-+ if (rsp->ccode > 0) {
-+ lprintf(LOG_ERR, "Error in Set ISOL Config (Authentication) Command: %s",
-+ val2str(rsp->ccode, completion_code_vals));
-+ return -1;
-+ }
-+
-+ /* SET ISOL CONFIG - BAUD RATE */
-+
-+ memset(data, 0, 6);
-+ data[0] = 0x00;
-+ data[1] = ISOL_BAUD_RATE_PARAM;
-+ data[2] = baudsetting;
-+ req.msg.cmd = SET_ISOL_CONFIG;
-+ req.msg.data_len = 3;
-+
-+ rsp = intf->sendrecv(intf, &req);
-+ if (rsp == NULL) {
-+ lprintf(LOG_ERR, "Error in Set ISOL Config (Baud Rate) Command");
-+ return -1;
-+ }
-+ if (rsp->ccode > 0) {
-+ lprintf(LOG_ERR, "Error in Set ISOL Config (Baud Rate) Command: %s",
-+ val2str(rsp->ccode, completion_code_vals));
-+ return -1;
-+ }
-+
-+ printf("Set ISOL Baud Rate to %s\n",
-+ val2str(baudsetting, ipmi_isol_baud_vals));
-+
-+ return 0;
-+}
-+
-+int ipmi_isol_main(struct ipmi_intf * intf, int argc, char ** argv)
-+{
-+ int ret = 0;
-+
-+ if (argc < 2 || strncmp(argv[0], "help", 4) == 0) {
-+ lprintf(LOG_NOTICE, "ISOL Commands: setup <baud>");
-+ lprintf(LOG_NOTICE, "ISOL Baud Rates: 9600, 19200, 38400, 57600, 115200");
-+ return 0;
-+ }
-+
-+ if (strncmp(argv[0], "setup", 5) == 0) {
-+ if (strncmp(argv[1], "9600", 4) == 0) {
-+ ret = ipmi_isol_setup(intf, ISOL_BAUD_RATE_9600);
-+ }
-+ else if (strncmp(argv[1], "19200", 5) == 0) {
-+ ret = ipmi_isol_setup(intf, ISOL_BAUD_RATE_19200);
-+ }
-+ else if (strncmp(argv[1], "38400", 5) == 0) {
-+ ret = ipmi_isol_setup(intf, ISOL_BAUD_RATE_38400);
-+ }
-+ else if (strncmp(argv[1], "57600", 5) == 0) {
-+ ret = ipmi_isol_setup(intf, ISOL_BAUD_RATE_57600);
-+ }
-+ else if (strncmp(argv[1], "115200", 6) == 0) {
-+ ret = ipmi_isol_setup(intf, ISOL_BAUD_RATE_115200);
-+ }
-+ else {
-+ lprintf(LOG_ERR, "ISOL - Unsupported baud rate: %s", argv[1]);
-+ ret = -1;
-+ }
-+ }
-+ return ret;
-+}
-Index: ipmitool-1.8.11/src/plugins/lan/lan.c
-===================================================================
---- ipmitool-1.8.11.orig/src/plugins/lan/lan.c 2009-02-25 20:38:53.000000000 +0000
-+++ ipmitool-1.8.11/src/plugins/lan/lan.c 2009-03-22 16:48:34.681976632 +0000
-@@ -1448,6 +1448,430 @@
- return rsp;
- }
-
-+/*
-+ * IPMI SOL Payload Format
-+ * +--------------------+
-+ * | rmcp.ver | 4 bytes
-+ * | rmcp.__reserved |
-+ * | rmcp.seq |
-+ * | rmcp.class |
-+ * +--------------------+
-+ * | session.authtype | 9 bytes
-+ * | session.seq |
-+ * | session.id |
-+ * +--------------------+
-+ * | message length | 1 byte
-+ * +--------------------+
-+ * | sol.seq | 5 bytes
-+ * | sol.ack_seq |
-+ * | sol.acc_count |
-+ * | sol.control |
-+ * | sol.__reserved |
-+ * +--------------------+
-+ * | [request data] | data_len bytes
-+ * +--------------------+
-+ */
-+uint8_t * ipmi_lan_build_sol_msg(struct ipmi_intf * intf,
-+ struct ipmi_v2_payload * payload,
-+ int * llen)
-+{
-+ struct rmcp_hdr rmcp = {
-+ .ver = RMCP_VERSION_1,
-+ .class = RMCP_CLASS_IPMI,
-+ .seq = 0xff,
-+ };
-+ struct ipmi_session * session = intf->session;
-+
-+ /* msg will hold the entire message to be sent */
-+ uint8_t * msg;
-+
-+ int len = 0;
-+
-+ len = sizeof(rmcp) + // RMCP Header (4)
-+ 10 + // IPMI Session Header
-+ 5 + // SOL header
-+ payload->payload.sol_packet.character_count; // The actual payload
-+
-+ msg = malloc(len);
-+ if (msg == NULL) {
-+ lprintf(LOG_ERR, "ipmitool: malloc failure");
-+ return;
-+ }
-+ memset(msg, 0, len);
-+
-+ /* rmcp header */
-+ memcpy(msg, &rmcp, sizeof(rmcp));
-+ len = sizeof(rmcp);
-+
-+ /* ipmi session header */
-+ msg[len++] = 0; /* SOL is always authtype = NONE */
-+ msg[len++] = session->in_seq & 0xff;
-+ msg[len++] = (session->in_seq >> 8) & 0xff;
-+ msg[len++] = (session->in_seq >> 16) & 0xff;
-+ msg[len++] = (session->in_seq >> 24) & 0xff;
-+
-+ msg[len++] = session->session_id & 0xff;
-+ msg[len++] = (session->session_id >> 8) & 0xff;
-+ msg[len++] = (session->session_id >> 16) & 0xff;
-+ msg[len++] = ((session->session_id >> 24) + 0x10) & 0xff; /* Add 0x10 to MSB for SOL */
-+
-+ msg[len++] = payload->payload.sol_packet.character_count + 5;
-+
-+ /* sol header */
-+ msg[len++] = payload->payload.sol_packet.packet_sequence_number;
-+ msg[len++] = payload->payload.sol_packet.acked_packet_number;
-+ msg[len++] = payload->payload.sol_packet.accepted_character_count;
-+ msg[len] = payload->payload.sol_packet.is_nack ? 0x40 : 0;
-+ msg[len] |= payload->payload.sol_packet.assert_ring_wor ? 0x20 : 0;
-+ msg[len] |= payload->payload.sol_packet.generate_break ? 0x10 : 0;
-+ msg[len] |= payload->payload.sol_packet.deassert_cts ? 0x08 : 0;
-+ msg[len] |= payload->payload.sol_packet.deassert_dcd_dsr ? 0x04 : 0;
-+ msg[len] |= payload->payload.sol_packet.flush_inbound ? 0x02 : 0;
-+ msg[len++] |= payload->payload.sol_packet.flush_outbound ? 0x01 : 0;
-+
-+ len++; /* On SOL there's and additional fifth byte before the data starts */
-+
-+ if (payload->payload.sol_packet.character_count) {
-+ /* We may have data to add */
-+ memcpy(msg + len,
-+ payload->payload.sol_packet.data,
-+ payload->payload.sol_packet.character_count);
-+ len += payload->payload.sol_packet.character_count;
-+ }
-+
-+ session->in_seq++;
-+ if (session->in_seq == 0)
-+ session->in_seq++;
-+
-+ *llen = len;
-+ return msg;
-+}
-+
-+/*
-+ * is_sol_packet
-+ */
-+static int
-+is_sol_packet(struct ipmi_rs * rsp)
-+{
-+ return (rsp &&
-+ (rsp->session.payloadtype == IPMI_PAYLOAD_TYPE_SOL));
-+}
-+
-+
-+
-+/*
-+ * sol_response_acks_packet
-+ */
-+static int
-+sol_response_acks_packet(struct ipmi_rs * rsp,
-+ struct ipmi_v2_payload * payload)
-+{
-+ return (is_sol_packet(rsp) &&
-+ payload &&
-+ (payload->payload_type == IPMI_PAYLOAD_TYPE_SOL) &&
-+ (rsp->payload.sol_packet.acked_packet_number ==
-+ payload->payload.sol_packet.packet_sequence_number));
-+}
-+
-+/*
-+ * ipmi_lan_send_sol_payload
-+ *
-+ */
-+static struct ipmi_rs *
-+ipmi_lan_send_sol_payload(struct ipmi_intf * intf,
-+ struct ipmi_v2_payload * payload)
-+{
-+ struct ipmi_rs * rsp = NULL;
-+ uint8_t * msg;
-+ int len;
-+ int try = 0;
-+
-+ if (intf->opened == 0 && intf->open != NULL) {
-+ if (intf->open(intf) < 0)
-+ return NULL;
-+ }
-+
-+ msg = ipmi_lan_build_sol_msg(intf, payload, &len);
-+ if (len <= 0 || msg == NULL) {
-+ lprintf(LOG_ERR, "Invalid SOL payload packet");
-+ if (msg != NULL)
-+ free(msg);
-+ return NULL;
-+ }
-+
-+ lprintf(LOG_DEBUG, ">> SENDING A SOL MESSAGE\n");
-+
-+ for (;;) {
-+ if (ipmi_lan_send_packet(intf, msg, len) < 0) {
-+ try++;
-+ usleep(5000);
-+ continue;
-+ }
-+
-+ /* if we are set to noanswer we do not expect response */
-+ if (intf->noanswer)
-+ break;
-+
-+ if (payload->payload.sol_packet.packet_sequence_number == 0) {
-+ /* We're just sending an ACK. No need to retry. */
-+ break;
-+ }
-+
-+ usleep(100);
-+
-+ rsp = ipmi_lan_recv_sol(intf); /* Grab the next packet */
-+
-+ if (sol_response_acks_packet(rsp, payload))
-+ break;
-+
-+ else if (is_sol_packet(rsp) && rsp->data_len)
-+ {
-+ /*
-+ * We're still waiting for our ACK, but we more data from
-+ * the BMC
-+ */
-+ intf->session->sol_data.sol_input_handler(rsp);
-+ }
-+
-+ usleep(5000);
-+ if (++try >= intf->session->retry) {
-+ lprintf(LOG_DEBUG, " No response from remote controller");
-+ break;
-+ }
-+ }
-+
-+ return rsp;
-+}
-+
-+/*
-+ * is_sol_partial_ack
-+ *
-+ * Determine if the response is a partial ACK/NACK that indicates
-+ * we need to resend part of our packet.
-+ *
-+ * returns the number of characters we need to resend, or
-+ * 0 if this isn't an ACK or we don't need to resend anything
-+ */
-+static int is_sol_partial_ack(struct ipmi_v2_payload * v2_payload,
-+ struct ipmi_rs * rsp)
-+{
-+ int chars_to_resend = 0;
-+
-+ if (v2_payload &&
-+ rsp &&
-+ is_sol_packet(rsp) &&
-+ sol_response_acks_packet(rsp, v2_payload) &&
-+ (rsp->payload.sol_packet.accepted_character_count <
-+ v2_payload->payload.sol_packet.character_count))
-+ {
-+ if (rsp->payload.sol_packet.accepted_character_count == 0) {
-+ /* We should not resend data */
-+ chars_to_resend = 0;
-+ }
-+ else
-+ {
-+ chars_to_resend =
-+ v2_payload->payload.sol_packet.character_count -
-+ rsp->payload.sol_packet.accepted_character_count;
-+ }
-+ }
-+
-+ return chars_to_resend;
-+}
-+
-+/*
-+ * set_sol_packet_sequence_number
-+ */
-+static void set_sol_packet_sequence_number(struct ipmi_intf * intf,
-+ struct ipmi_v2_payload * v2_payload)
-+{
-+ /* Keep our sequence number sane */
-+ if (intf->session->sol_data.sequence_number > 0x0F)
-+ intf->session->sol_data.sequence_number = 1;
-+
-+ v2_payload->payload.sol_packet.packet_sequence_number =
-+ intf->session->sol_data.sequence_number++;
-+}
-+
-+/*
-+ * ipmi_lan_send_sol
-+ *
-+ * Sends a SOL packet.. We handle partial ACK/NACKs from the BMC here.
-+ *
-+ * Returns a pointer to the SOL ACK we received, or
-+ * 0 on failure
-+ *
-+ */
-+struct ipmi_rs *
-+ipmi_lan_send_sol(struct ipmi_intf * intf,
-+ struct ipmi_v2_payload * v2_payload)
-+{
-+ struct ipmi_rs * rsp;
-+ int chars_to_resend = 0;
-+
-+ 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 */
-+
-+ set_sol_packet_sequence_number(intf, v2_payload);
-+
-+ v2_payload->payload.sol_packet.accepted_character_count = 0; /* NA */
-+
-+ rsp = ipmi_lan_send_sol_payload(intf, v2_payload);
-+
-+ /* Determine if we need to resend some of our data */
-+ chars_to_resend = is_sol_partial_ack(v2_payload, rsp);
-+
-+ while (chars_to_resend)
-+ {
-+ /*
-+ * We first need to handle any new data we might have
-+ * received in our NACK
-+ */
-+ if (rsp->data_len)
-+ intf->session->sol_data.sol_input_handler(rsp);
-+
-+ set_sol_packet_sequence_number(intf, v2_payload);
-+
-+ /* Just send the required data */
-+ memmove(v2_payload->payload.sol_packet.data,
-+ v2_payload->payload.sol_packet.data +
-+ rsp->payload.sol_packet.accepted_character_count,
-+ chars_to_resend);
-+
-+ v2_payload->payload.sol_packet.character_count = chars_to_resend;
-+
-+ rsp = ipmi_lan_send_sol_payload(intf, v2_payload);
-+
-+ chars_to_resend = is_sol_partial_ack(v2_payload, rsp);
-+ }
-+
-+ return rsp;
-+}
-+
-+/*
-+ * check_sol_packet_for_new_data
-+ *
-+ * Determine whether the SOL packet has already been seen
-+ * and whether the packet has new data for us.
-+ *
-+ * This function has the side effect of removing an previously
-+ * seen data, and moving new data to the front.
-+ *
-+ * It also "Remembers" the data so we don't get repeats.
-+ *
-+ */
-+static int
-+check_sol_packet_for_new_data(struct ipmi_intf * intf,
-+ struct ipmi_rs *rsp)
-+{
-+ static uint8_t last_received_sequence_number = 0;
-+ static uint8_t last_received_byte_count = 0;
-+ int new_data_size = 0;
-+
-+ if (rsp &&
-+ (rsp->session.payloadtype == IPMI_PAYLOAD_TYPE_SOL))
-+
-+ {
-+ uint8_t unaltered_data_len = rsp->data_len;
-+ if (rsp->payload.sol_packet.packet_sequence_number ==
-+ last_received_sequence_number)
-+ {
-+ /*
-+ * This is the same as the last packet, but may include
-+ * extra data
-+ */
-+ new_data_size = rsp->data_len - last_received_byte_count;
-+
-+ if (new_data_size > 0)
-+ {
-+ /* We have more data to process */
-+ memmove(rsp->data,
-+ rsp->data +
-+ rsp->data_len - new_data_size,
-+ new_data_size);
-+ }
-+
-+ rsp->data_len = new_data_size;
-+ }
-+
-+ /*
-+ *Rember the data for next round
-+ */
-+ if (rsp && rsp->payload.sol_packet.packet_sequence_number)
-+ {
-+ last_received_sequence_number =
-+ rsp->payload.sol_packet.packet_sequence_number;
-+ last_received_byte_count = unaltered_data_len;
-+ }
-+ }
-+
-+ return new_data_size;
-+}
-+
-+/*
-+ * ack_sol_packet
-+ *
-+ * Provided the specified packet looks reasonable, ACK it.
-+ */
-+static void
-+ack_sol_packet(struct ipmi_intf * intf,
-+ struct ipmi_rs * rsp)
-+{
-+ if (rsp &&
-+ (rsp->session.payloadtype == IPMI_PAYLOAD_TYPE_SOL) &&
-+ (rsp->payload.sol_packet.packet_sequence_number))
-+ {
-+ struct ipmi_v2_payload ack;
-+
-+ memset(&ack, 0, sizeof(struct ipmi_v2_payload));
-+
-+ ack.payload_type = IPMI_PAYLOAD_TYPE_SOL;
-+
-+ /*
-+ * Payload length is just the length of the character
-+ * data here.
-+ */
-+ ack.payload_length = 0;
-+
-+ /* ACK packets have sequence numbers of 0 */
-+ ack.payload.sol_packet.packet_sequence_number = 0;
-+
-+ ack.payload.sol_packet.acked_packet_number =
-+ rsp->payload.sol_packet.packet_sequence_number;
-+
-+ ack.payload.sol_packet.accepted_character_count = rsp->data_len;
-+
-+ ipmi_lan_send_sol_payload(intf, &ack);
-+ }
-+}
-+
-+/*
-+ * ipmi_recv_sol
-+ *
-+ * Receive a SOL packet and send an ACK in response.
-+ *
-+ */
-+struct ipmi_rs *
-+ipmi_lan_recv_sol(struct ipmi_intf * intf)
-+{
-+ struct ipmi_rs * rsp = ipmi_lan_poll_recv(intf);
-+
-+ ack_sol_packet(intf, rsp);
-+
-+ /*
-+ * Remembers the data sent, and alters the data to just
-+ * include the new stuff.
-+ */
-+ check_sol_packet_for_new_data(intf, rsp);
-+
-+ return rsp;
-+}
-+
- /* send a get device id command to keep session active */
- static int
- ipmi_lan_keepalive(struct ipmi_intf * intf)
diff --git a/debian/patches/series b/debian/patches/series
index 8b22901..f9de264 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1 @@
-20_ipmi_isol
99_readme_typo