Hi All,
Please find in the attached the patch that adds double bridging support
to the LAN plugin.
This patch also fixes the following issue that has been found in the
plugin: when bridging, responses to failed Send Message commands are
returned to the caller as responses to bridged messages.
Regards,
Dmitry
Index: src/plugins/lan/lan.c
===================================================================
RCS file: /cvsroot/ipmitool/ipmitool/src/plugins/lan/lan.c,v
retrieving revision 1.58
diff -p -u -r1.58 lan.c
--- src/plugins/lan/lan.c 1 Sep 2006 17:48:15 -0000 1.58
+++ src/plugins/lan/lan.c 6 Jul 2007 14:27:12 -0000
@@ -512,8 +512,22 @@ ipmi_lan_poll_recv(struct ipmi_intf * in
/* bridged command: lose extra header */
if (rsp->payload.ipmi_response.cmd == 0x34) {
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;
- rsp =
ipmi_lan_recv_packet(intf);
+ if (rsp == NULL) {
+
ipmi_req_remove_entry(entry->rq_seq, entry->req.msg.cmd);
+ }
continue;
}
} else {
@@ -585,7 +599,7 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
int cs, mp, tmp;
int ap = 0;
int len = 0;
- int cs2 = 0;
+ int cs2 = 0, cs3 = 0;
struct ipmi_rq_entry * entry;
struct ipmi_session * s = intf->session;
static int curr_seq = 0;
@@ -605,6 +619,8 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
len = req->msg.data_len + 29;
if (s->active && s->authtype)
len += 16;
+ if (intf->transit_addr != intf->my_addr && intf->transit_addr != 0)
+ len += 8;
msg = malloc(len);
if (msg == NULL) {
lprintf(LOG_ERR, "ipmitool: malloc failure");
@@ -640,7 +656,8 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
} else {
/* bridged request: encapsulate w/in Send Message */
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;
msg[len++] = IPMI_BMC_SLAVE_ADDR;
msg[len++] = IPMI_NETFN_APP << 2;
@@ -652,7 +669,22 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
msg[len++] = 0x34; /* Send Message rqst */
entry->req.msg.target_cmd = entry->req.msg.cmd; /* Save target
command */
entry->req.msg.cmd = 0x34; /* (fixup request
entry) */
- msg[len++] = (0x40|intf->target_channel); /* Track request*/
+
+ if (intf->transit_addr == intf->my_addr || intf->transit_addr
== 0) {
+ 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;
}
@@ -698,6 +730,10 @@ ipmi_lan_build_cmd(struct ipmi_intf * in
/* bridged request: 2nd checksum */
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;
msg[len++] = ipmi_csum(msg+cs2, tmp);
}
@@ -761,6 +797,7 @@ ipmi_lan_send_cmd(struct ipmi_intf * int
if (ipmi_lan_send_packet(intf, entry->msg_data, entry->msg_len)
< 0) {
try++;
usleep(5000);
+ ipmi_req_remove_entry(entry->rq_seq,
entry->req.msg.target_cmd);
continue;
}
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Ipmitool-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel