summaryrefslogtreecommitdiff
path: root/fw/app/src/heart.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/app/src/heart.c')
-rw-r--r--fw/app/src/heart.c81
1 files changed, 80 insertions, 1 deletions
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);