From e6bad76e9495c8c10c946bddb5e0008bb3be56d3 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Tue, 30 Aug 2016 11:06:13 -0400 Subject: [PATCH] Tolerate client reuse of UDP ports If a system runs many ipmi clients, over time it may reuse UDP ports. We currently take this as a sign of an established relationship in the same manner we have client to server, but here clients can be ephemeral. Cope by clearing out the current session state and allowing a new session to come alive. Change-Id: I2496716d535354616461460f47196d733cde1a87 --- pyghmi/ipmi/private/session.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/pyghmi/ipmi/private/session.py b/pyghmi/ipmi/private/session.py index 5c639a51..c71be8d1 100644 --- a/pyghmi/ipmi/private/session.py +++ b/pyghmi/ipmi/private/session.py @@ -1166,7 +1166,7 @@ class Session(object): if not (pkt[0][0] == 6 and pkt[0][2:4] == b'\xff\x07'): continue if pkt[1] in self.bmc_handlers: - self._handle_ipmi_packet(pkt[0], sockaddr=pkt[1]) + self._handle_ipmi_packet(pkt[0], sockaddr=pkt[1], qent=pkt) elif pkt[2] in self.bmc_handlers: self.sessionless_data(pkt[0], pkt[1]) @@ -1182,7 +1182,7 @@ class Session(object): if mysocket in cls.bmc_handlers: cls.bmc_handlers[mysocket].sessionless_data(data, sockaddr) - def _handle_ipmi_packet(self, data, sockaddr=None): + def _handle_ipmi_packet(self, data, sockaddr=None, qent=None): if self.sockaddr is None and sockaddr is not None: self.sockaddr = sockaddr elif (self.sockaddr is not None and @@ -1193,6 +1193,17 @@ class Session(object): # satisfactory answer if data[4] in (0, 2): # This is an ipmi 1.5 paylod remsequencenumber = struct.unpack('