mirror of
https://github.com/esp8266/Arduino.git
synced 2025-08-15 19:22:45 +03:00
LEAmDNS Fixes 1.1 (#5619)
* Fixes 1.1 - Better separation of ESP wifi thread code from user thread code - Added a flag for 'update()'-less use (disabled by default) - The too fast updates for service queries are fixed - Switched fully to PolledTimeout; LEATimeFlag not needed anymore (BTW: a const 'expired()' method would be helpful) - The device should stay visible now even after the first TTL timeout - Improved service querying (queries five times now) * Update mDNS_Clock.ino Removed references to LEATimeFlag.h * Update mDNS_Clock.ino Styling
This commit is contained in:
@@ -1158,9 +1158,8 @@ bool MDNSResponder::stcMDNS_RRAnswerGeneric::clear(void) {
|
||||
*/
|
||||
MDNSResponder::stcProbeInformation::stcProbeInformation(void)
|
||||
: m_ProbingStatus(ProbingStatus_WaitingForData),
|
||||
m_u8ProbesSent(0),
|
||||
//m_ulNextProbeTimeout(0),
|
||||
m_NextProbeTimeFlag(),
|
||||
m_u8SentCount(0),
|
||||
m_Timeout(std::numeric_limits<esp8266::polledTimeout::oneShot::timeType>::max()),
|
||||
m_bConflict(false),
|
||||
m_bTiebreakNeeded(false),
|
||||
m_fnProbeResultCallback(0),
|
||||
@@ -1173,9 +1172,8 @@ MDNSResponder::stcProbeInformation::stcProbeInformation(void)
|
||||
bool MDNSResponder::stcProbeInformation::clear(bool p_bClearUserdata /*= false*/) {
|
||||
|
||||
m_ProbingStatus = ProbingStatus_WaitingForData;
|
||||
m_u8ProbesSent = 0;
|
||||
//m_ulNextProbeTimeout = 0;
|
||||
m_NextProbeTimeFlag.reset();
|
||||
m_u8SentCount = 0;
|
||||
m_Timeout.reset(std::numeric_limits<esp8266::polledTimeout::oneShot::timeType>::max());
|
||||
m_bConflict = false;
|
||||
m_bTiebreakNeeded = false;
|
||||
if (p_bClearUserdata) {
|
||||
@@ -1200,8 +1198,8 @@ bool MDNSResponder::stcProbeInformation::clear(bool p_bClearUserdata /*= false*/
|
||||
* MDNSResponder::stcMDNSService::stcMDNSService constructor
|
||||
*/
|
||||
MDNSResponder::stcMDNSService::stcMDNSService(const char* p_pcName /*= 0*/,
|
||||
const char* p_pcService /*= 0*/,
|
||||
const char* p_pcProtocol /*= 0*/)
|
||||
const char* p_pcService /*= 0*/,
|
||||
const char* p_pcProtocol /*= 0*/)
|
||||
: m_pNext(0),
|
||||
m_pcName(0),
|
||||
m_bAutoName(false),
|
||||
@@ -1367,20 +1365,20 @@ bool MDNSResponder::stcMDNSService::releaseProtocol(void) {
|
||||
* and the 'set' time (also millis).
|
||||
* If the answer is scheduled for an update, the corresponding flag should be set.
|
||||
*
|
||||
*/
|
||||
* /
|
||||
|
||||
/*
|
||||
/ *
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL constructor
|
||||
*/
|
||||
MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL(uint32_t p_u32TTL /*= 0*/)
|
||||
* /
|
||||
MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL(uint32_t p_u32TTL / *= 0* /)
|
||||
: m_bUpdateScheduled(false) {
|
||||
|
||||
set(p_u32TTL * 1000);
|
||||
}
|
||||
|
||||
/*
|
||||
/ *
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set
|
||||
*/
|
||||
* /
|
||||
bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set(uint32_t p_u32TTL) {
|
||||
|
||||
m_TTLTimeFlag.restart(p_u32TTL * 1000);
|
||||
@@ -1389,9 +1387,9 @@ bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set(uint32_t p_u32TT
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
/ *
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::has80Percent
|
||||
*/
|
||||
* /
|
||||
bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::has80Percent(void) const {
|
||||
|
||||
return ((m_TTLTimeFlag.getTimeout()) &&
|
||||
@@ -1399,13 +1397,119 @@ bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::has80Percent(void) c
|
||||
(m_TTLTimeFlag.hypotheticalTimeout((m_TTLTimeFlag.getTimeout() * 800) / 1000)));
|
||||
}
|
||||
|
||||
/*
|
||||
/ *
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::isOutdated
|
||||
*/
|
||||
* /
|
||||
bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::isOutdated(void) const {
|
||||
|
||||
return ((m_TTLTimeFlag.getTimeout()) &&
|
||||
(m_TTLTimeFlag.flagged()));
|
||||
}*/
|
||||
|
||||
|
||||
/**
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL
|
||||
*
|
||||
* The TTL (Time-To-Live) for an specific answer content.
|
||||
* The 80% and outdated states are calculated based on the current time (millis)
|
||||
* and the 'set' time (also millis).
|
||||
* If the answer is scheduled for an update, the corresponding flag should be set.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL constructor
|
||||
*/
|
||||
MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL(void)
|
||||
: m_u32TTL(0),
|
||||
m_TTLTimeout(std::numeric_limits<esp8266::polledTimeout::oneShot::timeType>::max()),
|
||||
m_timeoutLevel(TIMEOUTLEVEL_UNSET) {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set
|
||||
*/
|
||||
bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set(uint32_t p_u32TTL) {
|
||||
|
||||
m_u32TTL = p_u32TTL;
|
||||
if (m_u32TTL) {
|
||||
m_timeoutLevel = TIMEOUTLEVEL_BASE; // Set to 80%
|
||||
m_TTLTimeout.reset(timeout());
|
||||
}
|
||||
else {
|
||||
m_timeoutLevel = TIMEOUTLEVEL_UNSET; // undef
|
||||
m_TTLTimeout.reset(std::numeric_limits<esp8266::polledTimeout::oneShot::timeType>::max());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::flagged
|
||||
*/
|
||||
bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::flagged(void) const {
|
||||
|
||||
return ((m_u32TTL) &&
|
||||
(TIMEOUTLEVEL_UNSET != m_timeoutLevel) &&
|
||||
(m_TTLTimeout.checkExpired(millis())));
|
||||
}
|
||||
|
||||
/*
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::restart
|
||||
*/
|
||||
bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::restart(void) {
|
||||
|
||||
bool bResult = true;
|
||||
|
||||
if ((TIMEOUTLEVEL_BASE <= m_timeoutLevel) && // >= 80% AND
|
||||
(TIMEOUTLEVEL_FINAL > m_timeoutLevel)) { // < 100%
|
||||
|
||||
m_timeoutLevel += TIMEOUTLEVEL_INTERVAL; // increment by 5%
|
||||
m_TTLTimeout.reset(timeout());
|
||||
}
|
||||
else {
|
||||
bResult = false;
|
||||
m_TTLTimeout.reset(std::numeric_limits<esp8266::polledTimeout::oneShot::timeType>::max());
|
||||
m_timeoutLevel = TIMEOUTLEVEL_UNSET;
|
||||
}
|
||||
return bResult;
|
||||
}
|
||||
|
||||
/*
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::prepareDeletion
|
||||
*/
|
||||
bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::prepareDeletion(void) {
|
||||
|
||||
m_timeoutLevel = TIMEOUTLEVEL_FINAL;
|
||||
m_TTLTimeout.reset(1 * 1000); // See RFC 6762, 10.1
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::finalTimeoutLevel
|
||||
*/
|
||||
bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::finalTimeoutLevel(void) const {
|
||||
|
||||
return (TIMEOUTLEVEL_FINAL == m_timeoutLevel);
|
||||
}
|
||||
|
||||
/*
|
||||
* MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::timeout
|
||||
*/
|
||||
unsigned long MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::timeout(void) const {
|
||||
|
||||
uint32_t u32Timeout = std::numeric_limits<esp8266::polledTimeout::oneShot::timeType>::max();
|
||||
|
||||
if (TIMEOUTLEVEL_BASE == m_timeoutLevel) { // 80%
|
||||
u32Timeout = (m_u32TTL * 800); // to milliseconds
|
||||
}
|
||||
else if ((TIMEOUTLEVEL_BASE < m_timeoutLevel) && // >80% AND
|
||||
(TIMEOUTLEVEL_FINAL >= m_timeoutLevel)) { // <= 100%
|
||||
|
||||
u32Timeout = (m_u32TTL * 50);
|
||||
} // else: invalid
|
||||
return u32Timeout;
|
||||
}
|
||||
|
||||
|
||||
@@ -1421,8 +1525,9 @@ bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::isOutdated(void) con
|
||||
MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address::stcIP4Address(IPAddress p_IPAddress,
|
||||
uint32_t p_u32TTL /*= 0*/)
|
||||
: m_pNext(0),
|
||||
m_IPAddress(p_IPAddress),
|
||||
m_TTL(p_u32TTL) {
|
||||
m_IPAddress(p_IPAddress) {
|
||||
|
||||
m_TTL.set(p_u32TTL);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1818,6 +1923,8 @@ MDNSResponder::stcMDNSServiceQuery::stcMDNSServiceQuery(void)
|
||||
m_fnCallback(0),
|
||||
m_pUserdata(0),
|
||||
m_bLegacyQuery(false),
|
||||
m_u8SentCount(0),
|
||||
m_ResendTimeout(std::numeric_limits<esp8266::polledTimeout::oneShot::timeType>::max()),
|
||||
m_bAwaitingAnswers(true),
|
||||
m_pAnswers(0) {
|
||||
|
||||
@@ -1840,6 +1947,8 @@ bool MDNSResponder::stcMDNSServiceQuery::clear(void) {
|
||||
m_fnCallback = 0;
|
||||
m_pUserdata = 0;
|
||||
m_bLegacyQuery = false;
|
||||
m_u8SentCount = 0;
|
||||
m_ResendTimeout.reset(std::numeric_limits<esp8266::polledTimeout::oneShot::timeType>::max());
|
||||
m_bAwaitingAnswers = true;
|
||||
while (m_pAnswers) {
|
||||
stcAnswer* pNext = m_pAnswers->m_pNext;
|
||||
|
Reference in New Issue
Block a user