diff options
author | xengineering <me@xengineering.eu> | 2025-08-13 16:48:06 +0200 |
---|---|---|
committer | xengineering <me@xengineering.eu> | 2025-08-13 17:43:25 +0200 |
commit | f1bec5479d5c86655f0014e79b6c8f3d9aa3f063 (patch) | |
tree | e1820f30735b8adc389b5cf4130f5de38ebb7e0b /fw/app | |
parent | c48811f9b52a3929a85ba3b9d69b685fc1320edf (diff) | |
download | iot-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.
Diffstat (limited to 'fw/app')
-rw-r--r-- | fw/app/prj.conf | 15 | ||||
-rw-r--r-- | fw/app/src/heart.c | 81 |
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); |