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 > Ipmitool-devel@lists.sourceforge.net > 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 Ipmitool-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ipmitool-devel