attempt to fix bridged commands over lan interfaces

This commit is contained in:
Duncan Laurie 2006-01-26 21:38:11 +00:00
parent 6f3e247274
commit e21475c78d
2 changed files with 79 additions and 119 deletions

View File

@ -400,14 +400,10 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
struct ipmi_rs * rsp; struct ipmi_rs * rsp;
struct ipmi_rq_entry * entry; struct ipmi_rq_entry * entry;
int x=0, rv; int x=0, rv;
uint8_t ourAddress = intf->my_addr; uint8_t ourAddress = intf->my_addr;
if(ourAddress == 0) if (ourAddress == 0)
{ ourAddress = IPMI_BMC_SLAVE_ADDR;
ourAddress = IPMI_BMC_SLAVE_ADDR;
}
rsp = ipmi_lan_recv_packet(intf); rsp = ipmi_lan_recv_packet(intf);
@ -486,29 +482,19 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
rsp->payload.ipmi_response.cmd); rsp->payload.ipmi_response.cmd);
if (entry) { if (entry) {
lprintf(LOG_DEBUG+2, "IPMI Request Match found"); lprintf(LOG_DEBUG+2, "IPMI Request Match found");
if ( if ((intf->target_addr != ourAddress) && bridgePossible) {
(intf->target_addr != ourAddress) && if ((rsp->data_len) &&
(bridgePossible) (rsp->payload.ipmi_response.cmd != 0x34)) {
) printbuf(&rsp->data[x], rsp->data_len-x,
{ "bridge command response");
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 */ /* bridged command: lose extra header */
if (rsp->payload.ipmi_response.cmd == 0x34) { if (rsp->payload.ipmi_response.cmd == 0x34) {
if( rsp->data_len == 38 ) if (rsp->data_len == 38) {
{ entry->req.msg.cmd = entry->req.msg.target_cmd;
entry->req.msg.cmd = entry->req.msg.target_cmd; rsp = ipmi_lan_recv_packet(intf);
rsp = ipmi_lan_recv_packet(intf); continue;
continue; }
}
} else { } else {
//x += sizeof(rsp->payload.ipmi_response); //x += sizeof(rsp->payload.ipmi_response);
if (rsp->data[x-1] != 0) 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"); lprintf(LOG_INFO, "IPMI Request Match NOT FOUND");
rsp = ipmi_lan_recv_packet(intf); rsp = ipmi_lan_recv_packet(intf);
continue; continue;
} }
break; break;
} }
@ -582,13 +568,11 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
struct ipmi_rq_entry * entry; struct ipmi_rq_entry * entry;
struct ipmi_session * s = intf->session; struct ipmi_session * s = intf->session;
static int curr_seq = 0; static int curr_seq = 0;
uint8_t ourAddress = intf->my_addr; uint8_t ourAddress = intf->my_addr;
uint8_t bridgedRequest = 0; uint8_t bridgedRequest = 0;
if(ourAddress == 0) if (ourAddress == 0)
{ ourAddress = IPMI_BMC_SLAVE_ADDR;
ourAddress = IPMI_BMC_SLAVE_ADDR;
}
if (curr_seq >= 64) if (curr_seq >= 64)
curr_seq = 0; 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); entry = ipmi_req_add_entry(intf, req);
if (entry == NULL) if (entry == NULL)
return NULL; return NULL;
len = req->msg.data_len + 29; len = req->msg.data_len + 29;
if (s->active && s->authtype) if (s->active && s->authtype)
len += 16; len += 16;
@ -629,22 +613,15 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
} }
/* message length */ /* message length */
if ( if ((intf->target_addr == ourAddress) || !bridgePossible) {
(intf->target_addr == ourAddress) ||
(!bridgePossible)
)
{
msg[len++] = req->msg.data_len + 7; msg[len++] = req->msg.data_len + 7;
cs = mp = len; cs = mp = len;
} } else {
else
{
/* bridged request: encapsulate w/in Send Message */ /* bridged request: encapsulate w/in Send Message */
bridgedRequest = 1; bridgedRequest = 1;
msg[len++] = req->msg.data_len + 15; msg[len++] = req->msg.data_len + 15;
cs = mp = len; cs = mp = len;
msg[len++] = IPMI_BMC_SLAVE_ADDR; msg[len++] = IPMI_BMC_SLAVE_ADDR;
msg[len++] = IPMI_NETFN_APP << 2; msg[len++] = IPMI_NETFN_APP << 2;
tmp = len - cs; tmp = len - cs;
msg[len++] = ipmi_csum(msg+cs, tmp); 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 */ /* ipmi message header */
msg[len++] = intf->target_addr; msg[len++] = intf->target_addr;
msg[len++] = req->msg.netfn << 2; msg[len++] = req->msg.netfn << 2 | (req->msg.lun & 3);
tmp = len - cs; tmp = len - cs;
msg[len++] = ipmi_csum(msg+cs, tmp); msg[len++] = ipmi_csum(msg+cs, tmp);
cs = len; cs = len;
if (!bridgedRequest)
msg[len++] = IPMI_REMOTE_SWID;
else /* Bridged message */ if (!bridgedRequest)
msg[len++] = intf->my_addr; msg[len++] = IPMI_REMOTE_SWID;
else /* Bridged message */
msg[len++] = intf->my_addr;
entry->rq_seq = curr_seq++; entry->rq_seq = curr_seq++;
msg[len++] = entry->rq_seq << 2; msg[len++] = entry->rq_seq << 2;
msg[len++] = req->msg.cmd; 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); msg[len++] = ipmi_csum(msg+cs, tmp);
/* bridged request: 2nd checksum */ /* bridged request: 2nd checksum */
if (bridgedRequest) if (bridgedRequest) {
{
tmp = len - cs2; tmp = len - cs2;
msg[len++] = ipmi_csum(msg+cs2, tmp); msg[len++] = ipmi_csum(msg+cs2, tmp);
} }
if (s->active) { if (s->active) {
/* /*
* s->authcode is already copied to msg+ap but some * s->authcode is already copied to msg+ap but some

View File

@ -1327,67 +1327,54 @@ void read_sol_packet(struct ipmi_rs * rsp, int * offset)
* param rq_seq [in] is the IPMI command sequence number. * param rq_seq [in] is the IPMI command sequence number.
*/ */
void getIpmiPayloadWireRep( void getIpmiPayloadWireRep(
struct ipmi_intf * intf, /* in out */ struct ipmi_intf * intf, /* in out */
struct ipmi_v2_payload * payload, /* in */ struct ipmi_v2_payload * payload, /* in */
uint8_t * msg, uint8_t * msg,
struct ipmi_rq * req, struct ipmi_rq * req,
uint8_t rq_seq, uint8_t rq_seq,
uint8_t curr_seq) uint8_t curr_seq)
{ {
int cs, /*mp,*/ tmp, len; int cs, tmp, len;
int cs2 = 0; int cs2 = 0;
uint8_t ourAddress = intf->my_addr;
uint8_t ourAddress = intf->my_addr; uint8_t bridgedRequest = 0;
uint8_t bridgedRequest = 0;
if (ourAddress == 0)
if(ourAddress == 0) ourAddress = IPMI_BMC_SLAVE_ADDR;
{
ourAddress = IPMI_BMC_SLAVE_ADDR; len = 0;
}
len = 0;
/* IPMI Message Header -- Figure 13-4 of the IPMI v2.0 spec */ /* IPMI Message Header -- Figure 13-4 of the IPMI v2.0 spec */
if ( if ((intf->target_addr == ourAddress) || (!bridgePossible))
(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; 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 */ /* rsAddr */
msg[len++] = intf->target_addr; /* IPMI_BMC_SLAVE_ADDR; */ msg[len++] = intf->target_addr; /* IPMI_BMC_SLAVE_ADDR; */
/* net Fn */ /* net Fn */
msg[len++] = req->msg.netfn << 2; msg[len++] = req->msg.netfn << 2 | (req->msg.lun & 3);
tmp = len - cs; tmp = len - cs;
/* checkSum */ /* checkSum */
@ -1395,10 +1382,10 @@ void getIpmiPayloadWireRep(
cs = len; cs = len;
/* rqAddr */ /* rqAddr */
if (!bridgedRequest) if (!bridgedRequest)
msg[len++] = IPMI_REMOTE_SWID; msg[len++] = IPMI_REMOTE_SWID;
else /* Bridged message */ else /* Bridged message */
msg[len++] = intf->my_addr; msg[len++] = intf->my_addr;
/* rqSeq / rqLUN */ /* rqSeq / rqLUN */
msg[len++] = rq_seq << 2; msg[len++] = rq_seq << 2;
@ -1408,23 +1395,20 @@ void getIpmiPayloadWireRep(
/* message data */ /* message data */
if (req->msg.data_len) { if (req->msg.data_len) {
memcpy(msg + len, memcpy(msg + len, req->msg.data, req->msg.data_len);
req->msg.data,
req->msg.data_len);
len += req->msg.data_len; len += req->msg.data_len;
} }
/* second checksum */ /* second checksum */
tmp = len - cs; tmp = len - cs;
msg[len++] = ipmi_csum(msg+cs, tmp); msg[len++] = ipmi_csum(msg+cs, tmp);
/* bridged request: 2nd checksum */ /* bridged request: 2nd checksum */
if (bridgedRequest) if (bridgedRequest) {
{ tmp = len - cs2;
tmp = len - cs2; msg[len++] = ipmi_csum(msg+cs2, tmp);
msg[len++] = ipmi_csum(msg+cs2, tmp); payload->payload_length += 1;
payload->payload_length += 1; }
}
} }