Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MDNS MultiInterface #7636

Merged
merged 6 commits into from
Oct 15, 2020
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
214 changes: 107 additions & 107 deletions libraries/ESP8266mDNS/src/LEAmDNS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@

#include "ESP8266mDNS.h"
#include "LEAmDNS_Priv.h"

#include <LwipIntf.h> // LwipIntf::stateUpCB()
#include "lwip/igmp.h"

namespace esp8266
{
Expand Down Expand Up @@ -61,13 +62,7 @@ MDNSResponder::MDNSResponder(void)
m_pUDPContext(0),
m_pcHostname(0),
m_pServiceQueries(0),
m_fnServiceTxtCallback(0),
#ifdef ENABLE_ESP_MDNS_RESPONDER_PASSIV_MODE
m_bPassivModeEnabled(true),
#else
m_bPassivModeEnabled(false),
#endif
m_netif(nullptr)
m_fnServiceTxtCallback(0)
{
}

Expand All @@ -93,104 +88,29 @@ MDNSResponder::~MDNSResponder(void)
Finally the responder is (re)started

*/
bool MDNSResponder::begin(const char* p_pcHostname, const IPAddress& p_IPAddress, uint32_t p_u32TTL)
bool MDNSResponder::begin(const char* p_pcHostname, const IPAddress& /*p_IPAddress*/, uint32_t /*p_u32TTL*/)
{

(void)p_u32TTL; // ignored
bool bResult = false;

if (0 == m_pUDPContext)
{
if (_setHostname(p_pcHostname))
{

//// select interface

m_netif = nullptr;
IPAddress ipAddress = p_IPAddress;

if (!ipAddress.isSet())
{

IPAddress sta = WiFi.localIP();
IPAddress ap = WiFi.softAPIP();

if (sta.isSet())
{
DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] STA interface selected\n")));
ipAddress = sta;
}
else if (ap.isSet())
{
DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] AP interface selected\n")));
ipAddress = ap;
}
else
{
DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] standard interfaces are not up, please specify one in ::begin()\n")));
return false;
}

// continue to ensure interface is UP
}

// check existence of this IP address in the interface list
bool found = false;
m_netif = nullptr;
for (auto a : addrList)
if (ipAddress == a.addr())
{
if (a.ifUp())
{
found = true;
m_netif = a.interface();
break;
}
DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] found interface for IP '%s' but it is not UP\n"), ipAddress.toString().c_str()););
}
if (!found)
{
DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] interface defined by IP '%s' not found\n"), ipAddress.toString().c_str()););
return false;
}

//// done selecting the interface

if (m_netif->num == STATION_IF)
{

m_GotIPHandler = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP & pEvent)
{
(void) pEvent;
// Ensure that _restart() runs in USER context
schedule_function([this]()
{
MDNSResponder::_restart();
});
});

m_DisconnectedHandler = WiFi.onStationModeDisconnected([this](const WiFiEventStationModeDisconnected & pEvent)
{
(void) pEvent;
// Ensure that _restart() runs in USER context
schedule_function([this]()
{
MDNSResponder::_restart();
});
});
}

bResult = _restart();
}
DEBUG_EX_ERR(if (!bResult)
if (_setHostname(p_pcHostname))
{
DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] begin: FAILED for '%s'!\n"), (p_pcHostname ? : "-"));
});
bResult = _restart();
}
else

LwipIntf::stateUpCB
(
[this](netif * intf)
{
DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] begin: Ignoring multiple calls to begin (Ignored host domain: '%s')!\n"), (p_pcHostname ? : "-")););
(void)intf;
DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] new Interface '%c%c' is UP! restarting\n"), intf->name[0], intf->name[1]));
_restart();
}
);
DEBUG_EX_ERR(if (!bResult)
{
DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] begin: FAILED for '%s'!\n"), (p_pcHostname ? : "-"));
});

return bResult;
}

Expand All @@ -207,9 +127,6 @@ bool MDNSResponder::close(void)

