mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-12 03:27:24 +00:00
- Add double bridge support to LAN plugin (Thanks to Dmitry Konyshev from Pigeon Point)
- Fix an issue when bridging, responses to failed Send Message commands are returned to the caller as responses to bridged messages.
This commit is contained in:
parent
9a508d1f19
commit
cedb32d569
@ -512,8 +512,22 @@ ipmi_lan_poll_recv(struct ipmi_intf * intf)
|
|||||||
/* 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) {
|
||||||
|
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) {
|
||||||
|
/* double bridging: remove the Send Message prologue */
|
||||||
|
memmove(rsp->data + 29, rsp->data + 36,
|
||||||
|
rsp->data_len - 36);
|
||||||
|
rsp->data[28] -= 8;
|
||||||
|
rsp->data_len -= 8;
|
||||||
|
entry->rq_seq = rsp->data[34] >> 2;
|
||||||
|
}
|
||||||
entry->req.msg.cmd = entry->req.msg.target_cmd;
|
entry->req.msg.cmd = entry->req.msg.target_cmd;
|
||||||
rsp = ipmi_lan_recv_packet(intf);
|
if (rsp == NULL) {
|
||||||
|
ipmi_req_remove_entry(entry->rq_seq, entry->req.msg.cmd);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -585,7 +599,7 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
|||||||
int cs, mp, tmp;
|
int cs, mp, tmp;
|
||||||
int ap = 0;
|
int ap = 0;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int cs2 = 0;
|
int cs2 = 0, cs3 = 0;
|
||||||
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;
|
||||||
@ -605,6 +619,8 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
|||||||
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;
|
||||||
|
if (intf->transit_addr != intf->my_addr && intf->transit_addr != 0)
|
||||||
|
len += 8;
|
||||||
msg = malloc(len);
|
msg = malloc(len);
|
||||||
if (msg == NULL) {
|
if (msg == NULL) {
|
||||||
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
@ -640,7 +656,8 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
|||||||
} else {
|
} else {
|
||||||
/* bridged request: encapsulate w/in Send Message */
|
/* bridged request: encapsulate w/in Send Message */
|
||||||
bridge_request = 1;
|
bridge_request = 1;
|
||||||
msg[len++] = req->msg.data_len + 15;
|
msg[len++] = req->msg.data_len + 15 +
|
||||||
|
(intf->transit_addr != intf->my_addr && intf->transit_addr != 0 ? 8 : 0);
|
||||||
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;
|
||||||
@ -652,7 +669,22 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
|||||||
msg[len++] = 0x34; /* Send Message rqst */
|
msg[len++] = 0x34; /* Send Message rqst */
|
||||||
entry->req.msg.target_cmd = entry->req.msg.cmd; /* Save target command */
|
entry->req.msg.target_cmd = entry->req.msg.cmd; /* Save target command */
|
||||||
entry->req.msg.cmd = 0x34; /* (fixup request entry) */
|
entry->req.msg.cmd = 0x34; /* (fixup request entry) */
|
||||||
|
|
||||||
|
if (intf->transit_addr == intf->my_addr || intf->transit_addr == 0) {
|
||||||
msg[len++] = (0x40|intf->target_channel); /* Track request*/
|
msg[len++] = (0x40|intf->target_channel); /* Track request*/
|
||||||
|
} else {
|
||||||
|
msg[len++] = (0x40|intf->transit_channel); /* Track request*/
|
||||||
|
cs = len;
|
||||||
|
msg[len++] = intf->transit_addr;
|
||||||
|
msg[len++] = IPMI_NETFN_APP << 2;
|
||||||
|
tmp = len - cs;
|
||||||
|
msg[len++] = ipmi_csum(msg+cs, tmp);
|
||||||
|
cs3 = len;
|
||||||
|
msg[len++] = IPMI_BMC_SLAVE_ADDR;
|
||||||
|
msg[len++] = curr_seq << 2;
|
||||||
|
msg[len++] = 0x34; /* Send Message rqst */
|
||||||
|
msg[len++] = (0x40|intf->target_channel); /* Track request */
|
||||||
|
}
|
||||||
cs = len;
|
cs = len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -698,6 +730,10 @@ ipmi_lan_build_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
|||||||
|
|
||||||
/* bridged request: 2nd checksum */
|
/* bridged request: 2nd checksum */
|
||||||
if (bridge_request) {
|
if (bridge_request) {
|
||||||
|
if (intf->transit_addr != intf->my_addr && intf->transit_addr != 0) {
|
||||||
|
tmp = len - cs3;
|
||||||
|
msg[len++] = ipmi_csum(msg+cs3, tmp);
|
||||||
|
}
|
||||||
tmp = len - cs2;
|
tmp = len - cs2;
|
||||||
msg[len++] = ipmi_csum(msg+cs2, tmp);
|
msg[len++] = ipmi_csum(msg+cs2, tmp);
|
||||||
}
|
}
|
||||||
@ -761,6 +797,7 @@ ipmi_lan_send_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
|||||||
if (ipmi_lan_send_packet(intf, entry->msg_data, entry->msg_len) < 0) {
|
if (ipmi_lan_send_packet(intf, entry->msg_data, entry->msg_len) < 0) {
|
||||||
try++;
|
try++;
|
||||||
usleep(5000);
|
usleep(5000);
|
||||||
|
ipmi_req_remove_entry(entry->rq_seq, entry->req.msg.target_cmd);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user