From e31ba93a23291f8dc708e5143f1b4f26cd28ccab Mon Sep 17 00:00:00 2001 From: Carol Hebert Date: Thu, 8 Jan 2009 23:32:39 +0000 Subject: [PATCH] Dmitry Konyshev's 7/23/08 fix for lan driver issue with bridging msgs for IPMI sessions without authentication; allow handling of AMC.0- and uTCA-style bridging --- ipmitool/src/plugins/lan/lan.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/ipmitool/src/plugins/lan/lan.c b/ipmitool/src/plugins/lan/lan.c index 6fc9730..c5038f7 100644 --- a/ipmitool/src/plugins/lan/lan.c +++ b/ipmitool/src/plugins/lan/lan.c @@ -575,25 +575,38 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf) "bridge command response"); } /* bridged command: lose extra header */ - if (rsp->payload.ipmi_response.cmd == 0x34) { - if (rsp->data_len == 38) { + if (rsp->payload.ipmi_response.netfn == 7 && + rsp->payload.ipmi_response.cmd == 0x34) { + 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[34] >> 2) == entry->rq_seq) { + (rsp->data[x - 3] >> 2) == entry->rq_seq) { /* double bridging: remove the Send Message prologue */ - memmove(rsp->data + 29, rsp->data + 36, - rsp->data_len - 36); - rsp->data[28] -= 8; + 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[34] >> 2; + entry->rq_seq = rsp->data[x - 3] >> 2; } entry->req.msg.cmd = entry->req.msg.target_cmd; if (rsp == NULL) { 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; } } else { //x += sizeof(rsp->payload.ipmi_response);