summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2025-08-13 16:48:06 +0200
committerxengineering <me@xengineering.eu>2025-08-13 17:43:25 +0200
commitf1bec5479d5c86655f0014e79b6c8f3d9aa3f063 (patch)
treee1820f30735b8adc389b5cf4130f5de38ebb7e0b
parentc48811f9b52a3929a85ba3b9d69b685fc1320edf (diff)
downloadiot-contact-mdns.tar
iot-contact-mdns.tar.zst
iot-contact-mdns.zip
WIP: fw: app: Implement mDNS proof of conceptmdns
TODO: Make this work. WireShark shows that some request / response is exchanged but it is unclear why the request is always canceled after timeout on the Zephyr side.
-rw-r--r--fw/app/prj.conf15
-rw-r--r--fw/app/src/heart.c81
2 files changed, 95 insertions, 1 deletions
diff --git a/fw/app/prj.conf b/fw/app/prj.conf
index 6589ec0..19d10c8 100644
--- a/fw/app/prj.conf
+++ b/fw/app/prj.conf
@@ -59,3 +59,18 @@ CONFIG_SETTINGS_SHELL=y
CONFIG_GNU_C_EXTENSIONS=y
CONFIG_JSON_LIBRARY=y
+
+# Enable the DNS resolver
+CONFIG_DNS_RESOLVER=y
+# Enable additional buffers
+CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=5
+# Enable additional queries
+CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
+# Enable mDNS support
+CONFIG_MDNS_RESOLVER=y
+# Enable LLMNR support
+CONFIG_LLMNR_RESOLVER=n
+
+CONFIG_DNS_RESOLVER_MAX_SERVERS=2
+CONFIG_DNS_SERVER_IP_ADDRESSES=y
+CONFIG_DNS_NUM_CONCUR_QUERIES=5
diff --git a/fw/app/src/heart.c b/fw/app/src/heart.c
index 6bcced6..643ec61 100644
--- a/fw/app/src/heart.c
+++ b/fw/app/src/heart.c
@@ -9,17 +9,20 @@
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
+#include <zephyr/net/dns_resolve.h>
#include "heart.h"
-LOG_MODULE_REGISTER(heart);
+LOG_MODULE_REGISTER(heart, 4);
#define HEART_PERIOD K_MSEC(1000)
#define HEART_STACK_SIZE 500
#define HEART_PRIO K_PRIO_PREEMPT(8)
+#define DNS_TIMEOUT (3 * MSEC_PER_SEC)
+
ZBUS_CHAN_DEFINE(
heartbeat_channel,
@@ -31,11 +34,87 @@ ZBUS_CHAN_DEFINE(
);
+void mdns_result_cb(enum dns_resolve_status status,
+ struct dns_addrinfo *info,
+ void *user_data)
+{
+ char hr_addr[NET_IPV6_ADDR_LEN];
+ char *hr_family;
+ void *addr;
+
+ switch (status) {
+ case DNS_EAI_CANCELED:
+ LOG_INF("mDNS query was canceled");
+ return;
+ case DNS_EAI_FAIL:
+ LOG_INF("mDNS resolve failed");
+ return;
+ case DNS_EAI_NODATA:
+ LOG_INF("Cannot resolve address using mDNS");
+ return;
+ case DNS_EAI_ALLDONE:
+ LOG_INF("mDNS resolving finished");
+ return;
+ case DNS_EAI_INPROGRESS:
+ break;
+ default:
+ LOG_INF("mDNS resolving error (%d)", status);
+ return;
+ }
+
+ if (!info) {
+ return;
+ }
+
+ if (info->ai_family == AF_INET) {
+ hr_family = "IPv4";
+ addr = &net_sin(&info->ai_addr)->sin_addr;
+ } else if (info->ai_family == AF_INET6) {
+ hr_family = "IPv6";
+ addr = &net_sin6(&info->ai_addr)->sin6_addr;
+ } else {
+ LOG_ERR("Invalid IP address family %d", info->ai_family);
+ return;
+ }
+
+ LOG_INF("%s %s address: %s", user_data ? (char *)user_data : "<null>",
+ hr_family,
+ net_addr_ntop(info->ai_family, addr,
+ hr_addr, sizeof(hr_addr)));
+}
+
+
+static void do_mdns_ipv6_lookup(void)
+{
+ static const char *query = "thinkpad.local";
+ int ret;
+
+ LOG_DBG("Doing mDNS IPv6 query");
+
+ ret = dns_get_addr_info(query,
+ DNS_QUERY_TYPE_AAAA,
+ NULL,
+ mdns_result_cb,
+ (void *)query,
+ DNS_TIMEOUT);
+ if (ret < 0) {
+ LOG_ERR("Cannot resolve mDNS IPv6 address (%d)", ret);
+ return;
+ }
+
+ LOG_DBG("mDNS v6 query sent");
+}
+
+
static void heart_thread_function(void *ptr1, void *ptr2, void *ptr3) {
LOG_INF("Starting to beat");
struct heartbeat heartbeat = {.ttl_ms = 1100};
+ k_msleep(2000);
+ LOG_INF("Starting this thing");
+ do_mdns_ipv6_lookup();
+
while (true) {
LOG_DBG("Heart beat");
int ret = zbus_chan_pub(&heartbeat_channel, &heartbeat, K_FOREVER);