1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
#include <stdbool.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <zephyr/net/dns_resolve.h>
#include "heart.h"
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,
struct heartbeat,
NULL,
NULL,
ZBUS_OBSERVERS_EMPTY,
ZBUS_MSG_INIT(.ttl_ms = 0)
);
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);
if (ret < 0) {
LOG_ERR("Could not publish heartbeat");
}
k_sleep(HEART_PERIOD);
}
}
K_THREAD_DEFINE(heart_thread, HEART_STACK_SIZE,
heart_thread_function, NULL, NULL, NULL,
HEART_PRIO, 0, 0);
|