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
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to