From e21475c78d9e7ecbabc7bb2320deaa15f7a61129 Mon Sep 17 00:00:00 2001 From: Duncan Laurie Date: Thu, 26 Jan 2006 21:38:11 +0000 Subject: [PATCH] attempt to fix bridged commands over lan interfaces --- ipmitool/src/plugins/lan/lan.c | 88 +++++++------------- ipmitool/src/plugins/lanplus/lanplus.c | 110 +++++++++++-------------- 2 files changed, 79 insertions(+), 119 deletions(-) diff --git a/ipmitool/src/plugins/lan/lan.c b/ipmitool/src/plugins/lan/lan.c index 13e482d..d4a3710 100644 --- a/ipmitool/src/plugins/lan/lan.c +++ b/ipmitool/src/plugins/lan/lan.c @@ -400,14 +400,10 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf) struct ipmi_rs * rsp; struct ipmi_rq_entry * entry; int x=0, rv; - uint8_t ourAddress = intf->my_addr; - - if(ourAddress == 0) - { - ourAddress = IPMI_BMC_SLAVE_ADDR; - } - - + uint8_t ourAddress = intf->my_addr; + + if (ourAddress == 0) + ourAddress = IPMI_BMC_SLAVE_ADDR; rsp = ipmi_lan_recv_packet(intf); @@ -486,29 +482,19 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf) rsp->payload.ipmi_response.cmd); if (entry) { lprintf(LOG_DEBUG+2, "IPMI Request Match found"); - if ( - (intf->target_addr != ourAddress) && - (bridgePossible) - ) - { - if( - (rsp->data_len) && - (rsp->payload.ipmi_response.cmd != 0x34) - ) - { - printbuf( - &rsp->data[x], - (rsp->data_len-x), - "bridge command response"); - } + if ((intf->target_addr != ourAddress) && bridgePossible) { + if ((rsp->data_len) && + (rsp->payload.ipmi_response.cmd != 0x34)) { + printbuf(&rsp->data[x], rsp->data_len-x, + "bridge command response"); + } /* bridged command: lose extra header */ if (rsp->payload.ipmi_response.cmd == 0x34) { - if( rsp->data_len == 38 ) - { - entry->req.msg.cmd = entry->req.msg.target_cmd; - rsp = ipmi_lan_recv_packet(intf); - continue; - } + if (rsp->data_len == 38) { + entry->req.msg.cmd = entry->req.msg.target_cmd; + rsp = ipmi_lan_recv_packet(intf); + continue; + } } else { //x += sizeof(rsp->payload.ipmi_response); if (rsp->data[x-1] != 0) @@ -523,7 +509,7 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf) lprintf(LOG_INFO, "IPMI Request Match NOT FOUND"); rsp = ipmi_lan_recv_packet(intf); continue; - } + } break; } @@ -582,13 +568,11 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req) struct ipmi_rq_entry * entry; struct ipmi_session * s = intf->session; static int curr_seq = 0; - uint8_t ourAddress = intf->my_addr; - uint8_t bridgedRequest = 0; - - if(ourAddress == 0) - { - ourAddress = IPMI_BMC_SLAVE_ADDR; - } + uint8_t ourAddress = intf->my_addr; + uint8_t bridgedRequest = 0; + + if (ourAddress == 0) + ourAddress = IPMI_BMC_SLAVE_ADDR; if (curr_seq >= 64) curr_seq = 0; @@ -596,7 +580,7 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req) entry = ipmi_req_add_entry(intf, req); if (entry == NULL) return NULL; - + len = req->msg.data_len + 29; if (s->active && s->authtype) len += 16; @@ -629,22 +613,15 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req) } /* message length */ - if ( - (intf->target_addr == ourAddress) || - (!bridgePossible) - ) - { + if ((intf->target_addr == ourAddress) || !bridgePossible) { msg[len++] = req->msg.data_len + 7; cs = mp = len; - } - else - { + } else { /* bridged request: encapsulate w/in Send Message */ - bridgedRequest = 1; + bridgedRequest = 1; msg[len++] = req->msg.data_len + 15; cs = mp = len; msg[len++] = IPMI_BMC_SLAVE_ADDR; - msg[len++] = IPMI_NETFN_APP << 2; tmp = len - cs; msg[len++] = ipmi_csum(msg+cs, tmp); @@ -660,15 +637,16 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req) /* ipmi message header */ msg[len++] = intf->target_addr; - msg[len++] = req->msg.netfn << 2; + msg[len++] = req->msg.netfn << 2 | (req->msg.lun & 3); tmp = len - cs; msg[len++] = ipmi_csum(msg+cs, tmp); cs = len; - if (!bridgedRequest) - msg[len++] = IPMI_REMOTE_SWID; - else /* Bridged message */ - msg[len++] = intf->my_addr; + if (!bridgedRequest) + msg[len++] = IPMI_REMOTE_SWID; + else /* Bridged message */ + msg[len++] = intf->my_addr; + entry->rq_seq = curr_seq++; msg[len++] = entry->rq_seq << 2; msg[len++] = req->msg.cmd; @@ -698,13 +676,11 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req) msg[len++] = ipmi_csum(msg+cs, tmp); /* bridged request: 2nd checksum */ - if (bridgedRequest) - { + if (bridgedRequest) { tmp = len - cs2; msg[len++] = ipmi_csum(msg+cs2, tmp); } - if (s->active) { /* * s->authcode is already copied to msg+ap but some diff --git a/ipmitool/src/plugins/lanplus/lanplus.c b/ipmitool/src/plugins/lanplus/lanplus.c index c59650b..2113c94 100644 --- a/ipmitool/src/plugins/lanplus/lanplus.c +++ b/ipmitool/src/plugins/lanplus/lanplus.c @@ -1327,67 +1327,54 @@ void read_sol_packet(struct ipmi_rs * rsp, int * offset) * param rq_seq [in] is the IPMI command sequence number. */ void getIpmiPayloadWireRep( - struct ipmi_intf * intf, /* in out */ - struct ipmi_v2_payload * payload, /* in */ + struct ipmi_intf * intf, /* in out */ + struct ipmi_v2_payload * payload, /* in */ uint8_t * msg, struct ipmi_rq * req, uint8_t rq_seq, - uint8_t curr_seq) + uint8_t curr_seq) { - int cs, /*mp,*/ tmp, len; - + int cs, tmp, len; int cs2 = 0; - - uint8_t ourAddress = intf->my_addr; - uint8_t bridgedRequest = 0; - - if(ourAddress == 0) - { - ourAddress = IPMI_BMC_SLAVE_ADDR; - } - - len = 0; + uint8_t ourAddress = intf->my_addr; + uint8_t bridgedRequest = 0; + + if (ourAddress == 0) + ourAddress = IPMI_BMC_SLAVE_ADDR; + + len = 0; /* IPMI Message Header -- Figure 13-4 of the IPMI v2.0 spec */ - if ( - (intf->target_addr == ourAddress) || - (!bridgePossible) - ) - { - cs = len; - } - else - { - /* bridged request: encapsulate w/in Send Message */ - bridgedRequest = 1; - - cs = len; - - msg[len++] = IPMI_BMC_SLAVE_ADDR; - - msg[len++] = IPMI_NETFN_APP << 2; - tmp = len - cs; - msg[len++] = ipmi_csum(msg+cs, tmp); - cs2 = len; - msg[len++] = IPMI_REMOTE_SWID; - msg[len++] = curr_seq << 2; - msg[len++] = 0x34; /* Send Message rqst */ -#if 0 /* From lan.c example */ - entry->req.msg.target_cmd = entry->req.msg.cmd; /* Save target command */ - entry->req.msg.cmd = 0x34; /* (fixup request entry) */ -#endif - msg[len++] = (0x40|intf->target_channel); /* Track request*/ - - payload->payload_length += 7; - + if ((intf->target_addr == ourAddress) || (!bridgePossible)) cs = len; - } + else { + /* bridged request: encapsulate w/in Send Message */ + bridgedRequest = 1; + cs = len; + msg[len++] = IPMI_BMC_SLAVE_ADDR; + msg[len++] = IPMI_NETFN_APP << 2; + tmp = len - cs; + msg[len++] = ipmi_csum(msg+cs, tmp); + cs2 = len; + msg[len++] = IPMI_REMOTE_SWID; + msg[len++] = curr_seq << 2; + msg[len++] = 0x34; /* Send Message rqst */ +#if 0 /* From lan.c example */ + entry->req.msg.target_cmd = entry->req.msg.cmd; /* Save target command */ + entry->req.msg.cmd = 0x34; /* (fixup request entry) */ +#endif + msg[len++] = (0x40|intf->target_channel); /* Track request*/ + + payload->payload_length += 7; + + cs = len; + } /* rsAddr */ msg[len++] = intf->target_addr; /* IPMI_BMC_SLAVE_ADDR; */ /* net Fn */ - msg[len++] = req->msg.netfn << 2; + msg[len++] = req->msg.netfn << 2 | (req->msg.lun & 3); tmp = len - cs; /* checkSum */ @@ -1395,10 +1382,10 @@ void getIpmiPayloadWireRep( cs = len; /* rqAddr */ - if (!bridgedRequest) - msg[len++] = IPMI_REMOTE_SWID; - else /* Bridged message */ - msg[len++] = intf->my_addr; + if (!bridgedRequest) + msg[len++] = IPMI_REMOTE_SWID; + else /* Bridged message */ + msg[len++] = intf->my_addr; /* rqSeq / rqLUN */ msg[len++] = rq_seq << 2; @@ -1408,23 +1395,20 @@ void getIpmiPayloadWireRep( /* message data */ if (req->msg.data_len) { - memcpy(msg + len, - req->msg.data, - req->msg.data_len); + memcpy(msg + len, req->msg.data, req->msg.data_len); len += req->msg.data_len; } /* second checksum */ tmp = len - cs; msg[len++] = ipmi_csum(msg+cs, tmp); - - /* bridged request: 2nd checksum */ - if (bridgedRequest) - { - tmp = len - cs2; - msg[len++] = ipmi_csum(msg+cs2, tmp); - payload->payload_length += 1; - } + + /* bridged request: 2nd checksum */ + if (bridgedRequest) { + tmp = len - cs2; + msg[len++] = ipmi_csum(msg+cs2, tmp); + payload->payload_length += 1; + } }