tests: net: dns-sd: add a test case for setup_dst_addr
Add a test case for mdns setup_dst_addr.
Signed-off-by: Fabio Baltieri <fabio.baltieri@gmail.com>
diff --git a/subsys/net/lib/dns/mdns_responder.c b/subsys/net/lib/dns/mdns_responder.c
index bf590d3..b794cf8 100644
--- a/subsys/net/lib/dns/mdns_responder.c
+++ b/subsys/net/lib/dns/mdns_responder.c
@@ -51,6 +51,11 @@
#define DNS_RESOLVER_BUF_CTR (DNS_RESOLVER_MIN_BUF + \
CONFIG_MDNS_RESOLVER_ADDITIONAL_BUF_CTR)
+#ifndef CONFIG_NET_TEST
+static int setup_dst_addr(struct net_context *ctx, struct net_pkt *pkt,
+ struct sockaddr *dst, socklen_t *dst_len);
+#endif /* CONFIG_NET_TEST */
+
NET_BUF_POOL_DEFINE(mdns_msg_pool, DNS_RESOLVER_BUF_CTR,
DNS_RESOLVER_MAX_BUF_SIZE, 0, NULL);
@@ -73,10 +78,8 @@
addr->sin_addr.s_addr = htonl(0xE00000FB);
}
-static int setup_dst_addr(struct net_context *ctx,
- struct net_pkt *pkt,
- struct sockaddr *dst,
- socklen_t *dst_len)
+int setup_dst_addr(struct net_context *ctx, struct net_pkt *pkt,
+ struct sockaddr *dst, socklen_t *dst_len)
{
if (IS_ENABLED(CONFIG_NET_IPV4) &&
net_pkt_family(pkt) == AF_INET) {
diff --git a/tests/net/lib/dns_sd/src/main.c b/tests/net/lib/dns_sd/src/main.c
index 8c2c1cf..a3c5f5c 100644
--- a/tests/net/lib/dns_sd/src/main.c
+++ b/tests/net/lib/dns_sd/src/main.c
@@ -12,6 +12,9 @@
#include <logging/log.h>
LOG_MODULE_REGISTER(test_net_dns_sd, LOG_LEVEL_DBG);
+#include <net/net_context.h>
+#include <net/net_pkt.h>
+
#include "dns_pack.h"
#include "dns_sd.h"
@@ -50,6 +53,9 @@
uint16_t *host_offset);
extern size_t service_proto_size(const struct dns_sd_rec *ref);
extern bool rec_is_valid(const struct dns_sd_rec *ref);
+extern int setup_dst_addr(struct net_context *ctx, struct net_pkt *pkt,
+ struct sockaddr *dst, socklen_t *dst_len);
+
/** Text for advertised service */
static const uint8_t nasxxxxxx_text[] = "\x06" "path=/";
@@ -607,6 +613,76 @@
zassert_equal(true, dns_sd_rec_match(&record, &filter_ok), "");
}
+/** Test @ref setup_dst_addr */
+static void test_setup_dst_addr(void)
+{
+ int ret;
+ struct net_if *iface;
+ struct sockaddr dst;
+ socklen_t dst_len;
+
+ iface = net_if_get_first_by_type(&NET_L2_GET_NAME(DUMMY));
+ zassert_not_null(iface, "Interface not available");
+
+ /* IPv4 case */
+ struct net_context *ctx_v4;
+ struct net_pkt *pkt_v4;
+ struct in_addr addr_v4_expect = { { { 224, 0, 0, 251 } } };
+
+ memset(&dst, 0, sizeof(struct sockaddr));
+
+ ret = net_context_get(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &ctx_v4);
+ zassert_equal(ret, 0, "Create IPv4 UDP context failed");
+
+ pkt_v4 = net_pkt_alloc_with_buffer(iface, 0, AF_INET,
+ IPPROTO_UDP, K_SECONDS(1));
+ zassert_not_null(pkt_v4, "Packet alloc failed");
+
+ zassert_equal(0, setup_dst_addr(ctx_v4, pkt_v4, &dst, &dst_len), "");
+ zassert_equal(255, ctx_v4->ipv4_ttl, "");
+ zassert_true(net_ipv4_addr_cmp(&addr_v4_expect,
+ &net_sin(&dst)->sin_addr), "");
+ zassert_equal(8, dst_len, "");
+
+#if defined(CONFIG_NET_IPV6)
+ /* IPv6 case */
+ struct net_context *ctx_v6;
+ struct net_pkt *pkt_v6;
+ struct in6_addr addr_v6_expect = { { { 0xff, 0x02, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0xfb } } };
+
+ memset(&dst, 0, sizeof(struct sockaddr));
+
+ ret = net_context_get(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, &ctx_v6);
+ zassert_equal(ret, 0, "Create IPv6 UDP context failed");
+
+ pkt_v6 = net_pkt_alloc_with_buffer(iface, 0, AF_INET6,
+ IPPROTO_UDP, K_SECONDS(1));
+ zassert_not_null(pkt_v6, "Packet alloc failed");
+
+ zassert_equal(0, setup_dst_addr(ctx_v6, pkt_v6, &dst, &dst_len), "");
+ zassert_equal(255, ctx_v6->ipv6_hop_limit, "");
+ zassert_true(net_ipv6_addr_cmp(&addr_v6_expect,
+ &net_sin6(&dst)->sin6_addr), "");
+ zassert_equal(24, dst_len, "");
+#endif
+
+ /* Unknown family case */
+
+ struct net_context *ctx_xx;
+ struct net_pkt *pkt_xx;
+
+ ret = net_context_get(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &ctx_xx);
+ zassert_equal(ret, 0, "Create IPV4 udp context failed");
+
+ pkt_xx = net_pkt_alloc_with_buffer(iface, 0, AF_PACKET,
+ IPPROTO_UDP, K_SECONDS(1));
+ zassert_not_null(pkt_xx, "Packet alloc failed");
+
+ zassert_equal(-EPFNOSUPPORT,
+ setup_dst_addr(ctx_xx, pkt_xx, &dst, &dst_len), "");
+}
+
void test_main(void)
{
ztest_test_suite(dns_sd_tests,
@@ -619,7 +695,8 @@
ztest_unit_test(test_add_a_record),
ztest_unit_test(test_add_aaaa_record),
ztest_unit_test(test_dns_sd_handle_ptr_query),
- ztest_unit_test(test_dns_sd_rec_match));
+ ztest_unit_test(test_dns_sd_rec_match),
+ ztest_unit_test(test_setup_dst_addr));
ztest_run_test_suite(dns_sd_tests);
}