if (0 != m_pUDPContext)
{
m_GotIPHandler.reset(); // reset WiFi event callbacks.
m_DisconnectedHandler.reset();

_announce(false, true);
_resetProbeStatus(false); // Stop probing
_releaseServiceQueries();
Expand Down Expand Up @@ -1329,11 +1246,6 @@ bool MDNSResponder::notifyAPChange(void)
*/
bool MDNSResponder::update(void)
{

if (m_bPassivModeEnabled)
{
m_bPassivModeEnabled = false;
}
return _process(true);
}

Expand Down Expand Up @@ -1374,6 +1286,94 @@ MDNSResponder::hMDNSService MDNSResponder::enableArduino(uint16_t p_u16Port,
return hService;
}

/*

MULTICAST GROUPS

*/

/*
MDNSResponder::_joinMulticastGroups
*/
bool MDNSResponder::_joinMulticastGroups(void)
{
bool bResult = false;

// Join multicast group(s)
for (netif* pNetIf = netif_list; pNetIf; pNetIf = pNetIf->next)
{
if (netif_is_up(pNetIf))
{
#ifdef MDNS_IPV4_SUPPORT
ip_addr_t multicast_addr_V4 = DNS_MQUERY_IPV4_GROUP_INIT;
if (!(pNetIf->flags & NETIF_FLAG_IGMP))
{
DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _createHost: Setting flag: flags & NETIF_FLAG_IGMP\n")););
pNetIf->flags |= NETIF_FLAG_IGMP;

if (ERR_OK != igmp_start(pNetIf))
{
DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _createHost: igmp_start FAILED!\n")););
}
}

if ((ERR_OK == igmp_joingroup_netif(pNetIf, ip_2_ip4(&multicast_addr_V4))))
{
bResult = true;
}
else
{
DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _createHost: igmp_joingroup_netif(" NETIFID_STR ": %s) FAILED!\n"),
NETIFID_VAL(pNetIf), IPAddress(multicast_addr_V4).toString().c_str()););
}
#endif

#ifdef MDNS_IPV6_SUPPORT
ip_addr_t multicast_addr_V6 = DNS_MQUERY_IPV6_GROUP_INIT;
bResult = ((bResult) &&
(ERR_OK == mld6_joingroup_netif(pNetIf, ip_2_ip6(&multicast_addr_V6))));
DEBUG_EX_ERR_IF(!bResult, DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _createHost: mld6_joingroup_netif (" NETIFID_STR ") FAILED!\n"),
NETIFID_VAL(pNetIf)));
#endif
}
}
return bResult;
}

/*
clsLEAmDNS2_Host::_leaveMulticastGroups
*/
bool MDNSResponder::_leaveMulticastGroups()
{
bool bResult = false;

for (netif* pNetIf = netif_list; pNetIf; pNetIf = pNetIf->next)
{
if (netif_is_up(pNetIf))
{
bResult = true;

// Leave multicast group(s)
#ifdef MDNS_IPV4_SUPPORT
ip_addr_t multicast_addr_V4 = DNS_MQUERY_IPV4_GROUP_INIT;
if (ERR_OK != igmp_leavegroup_netif(pNetIf, ip_2_ip4(&multicast_addr_V4)))
{
DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("\n")););
}
#endif
#ifdef MDNS_IPV6_SUPPORT
ip_addr_t multicast_addr_V6 = DNS_MQUERY_IPV6_GROUP_INIT;
if (ERR_OK != mld6_leavegroup_netif(pNetIf, ip_2_ip6(&multicast_addr_V6)/*&(multicast_addr_V6.u_addr.ip6)*/))
{
DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("\n")););
}
#endif
}
}
return bResult;
}



} //namespace MDNSImplementation

Expand Down
16 changes: 7 additions & 9 deletions libraries/ESP8266mDNS/src/LEAmDNS.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,10 @@ namespace MDNSImplementation
*/
#define MDNS_QUERYSERVICES_WAIT_TIME 1000

/*
Timeout for udpContext->sendtimeout()
*/
#define MDNS_UDPCONTEXT_TIMEOUT 50

/**
MDNSResponder
Expand All @@ -185,6 +189,8 @@ class MDNSResponder
{
return begin(p_strHostname.c_str(), p_IPAddress, p_u32TTL);
}
bool _joinMulticastGroups(void);
bool _leaveMulticastGroups(void);

// Finish MDNS processing
bool close(void);
Expand Down Expand Up @@ -1184,6 +1190,7 @@ class MDNSResponder
~stcMDNSSendParameter(void);

bool clear(void);
bool clearCachedNames(void);

bool shiftOffset(uint16_t p_u16Shift);

Expand All @@ -1199,12 +1206,8 @@ class MDNSResponder
UdpContext* m_pUDPContext;
char* m_pcHostname;
stcMDNSServiceQuery* m_pServiceQueries;
WiFiEventHandler m_DisconnectedHandler;
WiFiEventHandler m_GotIPHandler;
MDNSDynamicServiceTxtCallbackFunc m_fnServiceTxtCallback;
bool m_bPassivModeEnabled;
stcProbeInformation m_HostProbeInformation;
const netif* m_netif; // network interface to run on

/** CONTROL **/
/* MAINTENANCE */
Expand Down Expand Up @@ -1259,11 +1262,6 @@ class MDNSResponder
uint16_t p_u16QueryType,
stcMDNSServiceQuery::stcAnswer* p_pKnownAnswers = 0);

const IPAddress _getResponseMulticastInterface() const
{
return IPAddress(m_netif->ip_addr);
}

uint8_t _replyMaskForHost(const stcMDNS_RRHeader& p_RRHeader,
bool* p_pbFullNameMatch = 0) const;
uint8_t _replyMaskForService(const stcMDNS_RRHeader& p_RRHeader,
Expand Down
Loading