mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2025-07-19 15:29:08 +02:00

Apple's default implementation of the Posix backend for mDNSResponder has a number of weaknesses. Address several of them, most notably: * Improve interface tracking, preventing confusion to mdns's state machine. Prevents spurious removal/republication cycles whenever network interfaces are added or removed. * Support network interfaces whose indeces are great than 31. Indices grow past that range surprisingly quickly, especially with multi- homed, mobile, wifi, Bluetooth, VPN, VLANs, or other interfaces present. * Correctly handle edge cases during removal of a network interface. The fixes are kept as a patch series for clarity. Signed-off-by: Matt Hoosier <matt.hoosier@garmin.com> Signed-off-by: Khem Raj <raj.khem@gmail.com>
130 lines
6.0 KiB
Diff
130 lines
6.0 KiB
Diff
From 07a9401d84804d7f0181aa4fb0f13a54b2a1c9a8 Mon Sep 17 00:00:00 2001
|
|
From: Nate Karstens <nate.karstens@garmin.com>
|
|
Date: Tue, 1 Aug 2017 17:06:01 -0500
|
|
Subject: [PATCH 07/11] Indicate loopback interface to mDNS core
|
|
|
|
Tells the mDNS core if an interface is a loopback interface,
|
|
similar to AddInterfaceToList() in the MacOS implementation.
|
|
Also reorganizes SetupOneInterface() to use a const struct
|
|
rather than growing its parameter list again.
|
|
|
|
Upstream-Status: Submitted [dts@apple.com]
|
|
|
|
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
|
---
|
|
mDNSPosix/mDNSPosix.c | 37 ++++++++++++++++++-------------------
|
|
1 file changed, 18 insertions(+), 19 deletions(-)
|
|
|
|
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
|
index 3fc5451..798ab10 100644
|
|
--- a/mDNSPosix/mDNSPosix.c
|
|
+++ b/mDNSPosix/mDNSPosix.c
|
|
@@ -889,16 +889,14 @@ mDNSlocal void CleanRecentInterfaces(void)
|
|
|
|
// Creates a PosixNetworkInterface for the interface whose IP address is
|
|
// intfAddr and whose name is intfName and registers it with mDNS core.
|
|
-mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct sockaddr *intfMask, const char *intfName, int intfIndex)
|
|
+mDNSlocal int SetupOneInterface(mDNS *const m, struct ifi_info *const ifi)
|
|
{
|
|
int err = 0;
|
|
PosixNetworkInterface *intf;
|
|
PosixNetworkInterface *alias = NULL;
|
|
|
|
assert(m != NULL);
|
|
- assert(intfAddr != NULL);
|
|
- assert(intfName != NULL);
|
|
- assert(intfMask != NULL);
|
|
+ assert(ifi != NULL);
|
|
|
|
// Allocate the interface structure itself.
|
|
intf = (PosixNetworkInterface*)calloc(1, sizeof(*intf));
|
|
@@ -907,26 +905,27 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct
|
|
// And make a copy of the intfName.
|
|
if (err == 0)
|
|
{
|
|
- intf->intfName = strdup(intfName);
|
|
+ intf->intfName = strdup(ifi->ifi_name);
|
|
if (intf->intfName == NULL) { assert(0); err = ENOMEM; }
|
|
}
|
|
|
|
if (err == 0)
|
|
{
|
|
// Set up the fields required by the mDNS core.
|
|
- SockAddrTomDNSAddr(intfAddr, &intf->coreIntf.ip, NULL);
|
|
- SockAddrTomDNSAddr(intfMask, &intf->coreIntf.mask, NULL);
|
|
+ SockAddrTomDNSAddr(ifi->ifi_addr, &intf->coreIntf.ip, NULL);
|
|
+ SockAddrTomDNSAddr(ifi->ifi_netmask, &intf->coreIntf.mask, NULL);
|
|
|
|
//LogMsg("SetupOneInterface: %#a %#a", &intf->coreIntf.ip, &intf->coreIntf.mask);
|
|
- strncpy(intf->coreIntf.ifname, intfName, sizeof(intf->coreIntf.ifname));
|
|
+ strncpy(intf->coreIntf.ifname, ifi->ifi_name, sizeof(intf->coreIntf.ifname));
|
|
intf->coreIntf.ifname[sizeof(intf->coreIntf.ifname)-1] = 0;
|
|
intf->coreIntf.Advertise = m->AdvertiseLocalAddresses;
|
|
intf->coreIntf.McastTxRx = mDNStrue;
|
|
+ intf->coreIntf.Loopback = ((ifi->ifi_flags & IFF_LOOPBACK) != 0) ? mDNStrue : mDNSfalse;
|
|
|
|
// Set up the extra fields in PosixNetworkInterface.
|
|
assert(intf->intfName != NULL); // intf->intfName already set up above
|
|
- intf->index = intfIndex;
|
|
- intf->sa_family = intfAddr->sa_family;
|
|
+ intf->index = ifi->ifi_index;
|
|
+ intf->sa_family = ifi->ifi_addr->sa_family;
|
|
intf->multicastSocket4 = -1;
|
|
#if HAVE_IPV6
|
|
intf->multicastSocket6 = -1;
|
|
@@ -936,17 +935,17 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct
|
|
intf->coreIntf.InterfaceID = (mDNSInterfaceID)alias;
|
|
|
|
if (alias != intf)
|
|
- debugf("SetupOneInterface: %s %#a is an alias of %#a", intfName, &intf->coreIntf.ip, &alias->coreIntf.ip);
|
|
+ debugf("SetupOneInterface: %s %#a is an alias of %#a", ifi->ifi_name, &intf->coreIntf.ip, &alias->coreIntf.ip);
|
|
}
|
|
|
|
// Set up the multicast socket
|
|
if (err == 0)
|
|
{
|
|
- if (alias->multicastSocket4 == -1 && intfAddr->sa_family == AF_INET)
|
|
- err = SetupSocket(intfAddr, MulticastDNSPort, intf->index, &alias->multicastSocket4);
|
|
+ if (alias->multicastSocket4 == -1 && ifi->ifi_addr->sa_family == AF_INET)
|
|
+ err = SetupSocket(ifi->ifi_addr, MulticastDNSPort, intf->index, &alias->multicastSocket4);
|
|
#if HAVE_IPV6
|
|
- else if (alias->multicastSocket6 == -1 && intfAddr->sa_family == AF_INET6)
|
|
- err = SetupSocket(intfAddr, MulticastDNSPort, intf->index, &alias->multicastSocket6);
|
|
+ else if (alias->multicastSocket6 == -1 && ifi->ifi_addr->sa_family == AF_INET6)
|
|
+ err = SetupSocket(ifi->ifi_addr, MulticastDNSPort, intf->index, &alias->multicastSocket6);
|
|
#endif
|
|
}
|
|
|
|
@@ -973,8 +972,8 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct
|
|
}
|
|
else
|
|
{
|
|
- // Use intfName instead of intf->intfName in the next line to avoid dereferencing NULL.
|
|
- debugf("SetupOneInterface: %s %#a failed to register %d", intfName, &intf->coreIntf.ip, err);
|
|
+ // Use ifi->ifi_name instead of intf->intfName in the next line to avoid dereferencing NULL.
|
|
+ debugf("SetupOneInterface: %s %#a failed to register %d", ifi->ifi_name, &intf->coreIntf.ip, err);
|
|
if (intf) { FreePosixNetworkInterface(intf); intf = NULL; }
|
|
}
|
|
|
|
@@ -1023,7 +1022,7 @@ mDNSlocal int SetupInterfaceList(mDNS *const m)
|
|
}
|
|
else
|
|
{
|
|
- if (SetupOneInterface(m, i->ifi_addr, i->ifi_netmask, i->ifi_name, i->ifi_index) == 0)
|
|
+ if (SetupOneInterface(m, i) == 0)
|
|
if (i->ifi_addr->sa_family == AF_INET)
|
|
foundav4 = mDNStrue;
|
|
}
|
|
@@ -1037,7 +1036,7 @@ mDNSlocal int SetupInterfaceList(mDNS *const m)
|
|
// In the interim, we skip loopback interface only if we found at least one v4 interface to use
|
|
// if ((m->HostInterfaces == NULL) && (firstLoopback != NULL))
|
|
if (!foundav4 && firstLoopback)
|
|
- (void) SetupOneInterface(m, firstLoopback->ifi_addr, firstLoopback->ifi_netmask, firstLoopback->ifi_name, firstLoopback->ifi_index);
|
|
+ (void) SetupOneInterface(m, firstLoopback);
|
|
}
|
|
|
|
// Clean up.
|
|
--
|
|
2.17.1
|
|
|