I've committed these to cvs. If anyone finds a problem with them or
otherwise disagrees, please let me know.
Thank you,
Carol
On Fri, 2009-01-23 at 17:16 +0300, Dmitry Konyshev wrote:
> Hi everybody,
>
> I'd like to provide two patches for review and integration. The patches
> are in the attached.
>
> lan-bridging.patch fixes:
> - a possible crash during double-bridging over LAN
> - potential mess with bridging multiple concurrent requests over LAN
> - erroneous handling of the Send Message command embedded in the
> ipmitool's raw command-line option.
>
> sdr-read-fix.patch fixes a crash when dumping SDRs in a file and there's
> an error getting an SDR. Also, algorithm of finding an optimal packet
> size is improved.
>
> Regards,
> Dmitry
>
> plain text document attachment (lan-bridging.patch)
> Index: include/ipmitool/ipmi.h
> ===================================================================
> RCS file: /cvsroot/ipmitool/ipmitool/include/ipmitool/ipmi.h,v
> retrieving revision 1.31
> diff -p -u -r1.31 ipmi.h
> --- include/ipmitool/ipmi.h 8 Jan 2009 21:21:22 -0000 1.31
> +++ include/ipmitool/ipmi.h 23 Jan 2009 13:18:26 -0000
> @@ -145,6 +145,7 @@ struct ipmi_rq_entry {
> uint8_t rq_seq;
> uint8_t *msg_data;
> int msg_len;
> + int bridging_level;
> struct ipmi_rq_entry *next;
> };
>
> Index: src/plugins/lan/lan.c
> ===================================================================
> RCS file: /cvsroot/ipmitool/ipmitool/src/plugins/lan/lan.c,v
> retrieving revision 1.63
> diff -p -u -r1.63 lan.c
> --- src/plugins/lan/lan.c 9 Jan 2009 21:55:47 -0000 1.63
> +++ src/plugins/lan/lan.c 23 Jan 2009 13:18:27 -0000
> @@ -572,44 +572,36 @@ ipmi_lan_poll_recv(struct ipmi_intf * in
> if (entry) {
> lprintf(LOG_DEBUG+2, "IPMI Request Match
> found");
> if ((intf->target_addr != our_address) &&
> bridge_possible) {
> - if ((rsp->data_len) &&
> + if ((rsp->data_len) &&
> (rsp->payload.ipmi_response.netfn == 7) &&
> (rsp->payload.ipmi_response.cmd !=
> 0x34)) {
> - printbuf(&rsp->data[x],
> rsp->data_len-x,
> - "bridge command
> response");
> + if (verbose > 2)
> + printbuf(&rsp->data[x],
> rsp->data_len-x,
> + "bridge
> command response");
> }
> /* bridged command: lose extra header */
> - if (rsp->payload.ipmi_response.netfn ==
> 7 &&
> - rsp->payload.ipmi_response.cmd
> == 0x34) {
> + if (entry->bridging_level &&
> + rsp->payload.ipmi_response.netfn ==
> 7 &&
> + rsp->payload.ipmi_response.cmd ==
> 0x34) {
> + entry->bridging_level--;
> if (rsp->data_len - x - 1 == 0)
> {
> rsp = !rsp->ccode ?
> ipmi_lan_recv_packet(intf) : NULL;
> - if (rsp && !rsp->ccode
> &&
> -
> intf->transit_addr != intf->my_addr &&
> -
> intf->transit_addr != 0 &&
> - (rsp->data[x - 3]
> >> 2) == entry->rq_seq) {
> - /* double
> bridging: remove the Send Message prologue */
> -
> memmove(rsp->data + x - 7, rsp->data + x,
> -
> rsp->data_len - x - 1);
> - rsp->data[x -
> 8] -= 8;
> - rsp->data_len
> -= 8;
> - entry->rq_seq =
> rsp->data[x - 3] >> 2;
> - }
> - entry->req.msg.cmd =
> entry->req.msg.target_cmd;
> + if
> (!entry->bridging_level)
> +
> entry->req.msg.cmd = entry->req.msg.target_cmd;
> if (rsp == NULL) {
> -
> ipmi_req_remove_entry(entry->rq_seq, entry->req.msg.cmd);
> +
> ipmi_req_remove_entry(entry->rq_seq, entry->req.msg.cmd);
> }
> continue;
> } else {
> - /* The bridged answer data
> are inside the incoming packet */
> - char bridge_cnt =
> - 1 + (intf->transit_addr
> != intf->my_addr && intf->transit_addr != 0);
> - memmove(rsp->data + x - 7,
> - rsp->data + x + 7 *
> (bridge_cnt - 1),
> - rsp->data_len - (x
> + 7 * (bridge_cnt - 1)));
> - rsp->data[x - 8] -= 8 *
> bridge_cnt;
> - rsp->data_len -= 8 *
> bridge_cnt;
> - entry->rq_seq = rsp->data[x
> - 3] >> 2;
> - entry->req.msg.cmd =
> entry->req.msg.target_cmd;
> - continue;
> + /* The bridged answer
> data are inside the incoming packet */
> + memmove(rsp->data + x -
> 7,
> + rsp->data + x,
> + rsp->data_len -
> x - 1);
> + rsp->data[x - 8] -= 8;
> + rsp->data_len -= 8;
> + entry->rq_seq =
> rsp->data[x - 3] >> 2;
> + if
> (!entry->bridging_level)
> +
> entry->req.msg.cmd = entry->req.msg.target_cmd;
> + continue;
> }
> } else {
> //x +=
> sizeof(rsp->payload.ipmi_response);
> @@ -688,7 +680,6 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
> struct ipmi_session * s = intf->session;
> static int curr_seq = 0;
> uint8_t our_address = intf->my_addr;
> - uint8_t bridge_request = 0;
>
> if (our_address == 0)
> our_address = IPMI_BMC_SLAVE_ADDR;
> @@ -735,11 +726,12 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
>
> /* message length */
> if ((intf->target_addr == our_address) || !bridge_possible) {
> + entry->bridging_level = 0;
> msg[len++] = req->msg.data_len + 7;
> cs = mp = len;
> } else {
> /* bridged request: encapsulate w/in Send Message */
> - bridge_request = 1;
> + entry->bridging_level = 1;
> msg[len++] = req->msg.data_len + 15 +
> (intf->transit_addr != intf->my_addr && intf->transit_addr !=
> 0 ? 8 : 0);
> cs = mp = len;
> @@ -757,6 +749,7 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
> if (intf->transit_addr == intf->my_addr || intf->transit_addr
> == 0) {
> msg[len++] = (0x40|intf->target_channel); /* Track
> request*/
> } else {
> + entry->bridging_level++;
> msg[len++] = (0x40|intf->transit_channel); /*
> Track request*/
> cs = len;
> msg[len++] = intf->transit_addr;
> @@ -779,7 +772,7 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
> msg[len++] = ipmi_csum(msg+cs, tmp);
> cs = len;
>
> - if (!bridge_request)
> + if (!entry->bridging_level)
> msg[len++] = IPMI_REMOTE_SWID;
> else /* Bridged message */
> msg[len++] = intf->my_addr;
> @@ -813,7 +806,7 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
> msg[len++] = ipmi_csum(msg+cs, tmp);
>
> /* bridged request: 2nd checksum */
> - if (bridge_request) {
> + if (entry->bridging_level) {
> if (intf->transit_addr != intf->my_addr && intf->transit_addr
> != 0) {
> tmp = len - cs3;
> msg[len++] = ipmi_csum(msg+cs3, tmp);
> plain text document attachment (sdr-read-fix.patch)
> Index: lib/ipmi_sdr.c
> ===================================================================
> RCS file: /cvsroot/ipmitool/ipmitool/lib/ipmi_sdr.c,v
> retrieving revision 1.85
> diff -p -u -r1.85 ipmi_sdr.c
> --- lib/ipmi_sdr.c 9 Jan 2009 22:52:11 -0000 1.85
> +++ lib/ipmi_sdr.c 23 Jan 2009 13:49:03 -0000
> @@ -2679,14 +2679,21 @@ ipmi_sdr_get_record(struct ipmi_intf * i
>
> rsp = intf->sendrecv(intf, &req);
> if (rsp == NULL) {
> + sdr_max_read_len = sdr_rq.length - 1;
> + if (sdr_max_read_len > 0) {
> + /* no response may happen if requests are bridged
> + and too many bytes are requested */
> + continue;
> + } else {
> free(data);
> return NULL;
> + }
> }
>
> switch (rsp->ccode) {
> case 0xca:
> /* read too many bytes at once */
> - sdr_max_read_len = (sdr_max_read_len >> 1) - 1;
> + sdr_max_read_len = sdr_rq.length - 1;
> continue;
> case 0xc5:
> /* lost reservation */
> @@ -3966,6 +3973,11 @@ ipmi_sdr_dump_bin(struct ipmi_intf *intf
> sdrr->length = header->length;
> sdrr->raw = ipmi_sdr_get_record(intf, header, itr);
>
> + if (sdrr->raw == NULL) {
> + lprintf(LOG_ERR, "ipmitool: cannot obtain SDR record %04x",
> header->id);
> + return -1;
> + }
> +
> if (sdr_list_head == NULL)
> sdr_list_head = sdrr;
> else
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by:
> SourcForge Community
> SourceForge wants to tell your story.
> http://p.sf.net/sfu/sf-spreadtheword
> _______________________________________________ Ipmitool-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ipmitool-devel
------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
Ipmitool-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel