aboutsummaryrefslogtreecommitdiffstats
path: root/meta-networking/recipes-protocols/mdns/mdns
diff options
context:
space:
mode:
Diffstat (limited to 'meta-networking/recipes-protocols/mdns/mdns')
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0001-Create-subroutine-for-cleaning-recent-interfaces.patch58
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0001-Fix-SIGSEGV-during-DumpStateLog.patch27
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0001-Handle-interface-without-ifa_addr.patch38
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0001-dns-sd-Include-missing-headers.patch27
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0002-Create-subroutine-for-tearing-down-an-interface.patch56
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0002-make-Set-libdns_sd.so-soname-correctly.patch24
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0003-Track-interface-socket-family.patch48
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0004-Indicate-loopback-interface-to-mDNS-core.patch55
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0004-make-Separate-TLS-targets-from-libraries.patch61
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0005-Use-list-for-changed-interfaces.patch166
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0005-mDNSCore-Fix-broken-debug-parameter.patch24
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0006-Handle-noisy-netlink-sockets.patch249
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0006-make-Add-top-level-Makefile.patch22
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0007-Mark-deleted-interfaces-as-being-changed.patch37
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0008-Handle-errors-from-socket-calls.patch60
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/0009-remove-unneeded-headers.patch31
-rw-r--r--meta-networking/recipes-protocols/mdns/mdns/mdns.service15
17 files changed, 998 insertions, 0 deletions
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0001-Create-subroutine-for-cleaning-recent-interfaces.patch b/meta-networking/recipes-protocols/mdns/mdns/0001-Create-subroutine-for-cleaning-recent-interfaces.patch
new file mode 100644
index 0000000000..68a395d69e
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0001-Create-subroutine-for-cleaning-recent-interfaces.patch
@@ -0,0 +1,58 @@
+From 1fefe289d0c907392382eb2fa2f1f0ecac02f85d 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] 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 3b761d04e3c4..5aa220cf694e 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;
+ }
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0001-Fix-SIGSEGV-during-DumpStateLog.patch b/meta-networking/recipes-protocols/mdns/mdns/0001-Fix-SIGSEGV-during-DumpStateLog.patch
new file mode 100644
index 0000000000..abf82b1e02
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0001-Fix-SIGSEGV-during-DumpStateLog.patch
@@ -0,0 +1,27 @@
+From 2db1f5bc941e4b4cd1721e361a47cfe288b07a76 Mon Sep 17 00:00:00 2001
+From: Alex Kiernan <alex.kiernan@gmail.com>
+Date: Thu, 1 Feb 2024 14:07:03 +0000
+Subject: [PATCH] Fix SIGSEGV during DumpStateLog()
+
+DumpStateLog() calls LogMsgWithLevelv() with category == NULL, avoid
+crashing in this case.
+
+Upstream-Status: Inactive-Upstream [Upstream does not take patches]
+Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
+---
+ mDNSShared/mDNSDebug.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/mDNSShared/mDNSDebug.c b/mDNSShared/mDNSDebug.c
+index 7a4ca19eff6d..d449dde320f6 100644
+--- a/mDNSShared/mDNSDebug.c
++++ b/mDNSShared/mDNSDebug.c
+@@ -71,7 +71,7 @@ mDNSlocal void LogMsgWithLevelv(os_log_t category, os_log_type_t level, const ch
+ mDNSlocal void LogMsgWithLevelv(const char *category, mDNSLogLevel_t level, const char *format, va_list args)
+ {
+ // Do not print the logs if the log category is MDNS_LOG_CATEGORY_DISABLED.
+- if (strcmp(category, MDNS_LOG_CATEGORY_DISABLED) == 0)
++ if (category && strcmp(category, MDNS_LOG_CATEGORY_DISABLED) == 0)
+ {
+ return;
+ }
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0001-Handle-interface-without-ifa_addr.patch b/meta-networking/recipes-protocols/mdns/mdns/0001-Handle-interface-without-ifa_addr.patch
new file mode 100644
index 0000000000..7ec5996013
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0001-Handle-interface-without-ifa_addr.patch
@@ -0,0 +1,38 @@
+From c67102307f25c5f4d238c736e90519e56a76ae79 Mon Sep 17 00:00:00 2001
+From: Stefan Agner <stefan@agner.ch>
+Date: Fri, 23 Jun 2023 10:10:00 +0200
+Subject: [PATCH] Handle interface without `ifa_addr`
+
+It seems that certain interface types may have `ifa_addr` set to null.
+Handle this case gracefully.
+
+Upstream-Status: Submitted [https://github.com/apple-oss-distributions/mDNSResponder/pull/2/commits/11b410d4d683c90e693c40315997bb3e8ec90e9a]
+
+Signed-off-by: Stefan Agner <stefan@agner.ch>
+Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
+---
+ mDNSPosix/mDNSPosix.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
+index 0c9dd2582660..c3ead26799e6 100644
+--- a/mDNSPosix/mDNSPosix.c
++++ b/mDNSPosix/mDNSPosix.c
+@@ -1895,6 +1895,7 @@ mDNSlocal void InterfaceChangeCallback(int fd, void *context)
+ continue;
+
+ if ((ifa_loop4 == NULL) &&
++ ((*ifi)->ifa_addr != NULL) &&
+ ((*ifi)->ifa_addr->sa_family == AF_INET) &&
+ ((*ifi)->ifa_flags & IFF_UP) &&
+ ((*ifi)->ifa_flags & IFF_LOOPBACK))
+@@ -1903,7 +1904,8 @@ mDNSlocal void InterfaceChangeCallback(int fd, void *context)
+ continue;
+ }
+
+- if ( (((*ifi)->ifa_addr->sa_family == AF_INET)
++ if ( ((*ifi)->ifa_addr != NULL) &&
++ (((*ifi)->ifa_addr->sa_family == AF_INET)
+ #if HAVE_IPV6
+ || ((*ifi)->ifa_addr->sa_family == AF_INET6)
+ #endif
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0001-dns-sd-Include-missing-headers.patch b/meta-networking/recipes-protocols/mdns/mdns/0001-dns-sd-Include-missing-headers.patch
new file mode 100644
index 0000000000..0dc36ae1d4
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0001-dns-sd-Include-missing-headers.patch
@@ -0,0 +1,27 @@
+From a5fe20fa00088683136a09a4da3c36d9b20fe1b9 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] 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
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0002-Create-subroutine-for-tearing-down-an-interface.patch b/meta-networking/recipes-protocols/mdns/mdns/0002-Create-subroutine-for-tearing-down-an-interface.patch
new file mode 100644
index 0000000000..5ce7eb1015
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0002-Create-subroutine-for-tearing-down-an-interface.patch
@@ -0,0 +1,56 @@
+From d265ac9346d3dcbcf1187134318baafcfa75c054 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] 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 5aa220cf694e..a6041b04a21e 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)
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0002-make-Set-libdns_sd.so-soname-correctly.patch b/meta-networking/recipes-protocols/mdns/mdns/0002-make-Set-libdns_sd.so-soname-correctly.patch
new file mode 100644
index 0000000000..86b659f8a1
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0002-make-Set-libdns_sd.so-soname-correctly.patch
@@ -0,0 +1,24 @@
+From dfa9e2c494d1a834f5bdfe4dc24e8329dd8720eb 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] 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 041706523139..c877c8bb19e6 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
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0003-Track-interface-socket-family.patch b/meta-networking/recipes-protocols/mdns/mdns/0003-Track-interface-socket-family.patch
new file mode 100644
index 0000000000..59871eb66a
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0003-Track-interface-socket-family.patch
@@ -0,0 +1,48 @@
+From 5f58e5671cd6dbd4cb49bd30fb606d430b626361 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] 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 a6041b04a21e..15bbecee04a4 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;
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0004-Indicate-loopback-interface-to-mDNS-core.patch b/meta-networking/recipes-protocols/mdns/mdns/0004-Indicate-loopback-interface-to-mDNS-core.patch
new file mode 100644
index 0000000000..bf2b85c2ab
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0004-Indicate-loopback-interface-to-mDNS-core.patch
@@ -0,0 +1,55 @@
+From 935033dd40772240c9bcc6b9610d78eb3753bfaf 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] 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 15bbecee04a4..f4c31a07d587 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.
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0004-make-Separate-TLS-targets-from-libraries.patch b/meta-networking/recipes-protocols/mdns/mdns/0004-make-Separate-TLS-targets-from-libraries.patch
new file mode 100644
index 0000000000..8d1915de8c
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0004-make-Separate-TLS-targets-from-libraries.patch
@@ -0,0 +1,61 @@
+From f871ac42165c29f763785aa0199dfc76f1731f4d 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] 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 c877c8bb19e6..3a5897c4dbee 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
+
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0005-Use-list-for-changed-interfaces.patch b/meta-networking/recipes-protocols/mdns/mdns/0005-Use-list-for-changed-interfaces.patch
new file mode 100644
index 0000000000..ebdfe8c783
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0005-Use-list-for-changed-interfaces.patch
@@ -0,0 +1,166 @@
+From 47118760466b74939cec9f5233062236a12bb3f4 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] 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 f4c31a07d587..6b2fe76d4b66 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.
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0005-mDNSCore-Fix-broken-debug-parameter.patch b/meta-networking/recipes-protocols/mdns/mdns/0005-mDNSCore-Fix-broken-debug-parameter.patch
new file mode 100644
index 0000000000..3c46d599c1
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0005-mDNSCore-Fix-broken-debug-parameter.patch
@@ -0,0 +1,24 @@
+From 0b3953dfdeef8dc9b8a23820659feee9e15b5bad 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] mDNSCore: Fix broken debug parameter
+
+Upstream-Status: Pending
+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 d4519a7f62aa..3090edb2ac5d 100644
+--- a/mDNSCore/mDNS.c
++++ b/mDNSCore/mDNS.c
+@@ -10253,7 +10253,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, currentQName, 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);
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0006-Handle-noisy-netlink-sockets.patch b/meta-networking/recipes-protocols/mdns/mdns/0006-Handle-noisy-netlink-sockets.patch
new file mode 100644
index 0000000000..be63471e64
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0006-Handle-noisy-netlink-sockets.patch
@@ -0,0 +1,249 @@
+From 105514b75df6d7abd052ec64d8106f5c07cc4782 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] 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 6b2fe76d4b66..ecd5741d038d 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);
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0006-make-Add-top-level-Makefile.patch b/meta-networking/recipes-protocols/mdns/mdns/0006-make-Add-top-level-Makefile.patch
new file mode 100644
index 0000000000..ffa3fa3827
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0006-make-Add-top-level-Makefile.patch
@@ -0,0 +1,22 @@
+From 626ccae85aab5b0902a8e3c05d9f0e3fbbe4fcd2 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] 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) $@
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0007-Mark-deleted-interfaces-as-being-changed.patch b/meta-networking/recipes-protocols/mdns/mdns/0007-Mark-deleted-interfaces-as-being-changed.patch
new file mode 100644
index 0000000000..276f879df2
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0007-Mark-deleted-interfaces-as-being-changed.patch
@@ -0,0 +1,37 @@
+From 3715b3f4a0ba2d2cb05e5ba617b523c759c88d4b 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] 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 ecd5741d038d..776531dbc8e8 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);
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0008-Handle-errors-from-socket-calls.patch b/meta-networking/recipes-protocols/mdns/mdns/0008-Handle-errors-from-socket-calls.patch
new file mode 100644
index 0000000000..f3c7f62d3f
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0008-Handle-errors-from-socket-calls.patch
@@ -0,0 +1,60 @@
+From 4e6621eee389e1cbb558fe268e02d5153a1d8f2d 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] 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 776531dbc8e8..0c9dd2582660 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;
diff --git a/meta-networking/recipes-protocols/mdns/mdns/0009-remove-unneeded-headers.patch b/meta-networking/recipes-protocols/mdns/mdns/0009-remove-unneeded-headers.patch
new file mode 100644
index 0000000000..818017037c
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/0009-remove-unneeded-headers.patch
@@ -0,0 +1,31 @@
+From 05cb409ce213f35798c02faf2032d4846a84b48e Mon Sep 17 00:00:00 2001
+From: Beniamin Sandu <beniaminsandu@gmail.com>
+Date: Thu, 15 Jun 2023 17:02:58 +0000
+Subject: [PATCH] remove unneeded headers
+
+From a quick look, these seem to not be needed and having them
+breaks the build with mbedtls 3.x. Without them it builds fine
+on both 2.x and 3.x versions.
+
+Upstream-Status: Pending
+
+Signed-off-by: Beniamin Sandu <beniaminsandu@gmail.com>
+---
+ mDNSPosix/mbedtls.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/mDNSPosix/mbedtls.c b/mDNSPosix/mbedtls.c
+index a73681b6d528..ab8f8c772c00 100644
+--- a/mDNSPosix/mbedtls.c
++++ b/mDNSPosix/mbedtls.c
+@@ -38,10 +38,8 @@
+ #include <mbedtls/sha256.h>
+ #include <mbedtls/base64.h>
+
+-#include <mbedtls/certs.h>
+ #include <mbedtls/x509.h>
+ #include <mbedtls/ssl.h>
+-#include <mbedtls/config.h>
+
+ // Posix TLS server context
+ struct TLSContext_struct {
diff --git a/meta-networking/recipes-protocols/mdns/mdns/mdns.service b/meta-networking/recipes-protocols/mdns/mdns/mdns.service
new file mode 100644
index 0000000000..531d142dcd
--- /dev/null
+++ b/meta-networking/recipes-protocols/mdns/mdns/mdns.service
@@ -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