added my Recipes
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
From c1f3e19d3cb0aa948248616eb1684a1e80aa39b4 Mon Sep 17 00:00:00 2001
|
||||
From: Nate Karstens <nate.karstens@garmin.com>
|
||||
Date: Wed, 28 Jun 2017 17:30:00 -0500
|
||||
Subject: [PATCH 1/8] Create subroutine for cleaning recent interfaces
|
||||
|
||||
Moves functionality for cleaning the list of recent
|
||||
interfaces into its own subroutine.
|
||||
|
||||
Upstream-Status: Submitted [dts@apple.com]
|
||||
|
||||
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/mDNSPosix.c | 24 ++++++++++++++----------
|
||||
1 file changed, 14 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
||||
index 0a7c3dfa2475..fe7242d83599 100644
|
||||
--- a/mDNSPosix/mDNSPosix.c
|
||||
+++ b/mDNSPosix/mDNSPosix.c
|
||||
@@ -1322,6 +1322,19 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
|
||||
return err;
|
||||
}
|
||||
|
||||
+// Clean up any interfaces that have been hanging around on the RecentInterfaces list for more than a minute
|
||||
+mDNSlocal void CleanRecentInterfaces(void)
|
||||
+{
|
||||
+ PosixNetworkInterface **ri = &gRecentInterfaces;
|
||||
+ const mDNSs32 utc = mDNSPlatformUTC();
|
||||
+ while (*ri)
|
||||
+ {
|
||||
+ PosixNetworkInterface *pi = *ri;
|
||||
+ if (utc - pi->LastSeen < 60) ri = (PosixNetworkInterface **)&pi->coreIntf.next;
|
||||
+ else { *ri = (PosixNetworkInterface *)pi->coreIntf.next; mdns_free(pi); }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
// 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,
|
||||
@@ -1559,16 +1572,7 @@ mDNSlocal int SetupInterfaceList(mDNS *const m)
|
||||
|
||||
// Clean up.
|
||||
if (intfList != NULL) freeifaddrs(intfList);
|
||||
-
|
||||
- // Clean up any interfaces that have been hanging around on the RecentInterfaces list for more than a minute
|
||||
- PosixNetworkInterface **ri = &gRecentInterfaces;
|
||||
- const mDNSs32 utc = mDNSPlatformUTC();
|
||||
- while (*ri)
|
||||
- {
|
||||
- PosixNetworkInterface *pi = *ri;
|
||||
- if (utc - pi->LastSeen < 60) ri = (PosixNetworkInterface **)&pi->coreIntf.next;
|
||||
- else { *ri = (PosixNetworkInterface *)pi->coreIntf.next; mdns_free(pi); }
|
||||
- }
|
||||
+ CleanRecentInterfaces();
|
||||
|
||||
return err;
|
||||
}
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
From cea342c10731cb1c8c8b52f03d55f9d15fc3b091 Mon Sep 17 00:00:00 2001
|
||||
From: Khem Raj <raj.khem@gmail.com>
|
||||
Date: Thu, 4 Nov 2021 07:31:32 -0700
|
||||
Subject: [PATCH 1/6] dns-sd: Include missing headers
|
||||
|
||||
Fixes build on Musl
|
||||
|
||||
Upstream-Status: Pending
|
||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||
---
|
||||
mDNSPosix/nss_mdns.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/mDNSPosix/nss_mdns.c b/mDNSPosix/nss_mdns.c
|
||||
index afadb3c6c33b..84c312759463 100644
|
||||
--- a/mDNSPosix/nss_mdns.c
|
||||
+++ b/mDNSPosix/nss_mdns.c
|
||||
@@ -89,6 +89,9 @@
|
||||
|
||||
#include <dns_sd.h>
|
||||
|
||||
+#if !defined(NETDB_INTERNAL)
|
||||
+# define NETDB_INTERNAL (-1)
|
||||
+#endif
|
||||
|
||||
//----------
|
||||
// Public functions
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
From 40ef0241afbb49f84e76afd65eb3ee17466bb582 Mon Sep 17 00:00:00 2001
|
||||
From: Nate Karstens <nate.karstens@garmin.com>
|
||||
Date: Wed, 28 Jun 2017 17:30:00 -0500
|
||||
Subject: [PATCH 2/8] Create subroutine for tearing down an interface
|
||||
|
||||
Creates a subroutine for tearing down an interface.
|
||||
|
||||
Upstream-Status: Submitted [dts@apple.com]
|
||||
|
||||
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/mDNSPosix.c | 22 ++++++++++++++++------
|
||||
1 file changed, 16 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
||||
index fe7242d83599..a32a880c0ce5 100644
|
||||
--- a/mDNSPosix/mDNSPosix.c
|
||||
+++ b/mDNSPosix/mDNSPosix.c
|
||||
@@ -1043,6 +1043,19 @@ mDNSlocal void FreePosixNetworkInterface(PosixNetworkInterface *intf)
|
||||
gRecentInterfaces = intf;
|
||||
}
|
||||
|
||||
+mDNSlocal void TearDownInterface(mDNS *const m, PosixNetworkInterface *intf)
|
||||
+{
|
||||
+ mDNS_DeregisterInterface(m, &intf->coreIntf, NormalActivation);
|
||||
+ if (gMDNSPlatformPosixVerboseLevel > 0) fprintf(stderr, "Deregistered interface %s\n", intf->intfName);
|
||||
+ FreePosixNetworkInterface(intf);
|
||||
+
|
||||
+ num_registered_interfaces--;
|
||||
+ if (num_registered_interfaces == 0) {
|
||||
+ num_pkts_accepted = 0;
|
||||
+ num_pkts_rejected = 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
// Grab the first interface, deregister it, free it, and repeat until done.
|
||||
mDNSlocal void ClearInterfaceList(mDNS *const m)
|
||||
{
|
||||
@@ -1051,13 +1064,10 @@ mDNSlocal void ClearInterfaceList(mDNS *const m)
|
||||
while (m->HostInterfaces)
|
||||
{
|
||||
PosixNetworkInterface *intf = (PosixNetworkInterface*)(m->HostInterfaces);
|
||||
- mDNS_DeregisterInterface(m, &intf->coreIntf, NormalActivation);
|
||||
- if (gMDNSPlatformPosixVerboseLevel > 0) fprintf(stderr, "Deregistered interface %s\n", intf->intfName);
|
||||
- FreePosixNetworkInterface(intf);
|
||||
+ TearDownInterface(m, intf);
|
||||
}
|
||||
- num_registered_interfaces = 0;
|
||||
- num_pkts_accepted = 0;
|
||||
- num_pkts_rejected = 0;
|
||||
+
|
||||
+ assert(num_registered_interfaces == 0);
|
||||
}
|
||||
|
||||
mDNSlocal int SetupIPv6Socket(int fd)
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
From a198bcd457abd04f2e22812ff3a37246aa564614 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
Date: Mon, 5 Dec 2022 15:14:12 +0000
|
||||
Subject: [PATCH 2/6] make: Set libdns_sd.so soname correctly
|
||||
|
||||
Upstream-Status: Pending
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/Makefile | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/mDNSPosix/Makefile b/mDNSPosix/Makefile
|
||||
index 802a13dd70b6..5e74193c0e89 100755
|
||||
--- a/mDNSPosix/Makefile
|
||||
+++ b/mDNSPosix/Makefile
|
||||
@@ -276,7 +276,7 @@ libdns_sd: setup $(BUILDDIR)/libdns_sd.$(LDSUFFIX)
|
||||
CLIENTLIBOBJS = $(OBJDIR)/dnssd_clientlib.c.so.o $(OBJDIR)/dnssd_clientstub.c.so.o $(OBJDIR)/dnssd_ipc.c.so.o $(OBJDIR)/dnssd_errstring.c.so.o
|
||||
|
||||
$(BUILDDIR)/libdns_sd.$(LDSUFFIX): $(CLIENTLIBOBJS)
|
||||
- $(LD) $(SOOPTS) $(LINKOPTS) -o $@ $+
|
||||
+ $(LD) $(SOOPTS) $(LINKOPTS) -Wl,-soname,libdns_sd.$(LDSUFFIX).1 -o $@ $+
|
||||
$(STRIP) $@
|
||||
|
||||
Clients: setup libdns_sd ../Clients/build/dns-sd
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
From deb3a2c51f32e0d2741be11a492e727129f770e2 Mon Sep 17 00:00:00 2001
|
||||
From: Nate Karstens <nate.karstens@garmin.com>
|
||||
Date: Wed, 28 Jun 2017 17:30:00 -0500
|
||||
Subject: [PATCH 3/8] Track interface socket family
|
||||
|
||||
Tracks the socket family associated with the interface.
|
||||
|
||||
Upstream-Status: Submitted [dts@apple.com]
|
||||
|
||||
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/mDNSPosix.c | 1 +
|
||||
mDNSPosix/mDNSPosix.h | 2 ++
|
||||
2 files changed, 3 insertions(+)
|
||||
|
||||
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
||||
index a32a880c0ce5..9a5b4d7ea4cb 100644
|
||||
--- a/mDNSPosix/mDNSPosix.c
|
||||
+++ b/mDNSPosix/mDNSPosix.c
|
||||
@@ -1415,6 +1415,7 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct
|
||||
// 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->multicastSocket4 = -1;
|
||||
#if HAVE_IPV6
|
||||
intf->multicastSocket6 = -1;
|
||||
diff --git a/mDNSPosix/mDNSPosix.h b/mDNSPosix/mDNSPosix.h
|
||||
index 9675591b0434..dd7864cd0d5e 100644
|
||||
--- a/mDNSPosix/mDNSPosix.h
|
||||
+++ b/mDNSPosix/mDNSPosix.h
|
||||
@@ -19,6 +19,7 @@
|
||||
#define __mDNSPlatformPosix_h
|
||||
|
||||
#include <signal.h>
|
||||
+#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -40,6 +41,7 @@ struct PosixNetworkInterface
|
||||
char * intfName;
|
||||
PosixNetworkInterface * aliasIntf;
|
||||
int index;
|
||||
+ sa_family_t sa_family;
|
||||
int multicastSocket4;
|
||||
#if HAVE_IPV6
|
||||
int multicastSocket6;
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
From 4c0954f77ba05d77192ee1519929a39fbc978321 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
Date: Mon, 5 Dec 2022 15:14:22 +0000
|
||||
Subject: [PATCH 3/6] mDNSShared: Drop MacOS specific __block qualifier
|
||||
|
||||
Support for this extension only exists in MacOS/Clang, also it's not
|
||||
actually used here, so we can just drop it.
|
||||
|
||||
Upstream-Status: Pending
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSShared/uds_daemon.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/mDNSShared/uds_daemon.c b/mDNSShared/uds_daemon.c
|
||||
index 9ae5f78542d6..8c006b71a4ea 100644
|
||||
--- a/mDNSShared/uds_daemon.c
|
||||
+++ b/mDNSShared/uds_daemon.c
|
||||
@@ -2912,7 +2912,7 @@ exit:
|
||||
mDNSlocal mStatus add_domain_to_browser(request_state *info, const domainname *d)
|
||||
{
|
||||
browser_t *b, *p;
|
||||
- __block mStatus err;
|
||||
+ mStatus err;
|
||||
|
||||
for (p = info->u.browser.browsers; p; p = p->next)
|
||||
{
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
From beab76b5708862f44d9acbe7a92db45e2f99259f 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 4/8] Indicate loopback interface to mDNS core
|
||||
|
||||
Tells the mDNS core if an interface is a loopback interface,
|
||||
similar to AddInterfaceToList() in the MacOS implementation.
|
||||
|
||||
Upstream-Status: Submitted [dts@apple.com]
|
||||
|
||||
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/mDNSPosix.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
||||
index 9a5b4d7ea4cb..02a19b438e03 100644
|
||||
--- a/mDNSPosix/mDNSPosix.c
|
||||
+++ b/mDNSPosix/mDNSPosix.c
|
||||
@@ -1348,7 +1348,7 @@ 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 mDNSu8 *intfHaddr, mDNSu16 intfHlen, const char *intfName, int intfIndex)
|
||||
+ const mDNSu8 *intfHaddr, mDNSu16 intfHlen, const char *intfName, int intfIndex, int intfFlags)
|
||||
{
|
||||
int err = 0;
|
||||
PosixNetworkInterface *intf;
|
||||
@@ -1411,6 +1411,7 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct
|
||||
|
||||
intf->coreIntf.Advertise = m->AdvertiseLocalAddresses;
|
||||
intf->coreIntf.McastTxRx = mDNStrue;
|
||||
+ intf->coreIntf.Loopback = ((intfFlags & IFF_LOOPBACK) != 0) ? mDNStrue : mDNSfalse;
|
||||
|
||||
// Set up the extra fields in PosixNetworkInterface.
|
||||
assert(intf->intfName != NULL); // intf->intfName already set up above
|
||||
@@ -1561,7 +1562,7 @@ mDNSlocal int SetupInterfaceList(mDNS *const m)
|
||||
}
|
||||
#endif
|
||||
if (SetupOneInterface(m, i->ifa_addr, i->ifa_netmask,
|
||||
- hwaddr, hwaddr_len, i->ifa_name, ifIndex) == 0)
|
||||
+ hwaddr, hwaddr_len, i->ifa_name, ifIndex, i->ifa_flags) == 0)
|
||||
{
|
||||
if (i->ifa_addr->sa_family == AF_INET)
|
||||
foundav4 = mDNStrue;
|
||||
@@ -1578,7 +1579,7 @@ mDNSlocal int SetupInterfaceList(mDNS *const m)
|
||||
// if ((m->HostInterfaces == NULL) && (firstLoopback != NULL))
|
||||
if (!foundav4 && firstLoopback)
|
||||
(void) SetupOneInterface(m, firstLoopback->ifa_addr, firstLoopback->ifa_netmask,
|
||||
- NULL, 0, firstLoopback->ifa_name, firstLoopbackIndex);
|
||||
+ NULL, 0, firstLoopback->ifa_name, firstLoopbackIndex, firstLoopback->ifa_flags);
|
||||
}
|
||||
|
||||
// Clean up.
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
From 22316f200803225f2d375ae5c36ffead59e2f6b8 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
Date: Mon, 5 Dec 2022 15:14:26 +0000
|
||||
Subject: [PATCH 4/6] make: Separate TLS targets from libraries
|
||||
|
||||
There are dependencies on TLSOBJS, which fails when `-lmbedtls` is
|
||||
listed as a dependency, so separate it out.
|
||||
|
||||
Upstream-Status: Pending
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/Makefile | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/mDNSPosix/Makefile b/mDNSPosix/Makefile
|
||||
index 5e74193c0e89..b4313c36b035 100755
|
||||
--- a/mDNSPosix/Makefile
|
||||
+++ b/mDNSPosix/Makefile
|
||||
@@ -112,9 +112,11 @@ ifeq ($(findstring linux,$(os)),linux)
|
||||
ifeq ($(tls), no)
|
||||
CFLAGS_OS = -D_GNU_SOURCE -DHAVE_IPV6 -DNOT_HAVE_SA_LEN -DUSES_NETLINK -DHAVE_LINUX -DTARGET_OS_LINUX -ftabstop=4 -Wno-expansion-to-defined
|
||||
TLSOBJS =
|
||||
+TLSLIBS =
|
||||
else
|
||||
CFLAGS_OS = -D_GNU_SOURCE -DHAVE_IPV6 -DNOT_HAVE_SA_LEN -DUSES_NETLINK -DHAVE_LINUX -DTARGET_OS_LINUX -DPOSIX_HAS_TLS -ftabstop=4 -Wno-expansion-to-defined
|
||||
-TLSOBJS = $(OBJDIR)/mbedtls.c.o -lmbedtls -lmbedcrypto
|
||||
+TLSOBJS = $(OBJDIR)/mbedtls.c.o
|
||||
+TLSLIBS = -lmbedtls -lmbedcrypto
|
||||
endif
|
||||
LD = $(CC)
|
||||
SOOPTS = -shared
|
||||
@@ -266,7 +268,7 @@ Daemon: setup $(BUILDDIR)/mdnsd
|
||||
@echo "Responder daemon done"
|
||||
|
||||
$(BUILDDIR)/mdnsd: $(DAEMONOBJS)
|
||||
- $(CC) -o $@ $+ $(LINKOPTS)
|
||||
+ $(CC) -o $@ $+ $(LINKOPTS) $(TLSLIBS)
|
||||
$(STRIP) $@
|
||||
|
||||
# libdns_sd target builds the client library
|
||||
@@ -485,16 +487,16 @@ dnsextd: setup $(BUILDDIR)/dnsextd
|
||||
@echo "dnsextd done"
|
||||
|
||||
$(BUILDDIR)/mDNSClientPosix: $(APPOBJ) $(TLSOBJS) $(OBJDIR)/Client.c.o
|
||||
- $(CC) $+ -o $@ $(LINKOPTS)
|
||||
+ $(CC) $+ -o $@ $(LINKOPTS) $(TLSLIBS)
|
||||
|
||||
$(BUILDDIR)/mDNSResponderPosix: $(COMMONOBJ) $(TLSOBJS) $(OBJDIR)/Responder.c.o
|
||||
- $(CC) $+ -o $@ $(LINKOPTS)
|
||||
+ $(CC) $+ -o $@ $(LINKOPTS) $(TLSLIBS)
|
||||
|
||||
$(BUILDDIR)/mDNSProxyResponderPosix: $(COMMONOBJ) $(TLSOBJS) $(OBJDIR)/ProxyResponder.c.o
|
||||
- $(CC) $+ -o $@ $(LINKOPTS)
|
||||
+ $(CC) $+ -o $@ $(LINKOPTS) $(TLSLIBS)
|
||||
|
||||
$(BUILDDIR)/mDNSNetMonitor: $(SPECIALOBJ) $(TLSOBJS) $(OBJDIR)/NetMonitor.c.o
|
||||
- $(CC) $+ -o $@ $(LINKOPTS)
|
||||
+ $(CC) $+ -o $@ $(LINKOPTS) $(TLSLIBS)
|
||||
|
||||
$(OBJDIR)/NetMonitor.c.o: $(COREDIR)/mDNS.c # Note: NetMonitor.c textually imports mDNS.c
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
From e79f81f5cd626ad77ec64de4325f6645cf253c5e Mon Sep 17 00:00:00 2001
|
||||
From: Nate Karstens <nate.karstens@garmin.com>
|
||||
Date: Thu, 13 Jul 2017 09:00:00 -0500
|
||||
Subject: [PATCH 5/8] Use list for changed interfaces
|
||||
|
||||
Uses a linked list to store the index of changed network interfaces
|
||||
instead of a bitfield. This allows for network interfaces with an
|
||||
index greater than 31 (an index of 36 was seen on Android).
|
||||
|
||||
Upstream-Status: Submitted [dts@apple.com]
|
||||
|
||||
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/mDNSPosix.c | 58 ++++++++++++++++++++++++++++++++-----------
|
||||
1 file changed, 43 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
||||
index 02a19b438e03..e20adda92229 100644
|
||||
--- a/mDNSPosix/mDNSPosix.c
|
||||
+++ b/mDNSPosix/mDNSPosix.c
|
||||
@@ -74,6 +74,14 @@ struct IfChangeRec
|
||||
};
|
||||
typedef struct IfChangeRec IfChangeRec;
|
||||
|
||||
+// Used to build a list of network interface indices
|
||||
+struct NetworkInterfaceIndex
|
||||
+{
|
||||
+ int if_index;
|
||||
+ struct NetworkInterfaceIndex *Next;
|
||||
+};
|
||||
+typedef struct NetworkInterfaceIndex NetworkInterfaceIndex;
|
||||
+
|
||||
// Note that static data is initialized to zero in (modern) C.
|
||||
static PosixEventSource *gEventSources; // linked list of PosixEventSource's
|
||||
static sigset_t gEventSignalSet; // Signals which event loop listens for
|
||||
@@ -1621,6 +1629,23 @@ mDNSlocal mStatus OpenIfNotifySocket(int *pFD)
|
||||
return err;
|
||||
}
|
||||
|
||||
+mDNSlocal void AddInterfaceIndexToList(GenLinkedList *list, int if_index)
|
||||
+{
|
||||
+ NetworkInterfaceIndex *item;
|
||||
+
|
||||
+ for (item = (NetworkInterfaceIndex*)list->Head; item != NULL; item = item->Next)
|
||||
+ {
|
||||
+ if (if_index == item->if_index) return;
|
||||
+ }
|
||||
+
|
||||
+ item = mdns_malloc(sizeof *item);
|
||||
+ if (item == NULL) return;
|
||||
+
|
||||
+ item->if_index = if_index;
|
||||
+ item->Next = NULL;
|
||||
+ AddToTail(list, item);
|
||||
+}
|
||||
+
|
||||
#if MDNS_DEBUGMSGS
|
||||
mDNSlocal void PrintNetLinkMsg(const struct nlmsghdr *pNLMsg)
|
||||
{
|
||||
@@ -1648,14 +1673,13 @@ mDNSlocal void PrintNetLinkMsg(const struct nlmsghdr *pNLMsg)
|
||||
}
|
||||
#endif
|
||||
|
||||
-mDNSlocal mDNSu32 ProcessRoutingNotification(int sd)
|
||||
+mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *changedInterfaces)
|
||||
// Read through the messages on sd and if any indicate that any interface records should
|
||||
// be torn down and rebuilt, return affected indices as a bitmask. Otherwise return 0.
|
||||
{
|
||||
ssize_t readCount;
|
||||
char buff[4096];
|
||||
struct nlmsghdr *pNLMsg = (struct nlmsghdr*) buff;
|
||||
- mDNSu32 result = 0;
|
||||
|
||||
// The structure here is more complex than it really ought to be because,
|
||||
// unfortunately, there's no good way to size a buffer in advance large
|
||||
@@ -1691,9 +1715,9 @@ mDNSlocal mDNSu32 ProcessRoutingNotification(int sd)
|
||||
|
||||
// Process the NetLink message
|
||||
if (pNLMsg->nlmsg_type == RTM_GETLINK || pNLMsg->nlmsg_type == RTM_NEWLINK)
|
||||
- result |= 1 << ((struct ifinfomsg*) NLMSG_DATA(pNLMsg))->ifi_index;
|
||||
+ AddInterfaceIndexToList(changedInterfaces, ((struct ifinfomsg*) NLMSG_DATA(pNLMsg))->ifi_index);
|
||||
else if (pNLMsg->nlmsg_type == RTM_DELADDR || pNLMsg->nlmsg_type == RTM_NEWADDR)
|
||||
- result |= 1 << ((struct ifaddrmsg*) NLMSG_DATA(pNLMsg))->ifa_index;
|
||||
+ AddInterfaceIndexToList(changedInterfaces, ((struct ifaddrmsg*) NLMSG_DATA(pNLMsg))->ifa_index);
|
||||
|
||||
// Advance pNLMsg to the next message in the buffer
|
||||
if ((pNLMsg->nlmsg_flags & NLM_F_MULTI) != 0 && pNLMsg->nlmsg_type != NLMSG_DONE)
|
||||
@@ -1704,8 +1728,6 @@ mDNSlocal mDNSu32 ProcessRoutingNotification(int sd)
|
||||
else
|
||||
break; // all done!
|
||||
}
|
||||
-
|
||||
- return result;
|
||||
}
|
||||
|
||||
#else // USES_NETLINK
|
||||
@@ -1737,14 +1759,13 @@ mDNSlocal void PrintRoutingSocketMsg(const struct ifa_msghdr *pRSMsg)
|
||||
}
|
||||
#endif
|
||||
|
||||
-mDNSlocal mDNSu32 ProcessRoutingNotification(int sd)
|
||||
+mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *changedInterfaces)
|
||||
// Read through the messages on sd and if any indicate that any interface records should
|
||||
// be torn down and rebuilt, return affected indices as a bitmask. Otherwise return 0.
|
||||
{
|
||||
ssize_t readCount;
|
||||
char buff[4096];
|
||||
struct ifa_msghdr *pRSMsg = (struct ifa_msghdr*) buff;
|
||||
- mDNSu32 result = 0;
|
||||
|
||||
readCount = read(sd, buff, sizeof buff);
|
||||
if (readCount < (ssize_t) sizeof(struct ifa_msghdr))
|
||||
@@ -1759,12 +1780,10 @@ mDNSlocal mDNSu32 ProcessRoutingNotification(int sd)
|
||||
pRSMsg->ifam_type == RTM_IFINFO)
|
||||
{
|
||||
if (pRSMsg->ifam_type == RTM_IFINFO)
|
||||
- result |= 1 << ((struct if_msghdr*) pRSMsg)->ifm_index;
|
||||
+ AddInterfaceIndexToList(changedInterfaces, ((struct if_msghdr*) pRSMsg)->ifm_index);
|
||||
else
|
||||
- result |= 1 << pRSMsg->ifam_index;
|
||||
+ AddInterfaceIndexToList(changedInterfaces, pRSMsg->ifam_index);
|
||||
}
|
||||
-
|
||||
- return result;
|
||||
}
|
||||
|
||||
#endif // USES_NETLINK
|
||||
@@ -1774,7 +1793,8 @@ mDNSlocal void InterfaceChangeCallback(int fd, void *context)
|
||||
{
|
||||
IfChangeRec *pChgRec = (IfChangeRec*) context;
|
||||
fd_set readFDs;
|
||||
- mDNSu32 changedInterfaces = 0;
|
||||
+ GenLinkedList changedInterfaces;
|
||||
+ NetworkInterfaceIndex *changedInterface;
|
||||
struct timeval zeroTimeout = { 0, 0 };
|
||||
|
||||
(void)fd; // Unused
|
||||
@@ -1782,17 +1802,25 @@ mDNSlocal void InterfaceChangeCallback(int fd, void *context)
|
||||
FD_ZERO(&readFDs);
|
||||
FD_SET(pChgRec->NotifySD, &readFDs);
|
||||
|
||||
+ InitLinkedList(&changedInterfaces, offsetof(NetworkInterfaceIndex, Next));
|
||||
+
|
||||
do
|
||||
{
|
||||
- changedInterfaces |= ProcessRoutingNotification(pChgRec->NotifySD);
|
||||
+ ProcessRoutingNotification(pChgRec->NotifySD, &changedInterfaces);
|
||||
}
|
||||
while (0 < select(pChgRec->NotifySD + 1, &readFDs, (fd_set*) NULL, (fd_set*) NULL, &zeroTimeout));
|
||||
|
||||
// Currently we rebuild the entire interface list whenever any interface change is
|
||||
// detected. If this ever proves to be a performance issue in a multi-homed
|
||||
// configuration, more care should be paid to changedInterfaces.
|
||||
- if (changedInterfaces)
|
||||
+ if (changedInterfaces.Head != NULL)
|
||||
mDNSPlatformPosixRefreshInterfaceList(pChgRec->mDNS);
|
||||
+
|
||||
+ while ((changedInterface = (NetworkInterfaceIndex*)changedInterfaces.Head) != NULL)
|
||||
+ {
|
||||
+ RemoveFromList(&changedInterfaces, changedInterface);
|
||||
+ mdns_free(changedInterface);
|
||||
+ }
|
||||
}
|
||||
|
||||
// Register with either a Routing Socket or RtNetLink to listen for interface changes.
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
From 60533a8947af714cc593bae6b20d47f3a4828589 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
Date: Mon, 5 Dec 2022 22:49:49 +0000
|
||||
Subject: [PATCH 5/6] mDNSCore: Fix broken debug parameter
|
||||
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSCore/mDNS.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/mDNSCore/mDNS.c b/mDNSCore/mDNS.c
|
||||
index 66979587ee82..e0a982fa1762 100644
|
||||
--- a/mDNSCore/mDNS.c
|
||||
+++ b/mDNSCore/mDNS.c
|
||||
@@ -9831,7 +9831,7 @@ mDNSlocal void mDNSCoreReceiveNoUnicastAnswers(mDNS *const m, const DNSMessage *
|
||||
#else
|
||||
const DNSServRef dnsserv = qptr->qDNSServer;
|
||||
#endif
|
||||
- debugf("mDNSCoreReceiveNoUnicastAnswers making negative cache entry TTL %d for %##s (%s)", negttl, name->c, DNSTypeName(q.qtype));
|
||||
+ debugf("mDNSCoreReceiveNoUnicastAnswers making negative cache entry TTL %d for %##s (%s)", negttl, currentQName->c, DNSTypeName(q.qtype));
|
||||
// Create a negative record for the current name in the CNAME chain.
|
||||
MakeNegativeCacheRecord(m, &m->rec.r, currentQName, currentQNameHash, q.qtype, q.qclass, negttl, mDNSInterface_Any,
|
||||
dnsserv, response->h.flags);
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,252 @@
|
||||
From bfa1d68bed863e22c40a6d9a19ffbcc8694bbff6 Mon Sep 17 00:00:00 2001
|
||||
From: Nate Karstens <nate.karstens@garmin.com>
|
||||
Date: Mon, 24 Jul 2017 09:38:55 -0500
|
||||
Subject: [PATCH 6/8] Handle noisy netlink sockets
|
||||
|
||||
The POSIX implementation currently clears all network interfaces
|
||||
when netlink indicates that there has been a change. This causes
|
||||
the following problems:
|
||||
|
||||
1) Applications are informed that all of the services they are
|
||||
tracking have been removed.
|
||||
2) Increases network load because the client must re-query for
|
||||
all records it is interested in.
|
||||
|
||||
This changes netlink notification handling by:
|
||||
|
||||
1) Always comparing with the latest interface list returned
|
||||
by the OS.
|
||||
2) Confirming that the interface has been changed in a way
|
||||
that we care about.
|
||||
|
||||
Upstream-Status: Submitted [dts@apple.com]
|
||||
|
||||
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/mDNSPosix.c | 182 +++++++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 172 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
||||
index e20adda92229..5d52de31f79b 100644
|
||||
--- a/mDNSPosix/mDNSPosix.c
|
||||
+++ b/mDNSPosix/mDNSPosix.c
|
||||
@@ -1788,14 +1788,43 @@ mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *change
|
||||
|
||||
#endif // USES_NETLINK
|
||||
|
||||
+// Test whether the given PosixNetworkInterface matches the given struct ifaddrs
|
||||
+mDNSlocal mDNSBool InterfacesMatch(PosixNetworkInterface *intf, struct ifaddrs *ifi)
|
||||
+{
|
||||
+ mDNSBool match = mDNSfalse;
|
||||
+ mDNSAddr ip, mask;
|
||||
+ unsigned int if_index;
|
||||
+
|
||||
+ if_index = if_nametoindex(ifi->ifa_name);
|
||||
+ if (if_index == 0)
|
||||
+ return mDNSfalse;
|
||||
+
|
||||
+ if((intf->index == if_index) &&
|
||||
+ (intf->sa_family == ifi->ifa_addr->sa_family) &&
|
||||
+ (strcmp(intf->coreIntf.ifname, ifi->ifa_name) == 0))
|
||||
+ {
|
||||
+ SockAddrTomDNSAddr(ifi->ifa_addr, &ip, NULL);
|
||||
+ SockAddrTomDNSAddr(ifi->ifa_netmask, &mask, NULL);
|
||||
+
|
||||
+ match = mDNSSameAddress(&intf->coreIntf.ip, &ip) &&
|
||||
+ mDNSSameAddress(&intf->coreIntf.mask, &mask);
|
||||
+ }
|
||||
+
|
||||
+ return match;
|
||||
+}
|
||||
+
|
||||
// Called when data appears on interface change notification socket
|
||||
mDNSlocal void InterfaceChangeCallback(int fd, void *context)
|
||||
{
|
||||
IfChangeRec *pChgRec = (IfChangeRec*) context;
|
||||
+ mDNS *m = pChgRec->mDNS;
|
||||
fd_set readFDs;
|
||||
GenLinkedList changedInterfaces;
|
||||
NetworkInterfaceIndex *changedInterface;
|
||||
struct timeval zeroTimeout = { 0, 0 };
|
||||
+ struct ifaddrs *ifa_list, **ifi, *ifa_loop4 = NULL;
|
||||
+ PosixNetworkInterface *intf, *intfNext;
|
||||
+ mDNSBool found, foundav4;
|
||||
|
||||
(void)fd; // Unused
|
||||
|
||||
@@ -1810,12 +1839,149 @@ mDNSlocal void InterfaceChangeCallback(int fd, void *context)
|
||||
}
|
||||
while (0 < select(pChgRec->NotifySD + 1, &readFDs, (fd_set*) NULL, (fd_set*) NULL, &zeroTimeout));
|
||||
|
||||
- // Currently we rebuild the entire interface list whenever any interface change is
|
||||
- // detected. If this ever proves to be a performance issue in a multi-homed
|
||||
- // configuration, more care should be paid to changedInterfaces.
|
||||
- if (changedInterfaces.Head != NULL)
|
||||
- mDNSPlatformPosixRefreshInterfaceList(pChgRec->mDNS);
|
||||
+ CleanRecentInterfaces();
|
||||
+
|
||||
+ if (changedInterfaces.Head == NULL) goto cleanup;
|
||||
+
|
||||
+ if (getifaddrs(&ifa_list) < 0) goto cleanup;
|
||||
+
|
||||
+ for (intf = (PosixNetworkInterface*)(m->HostInterfaces); intf != NULL; intf = intfNext)
|
||||
+ {
|
||||
+ intfNext = (PosixNetworkInterface*)(intf->coreIntf.next);
|
||||
+
|
||||
+ // Loopback interface(s) are handled later
|
||||
+ if (intf->coreIntf.Loopback) continue;
|
||||
+
|
||||
+ found = mDNSfalse;
|
||||
+ for (ifi = &ifa_list; *ifi != NULL; ifi = &(*ifi)->ifa_next)
|
||||
+ {
|
||||
+ if (InterfacesMatch(intf, *ifi))
|
||||
+ {
|
||||
+ found = mDNStrue;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // Removes changed and old interfaces from m->HostInterfaces
|
||||
+ if (!found) TearDownInterface(m, intf);
|
||||
+ }
|
||||
+
|
||||
+ // Add new and changed interfaces in ifa_list
|
||||
+ // Save off loopback interface in case it is needed later
|
||||
+ for (ifi = &ifa_list; *ifi != NULL; ifi = &(*ifi)->ifa_next)
|
||||
+ {
|
||||
+ found = mDNSfalse;
|
||||
+ for (intf = (PosixNetworkInterface*)(m->HostInterfaces); intf != NULL; intf = intfNext)
|
||||
+ {
|
||||
+ intfNext = (PosixNetworkInterface*)(intf->coreIntf.next);
|
||||
+
|
||||
+ // Loopback interface(s) are handled later
|
||||
+ if (intf->coreIntf.Loopback) continue;
|
||||
+
|
||||
+ if (InterfacesMatch(intf, *ifi))
|
||||
+ {
|
||||
+ found = mDNStrue;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ // Removes changed and old interfaces from m->HostInterfaces
|
||||
+ }
|
||||
+ if (found)
|
||||
+ continue;
|
||||
+
|
||||
+ if ((ifa_loop4 == NULL) &&
|
||||
+ ((*ifi)->ifa_addr->sa_family == AF_INET) &&
|
||||
+ ((*ifi)->ifa_flags & IFF_UP) &&
|
||||
+ ((*ifi)->ifa_flags & IFF_LOOPBACK))
|
||||
+ {
|
||||
+ ifa_loop4 = *ifi;
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if ( (((*ifi)->ifa_addr->sa_family == AF_INET)
|
||||
+#if HAVE_IPV6
|
||||
+ || ((*ifi)->ifa_addr->sa_family == AF_INET6)
|
||||
+#endif
|
||||
+ ) && ((*ifi)->ifa_flags & IFF_UP)
|
||||
+ && !((*ifi)->ifa_flags & IFF_POINTOPOINT)
|
||||
+ && !((*ifi)->ifa_flags & IFF_LOOPBACK))
|
||||
+ {
|
||||
+ struct ifaddrs *i = *ifi;
|
||||
+
|
||||
+#define ethernet_addr_len 6
|
||||
+ uint8_t hwaddr[ethernet_addr_len];
|
||||
+ int hwaddr_len = 0;
|
||||
+
|
||||
+#if defined(TARGET_OS_LINUX) && TARGET_OS_LINUX
|
||||
+ struct ifreq ifr;
|
||||
+ int sockfd = socket(AF_INET6, SOCK_DGRAM, 0);
|
||||
+ if (sockfd >= 0)
|
||||
+ {
|
||||
+ /* Add hardware address */
|
||||
+ memcpy(ifr.ifr_name, i->ifa_name, IFNAMSIZ);
|
||||
+ if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) != -1)
|
||||
+ {
|
||||
+ if (ifr.ifr_hwaddr.sa_family == ARPHRD_ETHER)
|
||||
+ {
|
||||
+ memcpy(hwaddr, ifr.ifr_hwaddr.sa_data, ethernet_addr_len);
|
||||
+ hwaddr_len = ethernet_addr_len;
|
||||
+ }
|
||||
+ }
|
||||
+ close(sockfd);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ memset(hwaddr, 0, sizeof(hwaddr));
|
||||
+ }
|
||||
+#endif // TARGET_OS_LINUX
|
||||
+ SetupOneInterface(m, i->ifa_addr, i->ifa_netmask,
|
||||
+ hwaddr, hwaddr_len, i->ifa_name, if_nametoindex(i->ifa_name), i->ifa_flags);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // Determine if there is at least one non-loopback IPv4 interface. This is to work around issues
|
||||
+ // with multicast loopback on IPv6 interfaces -- see corresponding logic in SetupInterfaceList().
|
||||
+ foundav4 = mDNSfalse;
|
||||
+ for (intf = (PosixNetworkInterface*)(m->HostInterfaces); intf != NULL; intf = (PosixNetworkInterface*)(intf->coreIntf.next))
|
||||
+ {
|
||||
+ if (intf->sa_family == AF_INET && !intf->coreIntf.Loopback)
|
||||
+ {
|
||||
+ foundav4 = mDNStrue;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (foundav4)
|
||||
+ {
|
||||
+ for (intf = (PosixNetworkInterface*)(m->HostInterfaces); intf != NULL; intf = intfNext)
|
||||
+ {
|
||||
+ intfNext = (PosixNetworkInterface*)(intf->coreIntf.next);
|
||||
+ if (intf->coreIntf.Loopback) TearDownInterface(m, intf);
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ found = mDNSfalse;
|
||||
+
|
||||
+ for (intf = (PosixNetworkInterface*)(m->HostInterfaces); intf != NULL; intf = (PosixNetworkInterface*)(intf->coreIntf.next))
|
||||
+ {
|
||||
+ if (intf->coreIntf.Loopback)
|
||||
+ {
|
||||
+ found = mDNStrue;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!found && (ifa_loop4 != NULL))
|
||||
+ {
|
||||
+ SetupOneInterface(m, ifa_loop4->ifa_addr, ifa_loop4->ifa_netmask,
|
||||
+ NULL, 0, ifa_loop4->ifa_name, if_nametoindex(ifa_loop4->ifa_name), ifa_loop4->ifa_flags);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (ifa_list != NULL) freeifaddrs(ifa_list);
|
||||
|
||||
+cleanup:
|
||||
while ((changedInterface = (NetworkInterfaceIndex*)changedInterfaces.Head) != NULL)
|
||||
{
|
||||
RemoveFromList(&changedInterfaces, changedInterface);
|
||||
@@ -1947,15 +2113,11 @@ mDNSexport void mDNSPlatformClose(mDNS *const m)
|
||||
#endif
|
||||
}
|
||||
|
||||
-// This is used internally by InterfaceChangeCallback.
|
||||
-// It's also exported so that the Standalone Responder (mDNSResponderPosix)
|
||||
+// This is exported so that the Standalone Responder (mDNSResponderPosix)
|
||||
// can call it in response to a SIGHUP (mainly for debugging purposes).
|
||||
mDNSexport mStatus mDNSPlatformPosixRefreshInterfaceList(mDNS *const m)
|
||||
{
|
||||
int err;
|
||||
- // This is a pretty heavyweight way to process interface changes --
|
||||
- // destroying the entire interface list and then making fresh one from scratch.
|
||||
- // We should make it like the OS X version, which leaves unchanged interfaces alone.
|
||||
ClearInterfaceList(m);
|
||||
err = SetupInterfaceList(m);
|
||||
return PosixErrorToStatus(err);
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
From fa9ef50ab4c4225cf3ade4bafc38ddf93e6fe127 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
Date: Tue, 6 Dec 2022 13:28:31 +0000
|
||||
Subject: [PATCH 6/6] make: Add top-level Makefile
|
||||
|
||||
Simple top level Makefile that just delegates to mDNSPosix.
|
||||
|
||||
Upstream-Status: Inappropriate [oe-specific]
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
Makefile | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
create mode 100644 Makefile
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
new file mode 100644
|
||||
index 000000000000..feb6ac67ef47
|
||||
--- /dev/null
|
||||
+++ b/Makefile
|
||||
@@ -0,0 +1,2 @@
|
||||
+all clean:
|
||||
+ cd mDNSPosix && $(MAKE) $@
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
From a8accffb95267490b50401c8b65ec18db57b5ef5 Mon Sep 17 00:00:00 2001
|
||||
From: Nate Karstens <nate.karstens@garmin.com>
|
||||
Date: Wed, 9 Aug 2017 09:16:58 -0500
|
||||
Subject: [PATCH 7/8] Mark deleted interfaces as being changed
|
||||
|
||||
Netlink notification handling ignores messages for deleted links,
|
||||
RTM_DELLINK. It does handle RTM_GETLINK. According to libnl docu-
|
||||
mentation (http://www.infradead.org/~tgr/libnl/doc/route.html)
|
||||
RTM_DELLINK can be sent by the kernel, but RTM_GETLINK cannot.
|
||||
There was likely a mixup in the original implementation, so this
|
||||
change replaces handling for RTM_GETLINK with RTM_DELLINK.
|
||||
|
||||
Testing and Verification Instructions:
|
||||
1. Use ip-link to add and remove a VLAN interface and verify
|
||||
that mDNSResponder handles the deleted link.
|
||||
|
||||
Upstream-Status: Submitted [dts@apple.com]
|
||||
|
||||
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/mDNSPosix.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
||||
index 5d52de31f79b..77d982f4c50b 100644
|
||||
--- a/mDNSPosix/mDNSPosix.c
|
||||
+++ b/mDNSPosix/mDNSPosix.c
|
||||
@@ -1714,7 +1714,7 @@ mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *change
|
||||
#endif
|
||||
|
||||
// Process the NetLink message
|
||||
- if (pNLMsg->nlmsg_type == RTM_GETLINK || pNLMsg->nlmsg_type == RTM_NEWLINK)
|
||||
+ if (pNLMsg->nlmsg_type == RTM_DELLINK || pNLMsg->nlmsg_type == RTM_NEWLINK)
|
||||
AddInterfaceIndexToList(changedInterfaces, ((struct ifinfomsg*) NLMSG_DATA(pNLMsg))->ifi_index);
|
||||
else if (pNLMsg->nlmsg_type == RTM_DELADDR || pNLMsg->nlmsg_type == RTM_NEWADDR)
|
||||
AddInterfaceIndexToList(changedInterfaces, ((struct ifaddrmsg*) NLMSG_DATA(pNLMsg))->ifa_index);
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
From ed58146d3aeecdb9920fdc017f85c18b5b10f2db Mon Sep 17 00:00:00 2001
|
||||
From: Nate Karstens <nate.karstens@garmin.com>
|
||||
Date: Thu, 10 Aug 2017 08:27:32 -0500
|
||||
Subject: [PATCH 8/8] Handle errors from socket calls
|
||||
|
||||
Adds handling for socket() or read() returning a
|
||||
negative value (indicating an error has occurred).
|
||||
|
||||
Upstream-Status: Submitted [dts@apple.com]
|
||||
|
||||
Signed-off-by: Nate Karstens <nate.karstens@garmin.com>
|
||||
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
|
||||
---
|
||||
mDNSPosix/mDNSPosix.c | 12 +++++++++---
|
||||
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
|
||||
index 77d982f4c50b..cab512160afb 100644
|
||||
--- a/mDNSPosix/mDNSPosix.c
|
||||
+++ b/mDNSPosix/mDNSPosix.c
|
||||
@@ -1677,7 +1677,7 @@ mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *change
|
||||
// Read through the messages on sd and if any indicate that any interface records should
|
||||
// be torn down and rebuilt, return affected indices as a bitmask. Otherwise return 0.
|
||||
{
|
||||
- ssize_t readCount;
|
||||
+ ssize_t readVal, readCount;
|
||||
char buff[4096];
|
||||
struct nlmsghdr *pNLMsg = (struct nlmsghdr*) buff;
|
||||
|
||||
@@ -1686,7 +1686,10 @@ mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *change
|
||||
// enough to hold all pending data and so avoid message fragmentation.
|
||||
// (Note that FIONREAD is not supported on AF_NETLINK.)
|
||||
|
||||
- readCount = read(sd, buff, sizeof buff);
|
||||
+ readVal = read(sd, buff, sizeof buff);
|
||||
+ if (readVal < 0) return;
|
||||
+ readCount = readVal;
|
||||
+
|
||||
while (1)
|
||||
{
|
||||
// Make sure we've got an entire nlmsghdr in the buffer, and payload, too.
|
||||
@@ -1702,7 +1705,9 @@ mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *change
|
||||
pNLMsg = (struct nlmsghdr*) buff;
|
||||
|
||||
// read more data
|
||||
- readCount += read(sd, buff + readCount, sizeof buff - readCount);
|
||||
+ readVal = read(sd, buff + readCount, sizeof buff - readCount);
|
||||
+ if (readVal < 0) return;
|
||||
+ readCount += readVal;
|
||||
continue; // spin around and revalidate with new readCount
|
||||
}
|
||||
else
|
||||
@@ -2017,6 +2022,7 @@ mDNSlocal mDNSBool mDNSPlatformInit_CanReceiveUnicast(void)
|
||||
int err;
|
||||
int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
struct sockaddr_in s5353;
|
||||
+ if (s < 0) return mDNSfalse;
|
||||
s5353.sin_family = AF_INET;
|
||||
s5353.sin_port = MulticastDNSPort.NotAnInteger;
|
||||
s5353.sin_addr.s_addr = 0;
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
[Unit]
|
||||
Description=Zero-configuration networking
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
ExecStartPre=/bin/rm -f /var/run/mdnsd.pid
|
||||
ExecStart=/usr/sbin/mdnsd
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
PIDFile=/var/run/mdnsd.pid
|
||||
Restart=always
|
||||
RestartSec=10s
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,134 @@
|
||||
SUMMARY = "Publishes & browses available services on a link according to the Zeroconf / Bonjour protocol"
|
||||
DESCRIPTION = "Bonjour, also known as zero-configuration networking, enables automatic discovery of computers, devices, and services on IP networks."
|
||||
HOMEPAGE = "http://developer.apple.com/networking/bonjour/"
|
||||
LICENSE = "Apache-2.0 & BSD-3-Clause"
|
||||
LIC_FILES_CHKSUM = "file://LICENSE;md5=31c50371921e0fb731003bbc665f29bf"
|
||||
|
||||
DEPENDS:append:libc-musl = " musl-nscd"
|
||||
|
||||
SRC_URI = "git://github.com/apple-oss-distributions/mDNSResponder;protocol=https;branch=rel/mDNSResponder-1790 \
|
||||
file://0001-dns-sd-Include-missing-headers.patch \
|
||||
file://0002-make-Set-libdns_sd.so-soname-correctly.patch \
|
||||
file://0003-mDNSShared-Drop-MacOS-specific-__block-qualifier.patch \
|
||||
file://0004-make-Separate-TLS-targets-from-libraries.patch \
|
||||
file://0005-mDNSCore-Fix-broken-debug-parameter.patch \
|
||||
file://0006-make-Add-top-level-Makefile.patch \
|
||||
file://0001-Create-subroutine-for-cleaning-recent-interfaces.patch \
|
||||
file://0002-Create-subroutine-for-tearing-down-an-interface.patch \
|
||||
file://0003-Track-interface-socket-family.patch \
|
||||
file://0004-Indicate-loopback-interface-to-mDNS-core.patch \
|
||||
file://0005-Use-list-for-changed-interfaces.patch \
|
||||
file://0006-Handle-noisy-netlink-sockets.patch \
|
||||
file://0007-Mark-deleted-interfaces-as-being-changed.patch \
|
||||
file://0008-Handle-errors-from-socket-calls.patch \
|
||||
file://mdns.service \
|
||||
"
|
||||
SRCREV = "8769ab51605e465425d33d757f602ce5905ca639"
|
||||
|
||||
# We install a stub Makefile in the top directory so that the various checks
|
||||
# in base.bbclass pass their tests for a Makefile, this ensures (that amongst
|
||||
# other things) the sstate checks will clean the build directory when the
|
||||
# task hashes changes.
|
||||
#
|
||||
# We can't use the approach of setting ${S} to mDNSPosix as we need
|
||||
# DEBUG_PREFIX_MAP to cover files which come from the Clients directory too.
|
||||
S = "${WORKDIR}/git"
|
||||
|
||||
inherit github-releases manpages systemd update-rc.d
|
||||
|
||||
PACKAGECONFIG ?= "tls \
|
||||
${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)}"
|
||||
PACKAGECONFIG[debug] = "DEBUG=1,DEBUG=0"
|
||||
PACKAGECONFIG[ipv6] = "HAVE_IPV6=1,HAVE_IPV6=0"
|
||||
PACKAGECONFIG[manpages] = ""
|
||||
PACKAGECONFIG[tls] = ",tls=no,mbedtls"
|
||||
|
||||
CVE_PRODUCT = "apple:mdnsresponder"
|
||||
|
||||
# CVE-2007-0613 is not applicable as it only affects Apple products
|
||||
# i.e. ichat,mdnsresponder, instant message framework and MacOS.
|
||||
# Also, https://www.exploit-db.com/exploits/3230 shows the part of code
|
||||
# affected by CVE-2007-0613 which is not preset in upstream source code.
|
||||
# Hence, CVE-2007-0613 does not affect other Yocto implementations and
|
||||
# is not reported for other distros can be marked whitelisted.
|
||||
# Links:
|
||||
# https://vulmon.com/vulnerabilitydetails?qid=CVE-2007-0613
|
||||
# https://www.incibe-cert.es/en/early-warning/vulnerabilities/cve-2007-0613
|
||||
# https://security-tracker.debian.org/tracker/CVE-2007-0613
|
||||
# https://vulmon.com/vulnerabilitydetails?qid=CVE-2007-0613
|
||||
CVE_CHECK_IGNORE += "CVE-2007-0613"
|
||||
|
||||
PARALLEL_MAKE = ""
|
||||
|
||||
EXTRA_OEMAKE = "os=linux 'CC=${CCLD}' 'LD=${CCLD}' 'LINKOPTS=${LDFLAGS}' STRIP=: ${PACKAGECONFIG_CONFARGS}"
|
||||
|
||||
# MDNS_VERSIONSTR_NODTS disables __DATE__ and __TIME__ in the version string,
|
||||
# which are fixed anyway for build reproducibility.
|
||||
TARGET_CPPFLAGS += "-DMDNS_VERSIONSTR_NODTS"
|
||||
|
||||
TARGET_CC_ARCH += "${LDFLAGS}"
|
||||
|
||||
MDNS_BUILDDIR = "build/${@bb.utils.contains('PACKAGECONFIG','debug','debug','prod', d)}"
|
||||
|
||||
do_install () {
|
||||
cd mDNSPosix
|
||||
|
||||
install -d ${D}${sbindir}
|
||||
install ${MDNS_BUILDDIR}/mdnsd ${D}${sbindir}
|
||||
|
||||
install -d ${D}${libdir}
|
||||
install -m 0644 ${MDNS_BUILDDIR}/libdns_sd.so ${D}${libdir}/libdns_sd.so.1
|
||||
ln -s libdns_sd.so.1 ${D}${libdir}/libdns_sd.so
|
||||
|
||||
install -d ${D}${includedir}
|
||||
install -m 0644 ../mDNSShared/dns_sd.h ${D}${includedir}
|
||||
|
||||
install -d ${D}${mandir}/man8
|
||||
install -m 0644 ../mDNSShared/mDNSResponder.8 ${D}${mandir}/man8/mdnsd.8
|
||||
|
||||
install -d ${D}${bindir}
|
||||
install -m 0755 ../Clients/build/dns-sd ${D}${bindir}
|
||||
|
||||
install -d ${D}${libdir}
|
||||
oe_libinstall -C ${MDNS_BUILDDIR} -so libnss_mdns-0.2 ${D}${libdir}
|
||||
ln -s libnss_mdns-0.2.so ${D}${libdir}/libnss_mdns.so.2
|
||||
|
||||
install -d ${D}${sysconfdir}
|
||||
install -m 0644 nss_mdns.conf ${D}${sysconfdir}
|
||||
|
||||
install -d ${D}${mandir}/man5
|
||||
install -m 0644 nss_mdns.conf.5 ${D}${mandir}/man5
|
||||
|
||||
install -d ${D}${mandir}/man8
|
||||
install -m 0644 libnss_mdns.8 ${D}${mandir}/man8
|
||||
|
||||
install -d ${D}${systemd_system_unitdir}
|
||||
install -m 0644 ${WORKDIR}/mdns.service ${D}${systemd_system_unitdir}
|
||||
|
||||
install -d ${D}${INIT_D_DIR}
|
||||
install mdnsd.sh ${D}${INIT_D_DIR}/mdns
|
||||
}
|
||||
|
||||
pkg_postinst:${PN} () {
|
||||
if [ -r $D${sysconfdir}/nsswitch.conf ]; then
|
||||
sed -e '/^hosts:/s/\s*\<mdns\>//' \
|
||||
-e 's/\(^hosts:.*\)\(\<files\>\)\(.*\)\(\<dns\>\)\(.*\)/\1\2 mdns\3\4\5/' \
|
||||
-i $D${sysconfdir}/nsswitch.conf
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_prerm:${PN} () {
|
||||
if [ -r $D${sysconfdir}/nsswitch.conf ]; then
|
||||
sed -e '/^hosts:/s/\s*\<mdns\>//' \
|
||||
-e '/^hosts:/s/\s*mdns//' \
|
||||
-i $D${sysconfdir}/nsswitch.conf
|
||||
fi
|
||||
}
|
||||
|
||||
SYSTEMD_SERVICE:${PN} = "mdns.service"
|
||||
INITSCRIPT_NAME = "mdns"
|
||||
|
||||
FILES_SOLIBSDEV = "${libdir}/libdns_sd.so"
|
||||
FILES:${PN} += "${libdir}/libnss_mdns-0.2.so"
|
||||
|
||||
RPROVIDES:${PN} += "libdns_sd.so"
|
||||
Reference in New Issue
Block a user