Hi,
I'd like you to review my patch and merge it to the official
source tree.
I wrote the patch based on code reading. I didn't test it at all.
See ipmi_lanplus_send_payload function of lanplus.c.
An assertion is hit when retransmitting datagram with
IPMI_PAYLOAD_TYPE_RMCP_OPEN_REQUEST, IPMI_PAYLOAD_TYPE_RAKP_1, or
IPMI_PAYLOAD_TYPE_RAKP_2 typed payload.
After initial sending those type of datagram, the state of session is
transited with following code:
/* Remember our connection state */
switch (payload->payload_type)
{
case IPMI_PAYLOAD_TYPE_RMCP_OPEN_REQUEST:
session->v2_data.session_state =
LANPLUS_STATE_OPEN_SESSION_SENT;
break;
case IPMI_PAYLOAD_TYPE_RAKP_1:
session->v2_data.session_state =
LANPLUS_STATE_RAKP_1_SENT;
break;
case IPMI_PAYLOAD_TYPE_RAKP_3:
session->v2_data.session_state =
LANPLUS_STATE_RAKP_3_SENT;
break;
}
And when retransmitting following assert statements which checks the
session_state may be hit.
else if (payload->payload_type ==
IPMI_PAYLOAD_TYPE_RMCP_OPEN_REQUEST)
{
lprintf(LOG_DEBUG, ">> SENDING AN OPEN SESSION
REQUEST\n");
assert(session->v2_data.session_state ==
LANPLUS_STATE_PRESESSION);
else if (payload->payload_type ==
IPMI_PAYLOAD_TYPE_RAKP_1)
{
lprintf(LOG_DEBUG, ">> SENDING A RAKP 1
MESSAGE\n");
assert(session->v2_data.session_state ==
LANPLUS_STATE_OPEN_SESSION_RECEIEVED);
else if (payload->payload_type ==
IPMI_PAYLOAD_TYPE_RAKP_3)
{
lprintf(LOG_DEBUG, ">> SENDING A RAKP 3
MESSAGE\n");
assert(session->v2_data.session_state ==
LANPLUS_STATE_RAKP_2_RECEIVED);
The patch is for the code in impitool cvs repository. The intent is
obvious. In a local variable `last_session_state' the state before transition
is recorded.
The value stored in `last_session_state' is restored to
session->v2_data.session_state
when retransmitting is needed.
*** lanplus.c.~1.72.~ 2012-07-11 01:01:09.000000000 +0900
--- lanplus.c 2012-11-06 14:02:04.382135857 +0900
***************
*** 2091,2096 ****
--- 2091,2097 ----
int xmit = 1;
time_t ltime;
uint32_t timeout;
+ enum LANPLUS_SESSION_STATE last_session_state;
if (!intf->opened && intf->open && intf->open(intf) < 0)
return NULL;
***************
*** 2233,2238 ****
--- 2234,2240 ----
usleep(100); /* Not sure what this is for */
/* Remember our connection state */
+ last_session_state = session->v2_data.session_state;
switch (payload->payload_type)
{
case IPMI_PAYLOAD_TYPE_RMCP_OPEN_REQUEST:
***************
*** 2302,2307 ****
--- 2304,2318 ----
if (xmit) {
/* increment session timeout by 1 second each retry */
timeout++;
+ /* Roll back the last state transition */
+ switch (payload->payload_type)
+ {
+ case IPMI_PAYLOAD_TYPE_RMCP_OPEN_REQUEST:
+ case IPMI_PAYLOAD_TYPE_RAKP_1:
+ case IPMI_PAYLOAD_TYPE_RAKP_3:
+ session->v2_data.session_state =
last_session_state;
+ break
+ }
}
try++;
Masatake YAMATO
------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
Ipmitool-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel