Lines Matching +full:ipv4 +full:- +full:single +full:- +full:target
1 /* coap_address.c -- representation of network addresses
3 * Copyright (C) 2015-2016,2019-2023 Olaf Bergmann <bergmann@tzi.org>
5 * SPDX-License-Identifier: BSD-2-Clause
46 switch (addr->addr.sa.sa_family) { in coap_address_get_port()
49 return ntohs(addr->addr.sin.sin_port); in coap_address_get_port()
53 return ntohs(addr->addr.sin6.sin6_port); in coap_address_get_port()
64 switch (addr->addr.sa.sa_family) { in coap_address_set_port()
67 addr->addr.sin.sin_port = htons(port); in coap_address_set_port()
72 addr->addr.sin6.sin6_port = htons(port); in coap_address_set_port()
85 if (a->size != b->size || a->addr.sa.sa_family != b->addr.sa.sa_family) in coap_address_equals()
89 switch (a->addr.sa.sa_family) { in coap_address_equals()
92 return a->addr.sin.sin_port == b->addr.sin.sin_port && in coap_address_equals()
93 memcmp(&a->addr.sin.sin_addr, &b->addr.sin.sin_addr, in coap_address_equals()
98 return a->addr.sin6.sin6_port == b->addr.sin6.sin6_port && in coap_address_equals()
99 memcmp(&a->addr.sin6.sin6_addr, &b->addr.sin6.sin6_addr, in coap_address_equals()
111 return a->addr.sa.sa_family == AF_UNIX; in coap_is_af_unix()
127 switch (a->addr.sa.sa_family) { in coap_is_mcast()
130 return IN_MULTICAST(ntohl(a->addr.sin.sin_addr.s_addr)); in coap_is_mcast()
135 return IN6_IS_ADDR_MULTICAST(&a->addr.sin6.sin6_addr) || in coap_is_mcast()
136 (IN6_IS_ADDR_V4MAPPED(&a->addr.sin6.sin6_addr) && in coap_is_mcast()
137 IN_MULTICAST(ntohl(a->addr.sin6.sin6_addr.s6_addr[12]))); in coap_is_mcast()
139 return a->addr.sin6.sin6_addr.s6_addr[0] == 0xff; in coap_is_mcast()
152 /* How frequently to refresh the list of valid IPv4 broadcast addresses */
161 switch(a->addr.sa.sa_family) { in coap_is_bcast()
163 if (a->addr.sin.sin_addr.s_addr == 0xFFFFFFFF) in coap_is_bcast()
174 static int bcst_cnt = -1;
182 struct in_addr ipv4; in coap_is_bcast() local
192 switch (a->addr.sa.sa_family) { in coap_is_bcast()
195 ipv4.s_addr = a->addr.sin.sin_addr.s_addr; in coap_is_bcast()
201 if (IN6_IS_ADDR_V4MAPPED(&a->addr.sin6.sin6_addr)) { in coap_is_bcast()
202 memcpy(&ipv4, &a->addr.sin6.sin6_addr.s6_addr[12], sizeof(ipv4)); in coap_is_bcast()
216 if (ipv4.s_addr == INADDR_BROADCAST) in coap_is_bcast()
221 if (bcst_cnt == -1 || in coap_is_bcast()
222 (now - last_refresh) > (COAP_BCST_REFRESH_SECS * COAP_TICKS_PER_SECOND)) { in coap_is_bcast()
235 if (ife->ifa_addr && ife->ifa_addr->sa_family == AF_INET && in coap_is_bcast()
236 ife->ifa_flags & IFF_BROADCAST) { in coap_is_bcast()
237 b_ipv4[bcst_cnt].s_addr = ((struct sockaddr_in *)ife->ifa_broadaddr)->sin_addr.s_addr; in coap_is_bcast()
240 ife = ife->ifa_next; in coap_is_bcast()
248 if (ipv4.s_addr == b_ipv4[i].s_addr) in coap_is_bcast()
264 addr->size = sizeof(addr->addr); in coap_address_init()
273 (void)ipaddr_ntoa_r(&(addr->addr), dst, len); in coap_address_ntop()
277 if (addr->addr.sa.sa_family == AF_INET) { in coap_address_ntop()
278 const void *addrptr = &addr->addr.sin.sin_addr; in coap_address_ntop()
279 (void)inet_ntop(addr->addr.sa.sa_family, addrptr, dst, len); in coap_address_ntop()
280 } else if (addr->addr.sa.sa_family == AF_INET6) { in coap_address_ntop()
281 const void *addrptr = &addr->addr.sin6.sin6_addr; in coap_address_ntop()
282 (void)inet_ntop(addr->addr.sa.sa_family, addrptr, dst, len); in coap_address_ntop()
297 addr->addr.cun.sun_family = AF_UNIX; in coap_address_set_unix_domain()
299 if ((host_len - i) >= 3 && host[i] == '%' && host[i+1] == '2' && in coap_address_set_unix_domain()
301 addr->addr.cun.sun_path[ofs++] = '/'; in coap_address_set_unix_domain()
304 addr->addr.cun.sun_path[ofs++] = host[i]; in coap_address_set_unix_domain()
310 addr->addr.cun.sun_path[ofs] = '\000'; in coap_address_set_unix_domain()
312 addr->addr.cun.sun_path[ofs-1] = '\000'; in coap_address_set_unix_domain()
326 /* Client target port must be set if default of 0 */ in update_port()
383 /* For AF_UNIX, can only listen on a single endpoint */ in coap_get_available_scheme_hint_bits()
435 if (address->length >= COAP_UNIX_PATH_MAX) { in coap_resolve_address_info()
494 info->next = NULL; in coap_resolve_address_info()
495 info->proto = proto; in coap_resolve_address_info()
496 info->scheme = scheme; in coap_resolve_address_info()
498 coap_address_init(&info->addr); in coap_resolve_address_info()
499 if (!coap_address_set_unix_domain(&info->addr, address->s, in coap_resolve_address_info()
500 address->length)) { in coap_resolve_address_info()
509 if (address && address->length) in coap_resolve_address_info()
510 memcpy(addrstr, address->s, address->length); in coap_resolve_address_info()
526 for (ainfo = res; ainfo != NULL; ainfo = ainfo->ai_next) { in coap_resolve_address_info()
528 if (ainfo->ai_addrlen > (socklen_t)sizeof(info->addr.addr)) in coap_resolve_address_info()
532 switch (ainfo->ai_family) { in coap_resolve_address_info()
588 /* malloc failure - return what we have so far */ in coap_resolve_address_info()
592 info->next = NULL; in coap_resolve_address_info()
593 info->scheme = scheme; in coap_resolve_address_info()
594 info->proto = proto; in coap_resolve_address_info()
595 coap_address_init(&info->addr); in coap_resolve_address_info()
597 info->addr.size = (socklen_t)ainfo->ai_addrlen; in coap_resolve_address_info()
598 memcpy(&info->addr.addr, ainfo->ai_addr, ainfo->ai_addrlen); in coap_resolve_address_info()
600 memset(&info->addr, 0, sizeof(info->addr)); in coap_resolve_address_info()
601 switch (ainfo->ai_family) { in coap_resolve_address_info()
608 sock4 = (struct sockaddr_in *)ainfo->ai_addr; in coap_resolve_address_info()
609 info->addr.port = ntohs(sock4->sin_port); in coap_resolve_address_info()
610 memcpy(&info->addr.addr, &sock4->sin_addr, 4); in coap_resolve_address_info()
612 info->addr.addr.type = IPADDR_TYPE_V4; in coap_resolve_address_info()
618 sock6 = (struct sockaddr_in6 *)ainfo->ai_addr; in coap_resolve_address_info()
619 info->addr.port = ntohs(sock6->sin6_port); in coap_resolve_address_info()
620 memcpy(&info->addr.addr, &sock6->sin6_addr, 16); in coap_resolve_address_info()
622 info->addr.addr.type = IPADDR_TYPE_V6; in coap_resolve_address_info()
632 update_port(&info->addr, port, COAP_DEFAULT_PORT, in coap_resolve_address_info()
636 update_port(&info->addr, secure_port, COAPS_DEFAULT_PORT, in coap_resolve_address_info()
640 update_port(&info->addr, port, COAP_DEFAULT_PORT, in coap_resolve_address_info()
644 update_port(&info->addr, secure_port, COAPS_DEFAULT_PORT, in coap_resolve_address_info()
648 update_port(&info->addr, port, 80, in coap_resolve_address_info()
652 update_port(&info->addr, secure_port, 443, in coap_resolve_address_info()
656 update_port(&info->addr, ws_port, 80, in coap_resolve_address_info()
660 update_port(&info->addr, ws_secure_port, 443, in coap_resolve_address_info()
671 if (info_tmp->proto == info->proto && in coap_resolve_address_info()
672 info_tmp->scheme == info->scheme && in coap_resolve_address_info()
673 coap_address_equals(&info_tmp->addr, &info->addr)) { in coap_resolve_address_info()
676 info_tmp = info_tmp->next; in coap_resolve_address_info()
688 info_prev->next = info; in coap_resolve_address_info()
714 if (netutils_get_ipv6(&addr_ipv6, &netif, (const char *)address->s) >= 0) { in coap_resolve_address_info()
763 /* malloc failure - return what we have so far */ in coap_resolve_address_info()
766 info->next = NULL; in coap_resolve_address_info()
772 info_prev->next = info; in coap_resolve_address_info()
776 info->scheme = scheme; in coap_resolve_address_info()
777 info->proto = proto; in coap_resolve_address_info()
778 coap_address_init(&info->addr); in coap_resolve_address_info()
779 info->addr.size = sizeof(struct sockaddr_in6); in coap_resolve_address_info()
780 info->addr.addr.sin6.sin6_family = AF_INET6; in coap_resolve_address_info()
781 memcpy(&info->addr.addr.sin6.sin6_addr, &addr_ipv6, in coap_resolve_address_info()
782 sizeof(info->addr.addr.sin6.sin6_addr)); in coap_resolve_address_info()
783 info->addr.addr.sin6.sin6_scope_id = (uint32_t)netif_get_id(netif); in coap_resolve_address_info()
786 update_port(&info->addr, port, COAP_DEFAULT_PORT, in coap_resolve_address_info()
790 update_port(&info->addr, secure_port, COAPS_DEFAULT_PORT, in coap_resolve_address_info()
794 update_port(&info->addr, port, COAP_DEFAULT_PORT, in coap_resolve_address_info()
798 update_port(&info->addr, secure_port, COAPS_DEFAULT_PORT, in coap_resolve_address_info()
802 update_port(&info->addr, port, ws_port, in coap_resolve_address_info()
806 update_port(&info->addr, secure_port, ws_secure_port, in coap_resolve_address_info()
826 coap_addr_info_t *info_next = info->next; in coap_free_address_info()
840 dst->size = src->size; in coap_address_copy()
842 if (src->addr.sa.sa_family == AF_INET6) { in coap_address_copy()
843 dst->addr.sin6.sin6_family = src->addr.sin6.sin6_family; in coap_address_copy()
844 dst->addr.sin6.sin6_addr = src->addr.sin6.sin6_addr; in coap_address_copy()
845 dst->addr.sin6.sin6_port = src->addr.sin6.sin6_port; in coap_address_copy()
846 dst->addr.sin6.sin6_scope_id = src->addr.sin6.sin6_scope_id; in coap_address_copy()
853 if (src->addr.sa.sa_family == AF_INET) { in coap_address_copy()
854 dst->addr.sin = src->addr.sin; in coap_address_copy()
858 memcpy(&dst->addr, &src->addr, src->size); in coap_address_copy()
866 switch (a->addr.sa.sa_family) { in _coap_address_isany_impl()
869 return a->addr.sin.sin_addr.s_addr == INADDR_ANY; in _coap_address_isany_impl()
874 &a->addr.sin6.sin6_addr, in _coap_address_isany_impl()