/* * Copyright (c) 2023 Basalte bv * * SPDX-License-Identifier: Apache-2.0 */ #include LOG_MODULE_REGISTER(net_coap_service_sample, LOG_LEVEL_DBG); #include #include #ifdef CONFIG_NET_IPV6 #include "net_private.h" #include "ipv6.h" #endif #include "net_sample_common.h" static const uint16_t coap_port = 5683; #ifdef CONFIG_NET_IPV6 #define ALL_NODES_LOCAL_COAP_MCAST \ { { { 0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xfd } } } #define MY_IP6ADDR \ { { { 0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1 } } } static int join_coap_multicast_group(void) { static struct in6_addr my_addr = MY_IP6ADDR; static struct sockaddr_in6 mcast_addr = { .sin6_family = AF_INET6, .sin6_addr = ALL_NODES_LOCAL_COAP_MCAST, .sin6_port = htons(coap_port) }; struct net_if_addr *ifaddr; struct net_if *iface; int ret; iface = net_if_get_default(); if (!iface) { LOG_ERR("Could not get the default interface"); return -ENOENT; } #if defined(CONFIG_NET_CONFIG_SETTINGS) if (net_addr_pton(AF_INET6, CONFIG_NET_CONFIG_MY_IPV6_ADDR, &my_addr) < 0) { LOG_ERR("Invalid IPv6 address %s", CONFIG_NET_CONFIG_MY_IPV6_ADDR); } #endif ifaddr = net_if_ipv6_addr_add(iface, &my_addr, NET_ADDR_MANUAL, 0); if (!ifaddr) { LOG_ERR("Could not add unicast address to interface"); return -EINVAL; } ifaddr->addr_state = NET_ADDR_PREFERRED; ret = net_ipv6_mld_join(iface, &mcast_addr.sin6_addr); if (ret < 0) { LOG_ERR("Cannot join %s IPv6 multicast group (%d)", net_sprint_ipv6_addr(&mcast_addr.sin6_addr), ret); return ret; } return 0; } int main(void) { wait_for_network(); return join_coap_multicast_group(); } #else /* CONFIG_NET_IPV6 */ int main(void) { wait_for_network(); return 0; } #endif /* CONFIG_NET_IPV6 */ COAP_SERVICE_DEFINE(coap_server, NULL, &coap_port, COAP_SERVICE_AUTOSTART);