static void recv_alive_msg (unsigned length) { CARD8 SessionRunning; CARD32 AliveSessionID; if (state != XDM_AWAIT_ALIVE_RESPONSE) return; if (length != 5) return; if (XdmcpReadCARD8 (&buffer, &SessionRunning) && XdmcpReadCARD32 (&buffer, &AliveSessionID)) { if (SessionRunning && AliveSessionID == SessionID) { /* backoff dormancy period */ state = XDM_RUN_SESSION; if ((GetTimeInMillis() - lastDeviceEventTime.milliseconds) > keepaliveDormancy * 1000) { keepaliveDormancy <<= 1; if (keepaliveDormancy > XDM_MAX_DORMANCY) keepaliveDormancy = XDM_MAX_DORMANCY; } timeOutTime = GetTimeInMillis() + keepaliveDormancy * 1000; } else { XdmcpDeadSession ("Alive respose indicates session dead"); } } }
static void recv_alive_msg(unsigned length) { CARD8 SessionRunning; CARD32 AliveSessionID; if (state != XDM_AWAIT_ALIVE_RESPONSE) return; if (length != 5) return; if (XdmcpReadCARD8(&buffer, &SessionRunning) && XdmcpReadCARD32(&buffer, &AliveSessionID)) { if (SessionRunning && AliveSessionID == SessionID) { state = XDM_RUN_SESSION; timeOutTime = GetTimeInMillis() + XDM_DEF_DORMANCY * 1000; } else { XdmcpDeadSession("Alive response indicates session dead"); } } }
static void timeout(void) { timeOutRtx++; if (state == XDM_AWAIT_ALIVE_RESPONSE && timeOutRtx >= XDM_KA_RTX_LIMIT) { XdmcpDeadSession("too many keepalive retransmissions"); return; } else if (timeOutRtx >= XDM_RTX_LIMIT) { /* Quit if "-once" specified, otherwise reset and try again. */ if (OneSession) { dispatchException |= DE_TERMINATE; ErrorF("XDM: too many retransmissions\n"); } else { XdmcpDeadSession("too many retransmissions"); } return; } #if defined(IPv6) && defined(AF_INET6) if (state == XDM_COLLECT_QUERY || state == XDM_COLLECT_INDIRECT_QUERY) { /* Try next address */ for (mgrAddr = mgrAddr->ai_next;; mgrAddr = mgrAddr->ai_next) { if (mgrAddr == NULL) { mgrAddr = mgrAddrFirst; } if (mgrAddr->ai_family == AF_INET || mgrAddr->ai_family == AF_INET6) break; } #ifndef SIN6_LEN ManagerAddressLen = mgrAddr->ai_addrlen; #endif memcpy(&ManagerAddress, mgrAddr->ai_addr, mgrAddr->ai_addrlen); } #endif switch (state) { case XDM_COLLECT_QUERY: state = XDM_QUERY; break; case XDM_COLLECT_BROADCAST_QUERY: state = XDM_BROADCAST; break; #if defined(IPv6) && defined(AF_INET6) case XDM_COLLECT_MULTICAST_QUERY: state = XDM_MULTICAST; break; #endif case XDM_COLLECT_INDIRECT_QUERY: state = XDM_INDIRECT; break; case XDM_AWAIT_REQUEST_RESPONSE: state = XDM_START_CONNECTION; break; case XDM_AWAIT_MANAGE_RESPONSE: state = XDM_MANAGE; break; case XDM_AWAIT_ALIVE_RESPONSE: state = XDM_KEEPALIVE; break; default: break; } send_packet(); }