Zephyr API Documentation 4.2.0-rc3
A Scalable Open Source RTOS
 4.2.0-rc3
net_ip.h
Go to the documentation of this file.
1
6
7/*
8 * Copyright (c) 2016 Intel Corporation
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12
13#ifndef ZEPHYR_INCLUDE_NET_NET_IP_H_
14#define ZEPHYR_INCLUDE_NET_NET_IP_H_
15
24
25#include <string.h>
26#include <zephyr/types.h>
27#include <stdbool.h>
28#include <zephyr/sys/util.h>
30#include <zephyr/toolchain.h>
31
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
39/* Specifying VLAN tag here in order to avoid circular dependencies */
40#define NET_VLAN_TAG_UNSPEC 0x0fff
42
43/* Protocol families. */
44#define PF_UNSPEC 0
45#define PF_INET 1
46#define PF_INET6 2
47#define PF_PACKET 3
48#define PF_CAN 4
49#define PF_NET_MGMT 5
50#define PF_LOCAL 6
51#define PF_UNIX PF_LOCAL
52
53/* Address families. */
54#define AF_UNSPEC PF_UNSPEC
55#define AF_INET PF_INET
56#define AF_INET6 PF_INET6
57#define AF_PACKET PF_PACKET
58#define AF_CAN PF_CAN
59#define AF_NET_MGMT PF_NET_MGMT
60#define AF_LOCAL PF_LOCAL
61#define AF_UNIX PF_UNIX
62
76
86
93
100#define ntohs(x) sys_be16_to_cpu(x)
101
108#define ntohl(x) sys_be32_to_cpu(x)
109
116#define ntohll(x) sys_be64_to_cpu(x)
117
124#define htons(x) sys_cpu_to_be16(x)
125
132#define htonl(x) sys_cpu_to_be32(x)
133
140#define htonll(x) sys_cpu_to_be64(x)
141
143struct in6_addr {
144 union {
148 };
149};
150
152#define NET_IPV6_ADDR_SIZE 16
153
163
165#define NET_IPV4_ADDR_SIZE 4
166
168typedef unsigned short int sa_family_t;
169
171#ifndef __socklen_t_defined
172typedef size_t socklen_t;
173#define __socklen_t_defined
174#endif
175
176/*
177 * Note that the sin_port and sin6_port are in network byte order
178 * in various sockaddr* structs.
179 */
180
188
195
206
208
210struct sockaddr_in6_ptr {
211 sa_family_t sin6_family;
212 uint16_t sin6_port;
213 struct in6_addr *sin6_addr;
214 uint8_t sin6_scope_id;
215};
216
218struct sockaddr_in_ptr {
219 sa_family_t sin_family;
220 uint16_t sin_port;
221 struct in_addr *sin_addr;
222};
223
225struct sockaddr_ll_ptr {
226 sa_family_t sll_family;
227 uint16_t sll_protocol;
228 int sll_ifindex;
229 uint16_t sll_hatype;
230 uint8_t sll_pkttype;
231 uint8_t sll_halen;
232 uint8_t *sll_addr;
233};
234
236struct sockaddr_un_ptr {
237 sa_family_t sun_family;
238 char *sun_path;
239};
240
241struct sockaddr_can_ptr {
242 sa_family_t can_family;
243 int can_ifindex;
244};
245
247
248#if !defined(HAVE_IOVEC)
250struct iovec {
251 void *iov_base;
252 size_t iov_len;
253};
254#endif
255
266
268struct cmsghdr {
272 z_max_align_t cmsg_data[];
273};
274
276
277/* Alignment for headers and data. These are arch specific but define
278 * them here atm if not found already.
279 */
280#if !defined(ALIGN_H)
281#define ALIGN_H(x) ROUND_UP(x, __alignof__(struct cmsghdr))
282#endif
283#if !defined(ALIGN_D)
284#define ALIGN_D(x) ROUND_UP(x, __alignof__(z_max_align_t))
285#endif
286
288
289#if !defined(CMSG_FIRSTHDR)
295#define CMSG_FIRSTHDR(msghdr) \
296 ((msghdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
297 (struct cmsghdr *)((msghdr)->msg_control) : NULL)
298#endif
299
300#if !defined(CMSG_NXTHDR)
305#define CMSG_NXTHDR(msghdr, cmsg) \
306 (((cmsg) == NULL) ? CMSG_FIRSTHDR(msghdr) : \
307 (((uint8_t *)(cmsg) + ALIGN_H((cmsg)->cmsg_len) + \
308 ALIGN_D(sizeof(struct cmsghdr)) > \
309 (uint8_t *)((msghdr)->msg_control) + (msghdr)->msg_controllen) ? \
310 NULL : \
311 (struct cmsghdr *)((uint8_t *)(cmsg) + \
312 ALIGN_H((cmsg)->cmsg_len))))
313#endif
314
315#if !defined(CMSG_DATA)
323#define CMSG_DATA(cmsg) ((uint8_t *)(cmsg) + ALIGN_D(sizeof(struct cmsghdr)))
324#endif
325
326#if !defined(CMSG_SPACE)
331#define CMSG_SPACE(length) (ALIGN_D(sizeof(struct cmsghdr)) + ALIGN_H(length))
332#endif
333
334#if !defined(CMSG_LEN)
340#define CMSG_LEN(length) (ALIGN_D(sizeof(struct cmsghdr)) + length)
341#endif
342
344
345/* Packet types. */
346#define PACKET_HOST 0 /* To us */
347#define PACKET_BROADCAST 1 /* To all */
348#define PACKET_MULTICAST 2 /* To group */
349#define PACKET_OTHERHOST 3 /* To someone else */
350#define PACKET_OUTGOING 4 /* Originated by us */
351#define PACKET_LOOPBACK 5
352#define PACKET_FASTROUTE 6
353
354/* ARP protocol HARDWARE identifiers. */
355#define ARPHRD_ETHER 1
356
357/* Note: These macros are defined in a specific order.
358 * The largest sockaddr size is the last one.
359 */
360#if defined(CONFIG_NET_IPV4)
361#undef NET_SOCKADDR_MAX_SIZE
362#undef NET_SOCKADDR_PTR_MAX_SIZE
363#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in))
364#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in_ptr))
365#endif
366
367#if defined(CONFIG_NET_SOCKETS_PACKET)
368#undef NET_SOCKADDR_MAX_SIZE
369#undef NET_SOCKADDR_PTR_MAX_SIZE
370#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_ll))
371#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_ll_ptr))
372#endif
373
374#if defined(CONFIG_NET_IPV6)
375#undef NET_SOCKADDR_MAX_SIZE
376#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in6))
377#if !defined(CONFIG_NET_SOCKETS_PACKET)
378#undef NET_SOCKADDR_PTR_MAX_SIZE
379#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in6_ptr))
380#endif
381#endif
382
383#if defined(CONFIG_NET_NATIVE_OFFLOADED_SOCKETS)
384#define UNIX_PATH_MAX 108
385#undef NET_SOCKADDR_MAX_SIZE
386/* Define NET_SOCKADDR_MAX_SIZE to be struct of sa_family_t + char[UNIX_PATH_MAX] */
387#define NET_SOCKADDR_MAX_SIZE (UNIX_PATH_MAX+sizeof(sa_family_t))
388#if !defined(CONFIG_NET_SOCKETS_PACKET)
389#undef NET_SOCKADDR_PTR_MAX_SIZE
390#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_un_ptr))
391#endif
392#endif
393
394#if !defined(CONFIG_NET_IPV4)
395#if !defined(CONFIG_NET_IPV6)
396#if !defined(CONFIG_NET_SOCKETS_PACKET)
397#if !defined(CONFIG_NET_NATIVE_OFFLOADED_SOCKETS)
398#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in6))
399#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in6_ptr))
400#endif
401#endif
402#endif
403#endif
404
406
407#define SOCKADDR_ALIGN (4)
408
410struct sockaddr {
413 char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
415} __aligned(SOCKADDR_ALIGN);
416
418
419struct sockaddr_ptr {
420 sa_family_t family;
421 char data[NET_SOCKADDR_PTR_MAX_SIZE - sizeof(sa_family_t)];
422} __aligned(SOCKADDR_ALIGN);
423
424/* Same as sockaddr in our case */
425struct sockaddr_storage {
426 sa_family_t ss_family;
427 char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
428} __aligned(SOCKADDR_ALIGN);
429
430/* Socket address struct for UNIX domain sockets */
431struct sockaddr_un {
432 sa_family_t sun_family; /* AF_UNIX */
433 char sun_path[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
434};
435
436struct net_addr {
437 sa_family_t family;
438 union {
439 struct in6_addr in6_addr;
440 struct in_addr in_addr;
441 };
442};
443
445extern const struct in6_addr in6addr_any;
446
448extern const struct in6_addr in6addr_loopback;
449
451
453#define IN6ADDR_ANY_INIT { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, \
454 0, 0, 0, 0, 0, 0, 0 } } }
455
457#define IN6ADDR_LOOPBACK_INIT { { { 0, 0, 0, 0, 0, 0, 0, \
458 0, 0, 0, 0, 0, 0, 0, 0, 1 } } }
459
461#define INADDR_ANY 0
462
464#define INADDR_BROADCAST 0xffffffff
465
467#define INADDR_ANY_INIT { { { INADDR_ANY } } }
468
470#define INADDR_LOOPBACK_INIT { { { 127, 0, 0, 1 } } }
471
473#define INET_ADDRSTRLEN 16
477#define INET6_ADDRSTRLEN 46
478
480
481/* These are for internal usage of the stack */
482#define NET_IPV6_ADDR_LEN sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")
483#define NET_IPV4_ADDR_LEN sizeof("xxx.xxx.xxx.xxx")
484
486
492#if defined(CONFIG_NET_NATIVE_IPV6)
493 NET_IPV6_MTU = CONFIG_NET_IPV6_MTU,
494#else
496#endif
497
501#if defined(CONFIG_NET_NATIVE_IPV4)
502 NET_IPV4_MTU = CONFIG_NET_IPV4_MTU,
503#else
505#endif
506};
507
519
520#define NET_MAX_PRIORITIES 8
521
530
538
552
554
555struct net_ipv6_hdr {
556 uint8_t vtc;
557 uint8_t tcflow;
558 uint16_t flow;
559 uint16_t len;
560 uint8_t nexthdr;
561 uint8_t hop_limit;
564} __packed;
565
566struct net_ipv6_frag_hdr {
567 uint8_t nexthdr;
568 uint8_t reserved;
569 uint16_t offset;
570 uint32_t id;
571} __packed;
572
573struct net_ipv4_hdr {
574 uint8_t vhl;
575 uint8_t tos;
576 uint16_t len;
577 uint8_t id[2];
578 uint8_t offset[2];
579 uint8_t ttl;
580 uint8_t proto;
581 uint16_t chksum;
584} __packed;
585
586struct net_icmp_hdr {
587 uint8_t type;
588 uint8_t code;
589 uint16_t chksum;
590} __packed;
591
592struct net_udp_hdr {
593 uint16_t src_port;
594 uint16_t dst_port;
595 uint16_t len;
596 uint16_t chksum;
597} __packed;
598
599struct net_tcp_hdr {
600 uint16_t src_port;
601 uint16_t dst_port;
602 uint8_t seq[4];
603 uint8_t ack[4];
604 uint8_t offset;
606 uint8_t wnd[2];
607 uint16_t chksum;
608 uint8_t urg[2];
609 uint8_t optdata[0];
610} __packed;
611
612static inline const char *net_addr_type2str(enum net_addr_type type)
613{
614 switch (type) {
616 return "AUTO";
617 case NET_ADDR_DHCP:
618 return "DHCP";
619 case NET_ADDR_MANUAL:
620 return "MANUAL";
622 return "OVERRIDE";
623 case NET_ADDR_ANY:
624 default:
625 break;
626 }
627
628 return "<unknown>";
629}
630
631/* IPv6 extension headers types */
632#define NET_IPV6_NEXTHDR_HBHO 0
633#define NET_IPV6_NEXTHDR_DESTO 60
634#define NET_IPV6_NEXTHDR_ROUTING 43
635#define NET_IPV6_NEXTHDR_FRAG 44
636#define NET_IPV6_NEXTHDR_NONE 59
637
642union net_ip_header {
643 struct net_ipv4_hdr *ipv4;
644 struct net_ipv6_hdr *ipv6;
645};
646
647union net_proto_header {
648 struct net_udp_hdr *udp;
649 struct net_tcp_hdr *tcp;
650};
651
652#define NET_UDPH_LEN 8 /* Size of UDP header */
653#define NET_TCPH_LEN 20 /* Size of TCP header */
654#define NET_ICMPH_LEN 4 /* Size of ICMP header */
655
656#define NET_IPV6H_LEN 40 /* Size of IPv6 header */
657#define NET_ICMPV6H_LEN NET_ICMPH_LEN /* Size of ICMPv6 header */
658#define NET_IPV6UDPH_LEN (NET_UDPH_LEN + NET_IPV6H_LEN) /* IPv6 + UDP */
659#define NET_IPV6TCPH_LEN (NET_TCPH_LEN + NET_IPV6H_LEN) /* IPv6 + TCP */
660#define NET_IPV6ICMPH_LEN (NET_IPV6H_LEN + NET_ICMPH_LEN) /* ICMPv6 + IPv6 */
661#define NET_IPV6_FRAGH_LEN 8
662
663#define NET_IPV4H_LEN 20 /* Size of IPv4 header */
664#define NET_ICMPV4H_LEN NET_ICMPH_LEN /* Size of ICMPv4 header */
665#define NET_IPV4UDPH_LEN (NET_UDPH_LEN + NET_IPV4H_LEN) /* IPv4 + UDP */
666#define NET_IPV4TCPH_LEN (NET_TCPH_LEN + NET_IPV4H_LEN) /* IPv4 + TCP */
667#define NET_IPV4ICMPH_LEN (NET_IPV4H_LEN + NET_ICMPH_LEN) /* ICMPv4 + IPv4 */
668
669#define NET_IPV6H_LENGTH_OFFSET 0x04 /* Offset of the Length field in the IPv6 header */
670
671#define NET_IPV6_FRAGH_OFFSET_MASK 0xfff8 /* Mask for the 13-bit Fragment Offset field */
672#define NET_IPV4_FRAGH_OFFSET_MASK 0x1fff /* Mask for the 13-bit Fragment Offset field */
673#define NET_IPV4_MORE_FRAG_MASK 0x2000 /* Mask for the 1-bit More Fragments field */
674#define NET_IPV4_DO_NOT_FRAG_MASK 0x4000 /* Mask for the 1-bit Do Not Fragment field */
675
677
679static inline bool net_ipv6_is_addr_loopback_raw(const uint8_t *addr)
680{
681 return UNALIGNED_GET((uint32_t *)addr) == 0 &&
682 UNALIGNED_GET((uint32_t *)addr + 1) == 0 &&
683 UNALIGNED_GET((uint32_t *)addr + 2) == 0 &&
684 ntohl(UNALIGNED_GET((uint32_t *)addr + 3)) == 1;
685}
687
695static inline bool net_ipv6_is_addr_loopback(struct in6_addr *addr)
696{
697 return net_ipv6_is_addr_loopback_raw(addr->s6_addr);
698}
699
701static inline bool net_ipv6_is_addr_mcast_raw(const uint8_t *addr)
702{
703 return addr[0] == 0xff;
704}
706
714static inline bool net_ipv6_is_addr_mcast(const struct in6_addr *addr)
715{
716 return net_ipv6_is_addr_mcast_raw(addr->s6_addr);
717}
718
719struct net_if;
720struct net_if_config;
721
723extern struct net_if_addr *net_if_ipv6_addr_lookup_raw(const uint8_t *addr,
724 struct net_if **ret);
725
726static inline bool net_ipv6_is_my_addr_raw(const uint8_t *addr)
727{
728 return net_if_ipv6_addr_lookup_raw(addr, NULL) != NULL;
729}
731
732extern struct net_if_addr *net_if_ipv6_addr_lookup(const struct in6_addr *addr,
733 struct net_if **iface);
734
742static inline bool net_ipv6_is_my_addr(struct in6_addr *addr)
743{
744 return net_if_ipv6_addr_lookup(addr, NULL) != NULL;
745}
746
748 const struct in6_addr *addr, struct net_if **iface);
749
758static inline bool net_ipv6_is_my_maddr(struct in6_addr *maddr)
759{
760 return net_if_ipv6_maddr_lookup(maddr, NULL) != NULL;
761}
762
772static inline bool net_ipv6_is_prefix(const uint8_t *addr1,
773 const uint8_t *addr2,
774 uint8_t length)
775{
776 uint8_t bits = 128 - length;
777 uint8_t bytes = length / 8U;
778 uint8_t remain = bits % 8;
779 uint8_t mask;
780
781 if (length > 128) {
782 return false;
783 }
784
785 if (memcmp(addr1, addr2, bytes)) {
786 return false;
787 }
788
789 if (!remain) {
790 /* No remaining bits, the prefixes are the same as first
791 * bytes are the same.
792 */
793 return true;
794 }
795
796 /* Create a mask that has remaining most significant bits set */
797 mask = (uint8_t)((0xff << (8 - remain)) ^ 0xff) << remain;
798
799 return (addr1[bytes] & mask) == (addr2[bytes] & mask);
800}
801
802
810static inline void net_ipv6_addr_prefix_mask(const uint8_t *inaddr,
811 uint8_t *outaddr,
812 uint8_t prefix_len)
813{
814 uint8_t bits = 128 - prefix_len;
815 uint8_t bytes = prefix_len / 8U;
816 uint8_t remain = bits % 8;
817 uint8_t mask;
818
819 memset(outaddr, 0, 16U);
820 memcpy(outaddr, inaddr, bytes);
821
822 if (!remain) {
823 /* No remaining bits, the prefixes are the same as first
824 * bytes are the same.
825 */
826 return;
827 }
828
829 /* Create a mask that has remaining most significant bits set */
830 mask = (uint8_t)((0xff << (8 - remain)) ^ 0xff) << remain;
831 outaddr[bytes] = inaddr[bytes] & mask;
832}
833
835static inline bool net_ipv4_is_addr_loopback_raw(const uint8_t *addr)
836{
837 return addr[0] == 127U;
838}
840
848static inline bool net_ipv4_is_addr_loopback(struct in_addr *addr)
849{
850 return net_ipv4_is_addr_loopback_raw(addr->s4_addr);
851}
852
854static inline bool net_ipv4_is_addr_unspecified_raw(const uint8_t *addr)
855{
856 return UNALIGNED_GET((uint32_t *)addr) == 0;
857}
859
867static inline bool net_ipv4_is_addr_unspecified(const struct in_addr *addr)
868{
869 return net_ipv4_is_addr_unspecified_raw(addr->s4_addr);
870}
871
873static inline bool net_ipv4_is_addr_mcast_raw(const uint8_t *addr)
874{
875 return (ntohl(UNALIGNED_GET((uint32_t *)addr)) & 0xF0000000) == 0xE0000000;
876}
878
886static inline bool net_ipv4_is_addr_mcast(const struct in_addr *addr)
887{
888 return net_ipv4_is_addr_mcast_raw(addr->s4_addr);
889}
890
892static inline bool net_ipv4_is_ll_addr_raw(const uint8_t *addr)
893{
894 return (ntohl(UNALIGNED_GET((uint32_t *)addr)) & 0xFFFF0000) == 0xA9FE0000;
895}
897
905static inline bool net_ipv4_is_ll_addr(const struct in_addr *addr)
906{
907 return net_ipv4_is_ll_addr_raw(addr->s4_addr);
908}
909
919static inline bool net_ipv4_is_private_addr(const struct in_addr *addr)
920{
921 uint32_t masked_24, masked_16, masked_12, masked_10, masked_8;
922
923 masked_24 = ntohl(UNALIGNED_GET(&addr->s_addr)) & 0xFFFFFF00;
924 masked_16 = masked_24 & 0xFFFF0000;
925 masked_12 = masked_24 & 0xFFF00000;
926 masked_10 = masked_24 & 0xFFC00000;
927 masked_8 = masked_24 & 0xFF000000;
928
929 return masked_8 == 0x0A000000 || /* 10.0.0.0/8 */
930 masked_10 == 0x64400000 || /* 100.64.0.0/10 */
931 masked_12 == 0xAC100000 || /* 172.16.0.0/12 */
932 masked_16 == 0xC0A80000 || /* 192.168.0.0/16 */
933 masked_24 == 0xC0000200 || /* 192.0.2.0/24 */
934 masked_24 == 0xC0336400 || /* 192.51.100.0/24 */
935 masked_24 == 0xCB007100; /* 203.0.113.0/24 */
936}
937
946#define net_ipaddr_copy(dest, src) \
947 UNALIGNED_PUT(UNALIGNED_GET(src), dest)
948
955static inline void net_ipv4_addr_copy_raw(uint8_t *dest,
956 const uint8_t *src)
957{
958 net_ipaddr_copy((struct in_addr *)dest, (const struct in_addr *)src);
959}
960
967static inline void net_ipv6_addr_copy_raw(uint8_t *dest,
968 const uint8_t *src)
969{
970 memcpy(dest, src, sizeof(struct in6_addr));
971}
972
981static inline bool net_ipv4_addr_cmp_raw(const uint8_t *addr1,
982 const uint8_t *addr2)
983{
984 return UNALIGNED_GET((uint32_t *)addr1) == UNALIGNED_GET((uint32_t *)addr2);
985}
986
995static inline bool net_ipv4_addr_cmp(const struct in_addr *addr1,
996 const struct in_addr *addr2)
997{
998 return net_ipv4_addr_cmp_raw(addr1->s4_addr, addr2->s4_addr);
999}
1000
1009static inline bool net_ipv6_addr_cmp(const struct in6_addr *addr1,
1010 const struct in6_addr *addr2)
1011{
1012 return !memcmp(addr1, addr2, sizeof(struct in6_addr));
1013}
1014
1023static inline bool net_ipv6_addr_cmp_raw(const uint8_t *addr1,
1024 const uint8_t *addr2)
1025{
1026 return net_ipv6_addr_cmp((const struct in6_addr *)addr1,
1027 (const struct in6_addr *)addr2);
1028}
1029
1031static inline bool net_ipv6_is_ll_addr_raw(const uint8_t *addr)
1032{
1033 return UNALIGNED_GET((uint16_t *)addr) == htons(0xFE80);
1034}
1036
1044static inline bool net_ipv6_is_ll_addr(const struct in6_addr *addr)
1045{
1046 return net_ipv6_is_ll_addr_raw(addr->s6_addr);
1047}
1048
1056static inline bool net_ipv6_is_sl_addr(const struct in6_addr *addr)
1057{
1058 return UNALIGNED_GET(&addr->s6_addr16[0]) == htons(0xFEC0);
1059}
1060
1061
1069static inline bool net_ipv6_is_ula_addr(const struct in6_addr *addr)
1070{
1071 return addr->s6_addr[0] == 0xFD;
1072}
1073
1081static inline bool net_ipv6_is_global_addr(const struct in6_addr *addr)
1082{
1083 return (addr->s6_addr[0] & 0xE0) == 0x20;
1084}
1085
1095static inline bool net_ipv6_is_private_addr(const struct in6_addr *addr)
1096{
1097 uint32_t masked_32, masked_7;
1098
1099 masked_32 = ntohl(UNALIGNED_GET(&addr->s6_addr32[0]));
1100 masked_7 = masked_32 & 0xfc000000;
1101
1102 return masked_32 == 0x20010db8 || /* 2001:db8::/32 */
1103 masked_7 == 0xfc000000; /* fc00::/7 */
1104}
1105
1112
1119
1126
1127struct net_if;
1128extern bool net_if_ipv4_addr_mask_cmp(struct net_if *iface,
1129 const struct in_addr *addr);
1130
1140static inline bool net_ipv4_addr_mask_cmp(struct net_if *iface,
1141 const struct in_addr *addr)
1142{
1143 return net_if_ipv4_addr_mask_cmp(iface, addr);
1144}
1145
1147extern bool net_if_ipv4_is_addr_bcast_raw(struct net_if *iface,
1148 const uint8_t *addr);
1149
1150#if defined(CONFIG_NET_NATIVE_IPV4)
1151static inline bool net_ipv4_is_addr_bcast_raw(struct net_if *iface,
1152 const uint8_t *addr)
1153{
1154 if (net_ipv4_addr_cmp_raw(addr, net_ipv4_broadcast_address()->s4_addr)) {
1155 return true;
1156 }
1157
1158 return net_if_ipv4_is_addr_bcast_raw(iface, addr);
1159}
1160#else
1161static inline bool net_ipv4_is_addr_bcast_raw(struct net_if *iface,
1162 const uint8_t *addr)
1163{
1164 ARG_UNUSED(iface);
1165 ARG_UNUSED(addr);
1166
1167 return false;
1168}
1169#endif
1171
1172extern bool net_if_ipv4_is_addr_bcast(struct net_if *iface,
1173 const struct in_addr *addr);
1174
1183#if defined(CONFIG_NET_NATIVE_IPV4)
1184static inline bool net_ipv4_is_addr_bcast(struct net_if *iface,
1185 const struct in_addr *addr)
1186{
1188 return true;
1189 }
1190
1191 return net_if_ipv4_is_addr_bcast(iface, addr);
1192}
1193#else
1194static inline bool net_ipv4_is_addr_bcast(struct net_if *iface,
1195 const struct in_addr *addr)
1196{
1197 ARG_UNUSED(iface);
1198 ARG_UNUSED(addr);
1199
1200 return false;
1201}
1202#endif
1203
1205extern struct net_if_addr *net_if_ipv4_addr_lookup_raw(const uint8_t *addr,
1206 struct net_if **ret);
1207
1208static inline bool net_ipv4_is_my_addr_raw(const uint8_t *addr)
1209{
1210 bool ret;
1211
1212 ret = net_if_ipv4_addr_lookup_raw(addr, NULL) != NULL;
1213 if (!ret) {
1214 ret = net_ipv4_is_addr_bcast_raw(NULL, addr);
1215 }
1216
1217 return ret;
1218}
1220
1221extern struct net_if_addr *net_if_ipv4_addr_lookup(const struct in_addr *addr,
1222 struct net_if **iface);
1223
1233static inline bool net_ipv4_is_my_addr(const struct in_addr *addr)
1234{
1235 bool ret;
1236
1237 ret = net_if_ipv4_addr_lookup(addr, NULL) != NULL;
1238 if (!ret) {
1239 ret = net_ipv4_is_addr_bcast(NULL, addr);
1240 }
1241
1242 return ret;
1243}
1244
1246static inline bool net_ipv6_is_addr_unspecified_raw(const uint8_t *addr)
1247{
1248 return UNALIGNED_GET((uint32_t *)addr) == 0 &&
1249 UNALIGNED_GET((uint32_t *)addr + 1) == 0 &&
1250 UNALIGNED_GET((uint32_t *)addr + 2) == 0 &&
1251 UNALIGNED_GET((uint32_t *)addr + 3) == 0;
1252}
1254
1262static inline bool net_ipv6_is_addr_unspecified(const struct in6_addr *addr)
1263{
1264 return net_ipv6_is_addr_unspecified_raw(addr->s6_addr);
1265}
1266
1268static inline bool net_ipv6_is_addr_solicited_node_raw(const uint8_t *addr)
1269{
1270 return UNALIGNED_GET((uint32_t *)addr) == htonl(0xff020000) &&
1271 UNALIGNED_GET((uint32_t *)addr + 1) == 0x00000000 &&
1272 UNALIGNED_GET((uint32_t *)addr + 2) == htonl(0x00000001) &&
1273 ((UNALIGNED_GET((uint32_t *)addr + 3) & htonl(0xff000000)) ==
1274 htonl(0xff000000));
1275}
1277
1286static inline bool net_ipv6_is_addr_solicited_node(const struct in6_addr *addr)
1287{
1288 return net_ipv6_is_addr_solicited_node_raw(addr->s6_addr);
1289}
1290
1292static inline bool net_ipv6_is_addr_mcast_scope_raw(const uint8_t *addr,
1293 int scope)
1294{
1295 return (addr[0] == 0xff) && ((addr[1] & 0xF) == scope);
1296}
1298
1309static inline bool net_ipv6_is_addr_mcast_scope(const struct in6_addr *addr,
1310 int scope)
1311{
1312 return net_ipv6_is_addr_mcast_scope_raw(addr->s6_addr, scope);
1313}
1314
1324static inline bool net_ipv6_is_same_mcast_scope(const struct in6_addr *addr_1,
1325 const struct in6_addr *addr_2)
1326{
1327 return (addr_1->s6_addr[0] == 0xff) && (addr_2->s6_addr[0] == 0xff) &&
1328 (addr_1->s6_addr[1] == addr_2->s6_addr[1]);
1329}
1330
1332static inline bool net_ipv6_is_addr_mcast_iface_raw(const uint8_t *addr)
1333{
1334 return net_ipv6_is_addr_mcast_scope_raw(addr, 0x01);
1335}
1336
1337static inline bool net_ipv6_is_addr_mcast_link_raw(const uint8_t *addr)
1338{
1339 return net_ipv6_is_addr_mcast_scope_raw(addr, 0x02);
1340}
1341
1342static inline bool net_ipv6_is_addr_mcast_mesh_raw(const uint8_t *addr)
1343{
1344 return net_ipv6_is_addr_mcast_scope_raw(addr, 0x03);
1345}
1346
1347static inline bool net_ipv6_is_addr_mcast_site_raw(const uint8_t *addr)
1348{
1349 return net_ipv6_is_addr_mcast_scope_raw(addr, 0x05);
1350}
1351
1352static inline bool net_ipv6_is_addr_mcast_org_raw(const uint8_t *addr)
1353{
1354 return net_ipv6_is_addr_mcast_scope_raw(addr, 0x08);
1355}
1357
1365static inline bool net_ipv6_is_addr_mcast_global(const struct in6_addr *addr)
1366{
1367 return net_ipv6_is_addr_mcast_scope(addr, 0x0e);
1368}
1369
1379static inline bool net_ipv6_is_addr_mcast_iface(const struct in6_addr *addr)
1380{
1381 return net_ipv6_is_addr_mcast_scope(addr, 0x01);
1382}
1383
1393static inline bool net_ipv6_is_addr_mcast_link(const struct in6_addr *addr)
1394{
1395 return net_ipv6_is_addr_mcast_scope(addr, 0x02);
1396}
1397
1407static inline bool net_ipv6_is_addr_mcast_mesh(const struct in6_addr *addr)
1408{
1409 return net_ipv6_is_addr_mcast_scope(addr, 0x03);
1410}
1411
1421static inline bool net_ipv6_is_addr_mcast_site(const struct in6_addr *addr)
1422{
1423 return net_ipv6_is_addr_mcast_scope(addr, 0x05);
1424}
1425
1435static inline bool net_ipv6_is_addr_mcast_org(const struct in6_addr *addr)
1436{
1437 return net_ipv6_is_addr_mcast_scope(addr, 0x08);
1438}
1439
1441static inline bool net_ipv6_is_addr_mcast_group_raw(const uint8_t *addr,
1442 const uint8_t *group)
1443{
1444 return UNALIGNED_GET((uint16_t *)addr + 1) == UNALIGNED_GET((uint16_t *)group + 1) &&
1445 UNALIGNED_GET((uint32_t *)addr + 1) == UNALIGNED_GET((uint32_t *)group + 1) &&
1446 UNALIGNED_GET((uint32_t *)addr + 2) == UNALIGNED_GET((uint32_t *)group + 2) &&
1447 UNALIGNED_GET((uint32_t *)addr + 3) == UNALIGNED_GET((uint32_t *)group + 3);
1448}
1450
1461static inline bool net_ipv6_is_addr_mcast_group(const struct in6_addr *addr,
1462 const struct in6_addr *group)
1463{
1464 return net_ipv6_is_addr_mcast_group_raw(addr->s6_addr, group->s6_addr);
1465}
1466
1468static inline bool net_ipv6_is_addr_mcast_all_nodes_group_raw(const uint8_t *addr)
1469{
1470 static const uint8_t all_nodes_mcast_group[NET_IPV6_ADDR_SIZE] = {
1471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1472 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1473 };
1474
1475 return net_ipv6_is_addr_mcast_group_raw(addr, all_nodes_mcast_group);
1476}
1478
1487static inline bool
1489{
1490 return net_ipv6_is_addr_mcast_all_nodes_group_raw(addr->s6_addr);
1491}
1492
1502static inline bool
1508
1510static inline bool net_ipv6_is_addr_mcast_link_all_nodes_raw(const uint8_t *addr)
1511{
1512 return net_ipv6_is_addr_mcast_link_raw(addr) &&
1513 net_ipv6_is_addr_mcast_all_nodes_group_raw(addr);
1514}
1516
1526static inline bool
1532
1540static inline
1542 struct in6_addr *dst)
1543{
1544 dst->s6_addr[0] = 0xFF;
1545 dst->s6_addr[1] = 0x02;
1546 UNALIGNED_PUT(0, &dst->s6_addr16[1]);
1547 UNALIGNED_PUT(0, &dst->s6_addr16[2]);
1548 UNALIGNED_PUT(0, &dst->s6_addr16[3]);
1549 UNALIGNED_PUT(0, &dst->s6_addr16[4]);
1550 dst->s6_addr[10] = 0U;
1551 dst->s6_addr[11] = 0x01;
1552 dst->s6_addr[12] = 0xFF;
1553 dst->s6_addr[13] = src->s6_addr[13];
1554 UNALIGNED_PUT(UNALIGNED_GET(&src->s6_addr16[7]), &dst->s6_addr16[7]);
1555}
1556
1569static inline void net_ipv6_addr_create(struct in6_addr *addr,
1570 uint16_t addr0, uint16_t addr1,
1571 uint16_t addr2, uint16_t addr3,
1572 uint16_t addr4, uint16_t addr5,
1573 uint16_t addr6, uint16_t addr7)
1574{
1575 UNALIGNED_PUT(htons(addr0), &addr->s6_addr16[0]);
1576 UNALIGNED_PUT(htons(addr1), &addr->s6_addr16[1]);
1577 UNALIGNED_PUT(htons(addr2), &addr->s6_addr16[2]);
1578 UNALIGNED_PUT(htons(addr3), &addr->s6_addr16[3]);
1579 UNALIGNED_PUT(htons(addr4), &addr->s6_addr16[4]);
1580 UNALIGNED_PUT(htons(addr5), &addr->s6_addr16[5]);
1581 UNALIGNED_PUT(htons(addr6), &addr->s6_addr16[6]);
1582 UNALIGNED_PUT(htons(addr7), &addr->s6_addr16[7]);
1583}
1584
1590static inline void net_ipv6_addr_create_ll_allnodes_mcast(struct in6_addr *addr)
1591{
1592 net_ipv6_addr_create(addr, 0xff02, 0, 0, 0, 0, 0, 0, 0x0001);
1593}
1594
1601{
1602 net_ipv6_addr_create(addr, 0xff02, 0, 0, 0, 0, 0, 0, 0x0002);
1603}
1604
1611static inline void net_ipv6_addr_create_v4_mapped(const struct in_addr *addr4,
1612 struct in6_addr *addr6)
1613{
1614 net_ipv6_addr_create(addr6, 0, 0, 0, 0, 0, 0xffff,
1615 ntohs(addr4->s4_addr16[0]),
1616 ntohs(addr4->s4_addr16[1]));
1617}
1618
1627static inline bool net_ipv6_addr_is_v4_mapped(const struct in6_addr *addr)
1628{
1629 if (UNALIGNED_GET(&addr->s6_addr32[0]) == 0 &&
1630 UNALIGNED_GET(&addr->s6_addr32[1]) == 0 &&
1631 UNALIGNED_GET(&addr->s6_addr16[5]) == 0xffff) {
1632 return true;
1633 }
1634
1635 return false;
1636}
1637
1657 const struct in6_addr *prefix,
1658 uint8_t *network_id, size_t network_id_len,
1659 uint8_t dad_counter,
1660 struct in6_addr *addr,
1661 struct net_linkaddr *lladdr);
1662
1669static inline void net_ipv6_addr_create_iid(struct in6_addr *addr,
1670 struct net_linkaddr *lladdr)
1671{
1672 (void)net_ipv6_addr_generate_iid(NULL, NULL, NULL, 0, 0, addr, lladdr);
1673}
1674
1676static inline bool net_ipv6_addr_based_on_ll_raw(const uint8_t *addr,
1677 const struct net_linkaddr *lladdr)
1678{
1679 if (addr == NULL || lladdr == NULL) {
1680 return false;
1681 }
1682
1683 switch (lladdr->len) {
1684 case 2:
1685 if (!memcmp(&addr[14], lladdr->addr, lladdr->len) &&
1686 addr[8] == 0U &&
1687 addr[9] == 0U &&
1688 addr[10] == 0U &&
1689 addr[11] == 0xff &&
1690 addr[12] == 0xfe) {
1691 return true;
1692 }
1693
1694 break;
1695 case 6:
1696 if (lladdr->type == NET_LINK_ETHERNET) {
1697 if (!memcmp(&addr[9], &lladdr->addr[1], 2) &&
1698 !memcmp(&addr[13], &lladdr->addr[3], 3) &&
1699 addr[11] == 0xff &&
1700 addr[12] == 0xfe &&
1701 (addr[8] ^ 0x02) == lladdr->addr[0]) {
1702 return true;
1703 }
1704 }
1705
1706 break;
1707 case 8:
1708 if (sizeof(lladdr->addr) < 8) {
1709 return false;
1710 }
1711
1712 if (!memcmp(&addr[9], &lladdr->addr[1],
1713 lladdr->len - 1) &&
1714 (addr[8] ^ 0x02) == lladdr->addr[0]) {
1715 return true;
1716 }
1717
1718 break;
1719 default:
1720 return false;
1721 }
1722
1723 return false;
1724}
1726
1732static inline bool net_ipv6_addr_based_on_ll(const struct in6_addr *addr,
1733 const struct net_linkaddr *lladdr)
1734{
1735 if (addr == NULL || lladdr == NULL) {
1736 return false;
1737 }
1738
1739 return net_ipv6_addr_based_on_ll_raw(addr->s6_addr, lladdr);
1740}
1741
1750static inline struct sockaddr *net_sad(const struct sockaddr_storage *addr)
1751{
1752 return (struct sockaddr *)addr;
1753}
1754
1763static inline struct sockaddr_in6 *net_sin6(const struct sockaddr *addr)
1764{
1765 return (struct sockaddr_in6 *)addr;
1766}
1767
1776static inline struct sockaddr_in *net_sin(const struct sockaddr *addr)
1777{
1778 return (struct sockaddr_in *)addr;
1779}
1780
1789static inline
1790struct sockaddr_in6_ptr *net_sin6_ptr(const struct sockaddr_ptr *addr)
1791{
1792 return (struct sockaddr_in6_ptr *)addr;
1793}
1794
1803static inline
1804struct sockaddr_in_ptr *net_sin_ptr(const struct sockaddr_ptr *addr)
1805{
1806 return (struct sockaddr_in_ptr *)addr;
1807}
1808
1817static inline
1818struct sockaddr_ll_ptr *net_sll_ptr(const struct sockaddr_ptr *addr)
1819{
1820 return (struct sockaddr_ll_ptr *)addr;
1821}
1822
1831static inline
1832struct sockaddr_can_ptr *net_can_ptr(const struct sockaddr_ptr *addr)
1833{
1834 return (struct sockaddr_can_ptr *)addr;
1835}
1836
1850__syscall int net_addr_pton(sa_family_t family, const char *src, void *dst);
1851
1863__syscall char *net_addr_ntop(sa_family_t family, const void *src,
1864 char *dst, size_t size);
1865
1877 struct sockaddr *mask);
1878
1890 uint8_t *mask_len);
1891
1913bool net_ipaddr_parse(const char *str, size_t str_len,
1914 struct sockaddr *addr);
1915
1943const char *net_ipaddr_parse_mask(const char *str, size_t str_len,
1944 struct sockaddr *addr, uint8_t *mask_len);
1945
1955int net_port_set_default(struct sockaddr *addr, uint16_t default_port);
1956
1968static inline int32_t net_tcp_seq_cmp(uint32_t seq1, uint32_t seq2)
1969{
1970 return (int32_t)(seq1 - seq2);
1971}
1972
1983static inline bool net_tcp_seq_greater(uint32_t seq1, uint32_t seq2)
1984{
1985 return net_tcp_seq_cmp(seq1, seq2) > 0;
1986}
1987
1999int net_bytes_from_str(uint8_t *buf, int buf_len, const char *src);
2000
2010
2020
2029static inline enum net_priority net_vlan2priority(uint8_t priority)
2030{
2031 /* Map according to IEEE 802.1Q */
2032 static const uint8_t vlan2priority[] = {
2041 };
2042
2043 if (priority >= ARRAY_SIZE(vlan2priority)) {
2044 /* Use Best Effort as the default priority */
2045 return NET_PRIORITY_BE;
2046 }
2047
2048 return (enum net_priority)vlan2priority[priority];
2049}
2050
2058static inline uint8_t net_priority2vlan(enum net_priority priority)
2059{
2060 /* The conversion works both ways */
2061 return (uint8_t)net_vlan2priority(priority);
2062}
2063
2072const char *net_family2str(sa_family_t family);
2073
2084#if defined(CONFIG_NET_IPV6_PE)
2085int net_ipv6_pe_add_filter(struct in6_addr *addr, bool is_denylist);
2086#else
2087static inline int net_ipv6_pe_add_filter(struct in6_addr *addr,
2088 bool is_denylist)
2089{
2090 ARG_UNUSED(addr);
2091 ARG_UNUSED(is_denylist);
2092
2093 return -ENOTSUP;
2094}
2095#endif /* CONFIG_NET_IPV6_PE */
2096
2104#if defined(CONFIG_NET_IPV6_PE)
2105int net_ipv6_pe_del_filter(struct in6_addr *addr);
2106#else
2107static inline int net_ipv6_pe_del_filter(struct in6_addr *addr)
2108{
2109 ARG_UNUSED(addr);
2110
2111 return -ENOTSUP;
2112}
2113#endif /* CONFIG_NET_IPV6_PE */
2114
2115#ifdef __cplusplus
2116}
2117#endif
2118
2119#include <zephyr/syscalls/net_ip.h>
2120
2124
2125
2126#endif /* ZEPHYR_INCLUDE_NET_NET_IP_H_ */
static bool net_ipv6_is_my_addr(struct in6_addr *addr)
Check if IPv6 address is found in one of the network interfaces.
Definition net_ip.h:742
struct net_if_addr * net_if_ipv4_addr_lookup(const struct in_addr *addr, struct net_if **iface)
static void net_ipv6_addr_create(struct in6_addr *addr, uint16_t addr0, uint16_t addr1, uint16_t addr2, uint16_t addr3, uint16_t addr4, uint16_t addr5, uint16_t addr6, uint16_t addr7)
Construct an IPv6 address from eight 16-bit words.
Definition net_ip.h:1569
static bool net_ipv4_addr_cmp(const struct in_addr *addr1, const struct in_addr *addr2)
Compare two IPv4 addresses.
Definition net_ip.h:995
#define NET_IPV4_ADDR_SIZE
Binary size of the IPv4 address.
Definition net_ip.h:165
int net_netmask_to_mask_len(sa_family_t family, struct sockaddr *mask, uint8_t *mask_len)
Create mask length from netmask.
struct net_if_addr * net_if_ipv6_addr_lookup(const struct in6_addr *addr, struct net_if **iface)
static bool net_ipv6_is_addr_mcast_org(const struct in6_addr *addr)
Check if the IPv6 address is an organization scope multicast address (FFx8::).
Definition net_ip.h:1435
static enum net_priority net_vlan2priority(uint8_t priority)
Convert network packet VLAN priority to network packet priority so we can place the packet into corre...
Definition net_ip.h:2029
static int net_ipv6_pe_add_filter(struct in6_addr *addr, bool is_denylist)
Add IPv6 prefix as a privacy extension filter.
Definition net_ip.h:2087
static int32_t net_tcp_seq_cmp(uint32_t seq1, uint32_t seq2)
Compare TCP sequence numbers.
Definition net_ip.h:1968
static bool net_ipv6_is_addr_mcast(const struct in6_addr *addr)
Check if the IPv6 address is a multicast address.
Definition net_ip.h:714
#define NET_IPV6_ADDR_SIZE
Binary size of the IPv6 address.
Definition net_ip.h:152
int net_addr_pton(sa_family_t family, const char *src, void *dst)
Convert a string to IP address.
unsigned short int sa_family_t
Socket address family type.
Definition net_ip.h:168
static void net_ipv6_addr_create_ll_allrouters_mcast(struct in6_addr *addr)
Create link local allrouters multicast IPv6 address.
Definition net_ip.h:1600
char * net_addr_ntop(sa_family_t family, const void *src, char *dst, size_t size)
Convert IP address to string form.
net_addr_state
What is the current state of the network address.
Definition net_ip.h:532
static bool net_ipv4_addr_cmp_raw(const uint8_t *addr1, const uint8_t *addr2)
Compare two raw IPv4 address buffers.
Definition net_ip.h:981
static bool net_ipv6_addr_cmp(const struct in6_addr *addr1, const struct in6_addr *addr2)
Compare two IPv6 addresses.
Definition net_ip.h:1009
static bool net_ipv6_is_addr_mcast_iface_all_nodes(const struct in6_addr *addr)
Check if the IPv6 address is a interface scope all nodes multicast address (FF01::1).
Definition net_ip.h:1503
static bool net_ipv4_is_my_addr(const struct in_addr *addr)
Check if the IPv4 address is assigned to any network interface in the system.
Definition net_ip.h:1233
static bool net_ipv6_is_same_mcast_scope(const struct in6_addr *addr_1, const struct in6_addr *addr_2)
Check if the IPv6 addresses have the same multicast scope (FFyx::).
Definition net_ip.h:1324
static void net_ipv6_addr_copy_raw(uint8_t *dest, const uint8_t *src)
Copy an IPv6 address raw buffer.
Definition net_ip.h:967
static bool net_ipv6_is_addr_mcast_mesh(const struct in6_addr *addr)
Check if the IPv6 address is a mesh-local scope multicast address (FFx3::).
Definition net_ip.h:1407
static struct sockaddr_in_ptr * net_sin_ptr(const struct sockaddr_ptr *addr)
Get sockaddr_in_ptr from sockaddr_ptr.
Definition net_ip.h:1804
const struct in_addr * net_ipv4_broadcast_address(void)
Return pointer to broadcast (all bits ones) IPv4 address.
static void net_ipv6_addr_prefix_mask(const uint8_t *inaddr, uint8_t *outaddr, uint8_t prefix_len)
Get the IPv6 network address via the unicast address and the prefix mask.
Definition net_ip.h:810
#define htons(x)
Convert 16-bit value from host to network byte order.
Definition net_ip.h:124
static bool net_ipv6_addr_is_v4_mapped(const struct in6_addr *addr)
Is the IPv6 address an IPv4 mapped one.
Definition net_ip.h:1627
bool net_if_ipv4_addr_mask_cmp(struct net_if *iface, const struct in_addr *addr)
static bool net_ipv6_is_addr_mcast_global(const struct in6_addr *addr)
Check if the IPv6 address is a global multicast address (FFxE::/16).
Definition net_ip.h:1365
static void net_ipv6_addr_create_ll_allnodes_mcast(struct in6_addr *addr)
Create link local allnodes multicast IPv6 address.
Definition net_ip.h:1590
static bool net_ipv6_is_addr_solicited_node(const struct in6_addr *addr)
Check if the IPv6 address is solicited node multicast address FF02:0:0:0:0:1:FFXX:XXXX defined in RFC...
Definition net_ip.h:1286
static void net_ipv6_addr_create_solicited_node(const struct in6_addr *src, struct in6_addr *dst)
Create solicited node IPv6 multicast address FF02:0:0:0:0:1:FFXX:XXXX defined in RFC 3513.
Definition net_ip.h:1541
static bool net_ipv6_is_addr_mcast_group(const struct in6_addr *addr, const struct in6_addr *group)
Check if the IPv6 address belongs to certain multicast group.
Definition net_ip.h:1461
static bool net_ipv6_is_addr_mcast_site(const struct in6_addr *addr)
Check if the IPv6 address is a site scope multicast address (FFx5::).
Definition net_ip.h:1421
static bool net_ipv6_is_sl_addr(const struct in6_addr *addr)
Check if the given IPv6 address is a site local address.
Definition net_ip.h:1056
static void net_ipv6_addr_create_iid(struct in6_addr *addr, struct net_linkaddr *lladdr)
Create IPv6 address interface identifier.
Definition net_ip.h:1669
static bool net_ipv4_is_private_addr(const struct in_addr *addr)
Check if the given IPv4 address is from a private address range.
Definition net_ip.h:919
static bool net_ipv6_is_addr_mcast_link(const struct in6_addr *addr)
Check if the IPv6 address is a link local scope multicast address (FFx2::).
Definition net_ip.h:1393
static bool net_ipv4_addr_mask_cmp(struct net_if *iface, const struct in_addr *addr)
Check if the given address belongs to same subnet that has been configured for the interface.
Definition net_ip.h:1140
net_ip_protocol_secure
Protocol numbers for TLS protocols.
Definition net_ip.h:78
#define net_ipaddr_copy(dest, src)
Copy an IPv4 or IPv6 address.
Definition net_ip.h:946
static int net_ipv6_pe_del_filter(struct in6_addr *addr)
Delete IPv6 prefix from privacy extension filter list.
Definition net_ip.h:2107
const char * net_ipaddr_parse_mask(const char *str, size_t str_len, struct sockaddr *addr, uint8_t *mask_len)
Parse a string that contains either IPv4 or IPv6 address and optional mask len, and store the informa...
net_ip_mtu
IP Maximum Transfer Unit.
Definition net_ip.h:488
int net_rx_priority2tc(enum net_priority prio)
Convert Rx network packet priority to traffic class so we can place the packet into correct Rx queue.
int net_ipv6_addr_generate_iid(struct net_if *iface, const struct in6_addr *prefix, uint8_t *network_id, size_t network_id_len, uint8_t dad_counter, struct in6_addr *addr, struct net_linkaddr *lladdr)
Generate IPv6 address using a prefix and interface identifier.
static bool net_ipv4_is_addr_loopback(struct in_addr *addr)
Check if the IPv4 address is a loopback address (127.0.0.0/8).
Definition net_ip.h:848
int net_bytes_from_str(uint8_t *buf, int buf_len, const char *src)
Convert a string of hex values to array of bytes.
static uint8_t net_priority2vlan(enum net_priority priority)
Convert network packet priority to network packet VLAN priority.
Definition net_ip.h:2058
static void net_ipv6_addr_create_v4_mapped(const struct in_addr *addr4, struct in6_addr *addr6)
Create IPv4 mapped IPv6 address.
Definition net_ip.h:1611
bool net_if_ipv4_is_addr_bcast(struct net_if *iface, const struct in_addr *addr)
#define SOCKADDR_ALIGN
Definition net_ip.h:407
static bool net_ipv6_is_prefix(const uint8_t *addr1, const uint8_t *addr2, uint8_t length)
Check if two IPv6 addresses are same when compared after prefix mask.
Definition net_ip.h:772
bool net_ipaddr_parse(const char *str, size_t str_len, struct sockaddr *addr)
Parse a string that contains either IPv4 or IPv6 address and optional port, and store the information...
int net_port_set_default(struct sockaddr *addr, uint16_t default_port)
Set the default port in the sockaddr structure.
static bool net_ipv6_is_addr_loopback(struct in6_addr *addr)
Check if the IPv6 address is a loopback address (::1).
Definition net_ip.h:695
static bool net_tcp_seq_greater(uint32_t seq1, uint32_t seq2)
Check that one TCP sequence number is greater.
Definition net_ip.h:1983
net_sock_type
Socket type.
Definition net_ip.h:88
const struct in6_addr * net_ipv6_unspecified_address(void)
Return pointer to any (all bits zeros) IPv6 address.
static bool net_ipv6_is_global_addr(const struct in6_addr *addr)
Check if the given IPv6 address is a global address.
Definition net_ip.h:1081
static bool net_ipv6_is_addr_mcast_link_all_nodes(const struct in6_addr *addr)
Check if the IPv6 address is a link local scope all nodes multicast address (FF02::1).
Definition net_ip.h:1527
const char * net_family2str(sa_family_t family)
Return network address family value as a string.
static bool net_ipv4_is_ll_addr(const struct in_addr *addr)
Check if the given IPv4 address is a link local address.
Definition net_ip.h:905
int net_mask_len_to_netmask(sa_family_t family, uint8_t mask_len, struct sockaddr *mask)
Create netmask from mask length.
static struct sockaddr_can_ptr * net_can_ptr(const struct sockaddr_ptr *addr)
Get sockaddr_can_ptr from sockaddr_ptr.
Definition net_ip.h:1832
#define ntohl(x)
Convert 32-bit value from network to host byte order.
Definition net_ip.h:108
static bool net_ipv4_is_addr_bcast(struct net_if *iface, const struct in_addr *addr)
Check if the given IPv4 address is a broadcast address.
Definition net_ip.h:1194
static bool net_ipv6_is_ll_addr(const struct in6_addr *addr)
Check if the given IPv6 address is a link local address.
Definition net_ip.h:1044
static struct sockaddr_in * net_sin(const struct sockaddr *addr)
Get sockaddr_in from sockaddr.
Definition net_ip.h:1776
const struct in_addr * net_ipv4_unspecified_address(void)
Return pointer to any (all bits zeros) IPv4 address.
static bool net_ipv6_is_addr_mcast_all_nodes_group(const struct in6_addr *addr)
Check if the IPv6 address belongs to the all nodes multicast group.
Definition net_ip.h:1488
size_t socklen_t
Length of a socket address.
Definition net_ip.h:172
static bool net_ipv6_is_private_addr(const struct in6_addr *addr)
Check if the given IPv6 address is from a private/local address range.
Definition net_ip.h:1095
static struct sockaddr_ll_ptr * net_sll_ptr(const struct sockaddr_ptr *addr)
Get sockaddr_ll_ptr from sockaddr_ptr.
Definition net_ip.h:1818
static struct sockaddr_in6 * net_sin6(const struct sockaddr *addr)
Get sockaddr_in6 from sockaddr.
Definition net_ip.h:1763
#define ntohs(x)
Convert 16-bit value from network to host byte order.
Definition net_ip.h:100
struct net_if_mcast_addr * net_if_ipv6_maddr_lookup(const struct in6_addr *addr, struct net_if **iface)
static bool net_ipv4_is_addr_unspecified(const struct in_addr *addr)
Check if the IPv4 address is unspecified (all bits zero)
Definition net_ip.h:867
static bool net_ipv6_is_addr_mcast_scope(const struct in6_addr *addr, int scope)
Check if the IPv6 address is a given scope multicast address (FFyx::).
Definition net_ip.h:1309
static bool net_ipv6_is_ula_addr(const struct in6_addr *addr)
Check if the given IPv6 address is a unique local address.
Definition net_ip.h:1069
static bool net_ipv6_is_addr_mcast_iface(const struct in6_addr *addr)
Check if the IPv6 address is a interface scope multicast address (FFx1::).
Definition net_ip.h:1379
#define htonl(x)
Convert 32-bit value from host to network byte order.
Definition net_ip.h:132
int net_tx_priority2tc(enum net_priority prio)
Convert Tx network packet priority to traffic class so we can place the packet into correct Tx queue.
static struct sockaddr_in6_ptr * net_sin6_ptr(const struct sockaddr_ptr *addr)
Get sockaddr_in6_ptr from sockaddr_ptr.
Definition net_ip.h:1790
net_priority
Network packet priority settings described in IEEE 802.1Q Annex I.1.
Definition net_ip.h:509
static bool net_ipv4_is_addr_mcast(const struct in_addr *addr)
Check if the IPv4 address is a multicast address.
Definition net_ip.h:886
static struct sockaddr * net_sad(const struct sockaddr_storage *addr)
Get sockaddr from sockaddr_storage.
Definition net_ip.h:1750
net_ip_protocol
Protocol numbers from IANA/BSD.
Definition net_ip.h:64
static bool net_ipv6_addr_based_on_ll(const struct in6_addr *addr, const struct net_linkaddr *lladdr)
Check if given address is based on link layer address.
Definition net_ip.h:1732
static void net_ipv4_addr_copy_raw(uint8_t *dest, const uint8_t *src)
Copy an IPv4 address raw buffer.
Definition net_ip.h:955
static bool net_ipv6_is_my_maddr(struct in6_addr *maddr)
Check if IPv6 multicast address is found in one of the network interfaces.
Definition net_ip.h:758
static bool net_ipv6_addr_cmp_raw(const uint8_t *addr1, const uint8_t *addr2)
Compare two raw IPv6 address buffers.
Definition net_ip.h:1023
static bool net_ipv6_is_addr_unspecified(const struct in6_addr *addr)
Check if the IPv6 address is unspecified (all bits zero)
Definition net_ip.h:1262
net_addr_type
How the network address is assigned to network interface.
Definition net_ip.h:540
@ NET_ADDR_ANY_STATE
Default (invalid) address type.
Definition net_ip.h:533
@ NET_ADDR_TENTATIVE
Tentative address.
Definition net_ip.h:534
@ NET_ADDR_DEPRECATED
Deprecated address.
Definition net_ip.h:536
@ NET_ADDR_PREFERRED
Preferred address.
Definition net_ip.h:535
@ IPPROTO_TLS_1_1
TLS 1.1 protocol.
Definition net_ip.h:80
@ IPPROTO_TLS_1_0
TLS 1.0 protocol.
Definition net_ip.h:79
@ IPPROTO_DTLS_1_0
DTLS 1.0 protocol.
Definition net_ip.h:83
@ IPPROTO_TLS_1_3
TLS 1.3 protocol.
Definition net_ip.h:82
@ IPPROTO_TLS_1_2
TLS 1.2 protocol.
Definition net_ip.h:81
@ IPPROTO_DTLS_1_2
DTLS 1.2 protocol.
Definition net_ip.h:84
@ NET_IPV4_MTU
IPv4 MTU length.
Definition net_ip.h:504
@ NET_IPV6_MTU
IPv6 MTU length.
Definition net_ip.h:495
@ SOCK_DGRAM
Datagram socket type.
Definition net_ip.h:90
@ SOCK_RAW
RAW socket type.
Definition net_ip.h:91
@ SOCK_STREAM
Stream socket type.
Definition net_ip.h:89
@ NET_PRIORITY_NC
Network control (highest)
Definition net_ip.h:517
@ NET_PRIORITY_IC
Internetwork control.
Definition net_ip.h:516
@ NET_PRIORITY_CA
Critical applications.
Definition net_ip.h:513
@ NET_PRIORITY_VO
Voice, < 10 ms latency and jitter.
Definition net_ip.h:515
@ NET_PRIORITY_VI
Video, < 100 ms latency and jitter.
Definition net_ip.h:514
@ NET_PRIORITY_BE
Best effort (default)
Definition net_ip.h:511
@ NET_PRIORITY_EE
Excellent effort.
Definition net_ip.h:512
@ NET_PRIORITY_BK
Background (lowest)
Definition net_ip.h:510
@ IPPROTO_IP
IP protocol (pseudo-val for setsockopt()
Definition net_ip.h:65
@ IPPROTO_RAW
RAW IP packets.
Definition net_ip.h:74
@ IPPROTO_IPIP
IPIP tunnels.
Definition net_ip.h:69
@ IPPROTO_TCP
TCP protocol.
Definition net_ip.h:70
@ IPPROTO_IGMP
IGMP protocol.
Definition net_ip.h:67
@ IPPROTO_ICMP
ICMP protocol.
Definition net_ip.h:66
@ IPPROTO_IPV6
IPv6 protocol.
Definition net_ip.h:72
@ IPPROTO_ETH_P_ALL
Every packet.
Definition net_ip.h:68
@ IPPROTO_UDP
UDP protocol.
Definition net_ip.h:71
@ IPPROTO_ICMPV6
ICMPv6 protocol.
Definition net_ip.h:73
@ NET_ADDR_ANY
Default value.
Definition net_ip.h:542
@ NET_ADDR_OVERRIDABLE
Manually set address which is overridable by DHCP.
Definition net_ip.h:550
@ NET_ADDR_DHCP
Address is from DHCP.
Definition net_ip.h:546
@ NET_ADDR_MANUAL
Manually set address.
Definition net_ip.h:548
@ NET_ADDR_AUTOCONF
Auto configured address.
Definition net_ip.h:544
@ NET_LINK_ETHERNET
Ethernet link address.
Definition net_linkaddr.h:53
#define ARRAY_SIZE(array)
Number of elements in the given array.
Definition util.h:121
#define ENOTSUP
Unsupported value.
Definition errno.h:114
#define NULL
Definition iar_missing_defs.h:20
Public API for network link address.
flags
Definition parser.h:97
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__INT32_TYPE__ int32_t
Definition stdint.h:74
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
void * memset(void *buf, int c, size_t n)
int memcmp(const void *m1, const void *m2, size_t n)
void * memcpy(void *ZRESTRICT d, const void *ZRESTRICT s, size_t n)
Control message ancillary data.
Definition net_ip.h:268
int cmsg_type
Protocol-specific type.
Definition net_ip.h:271
socklen_t cmsg_len
Number of bytes, including header.
Definition net_ip.h:269
z_max_align_t cmsg_data[]
Flexible array member to force alignment of cmsghdr.
Definition net_ip.h:272
int cmsg_level
Originating protocol.
Definition net_ip.h:270
Group structure.
Definition grp.h:18
IPv6 address struct.
Definition net_ip.h:143
uint8_t s6_addr[16]
IPv6 address buffer.
Definition net_ip.h:145
uint32_t s6_addr32[4]
In big endian.
Definition net_ip.h:147
uint16_t s6_addr16[8]
In big endian.
Definition net_ip.h:146
IPv4 address struct.
Definition net_ip.h:155
uint8_t s4_addr[4]
IPv4 address buffer.
Definition net_ip.h:157
uint32_t s_addr
In big endian, for POSIX compatibility.
Definition net_ip.h:160
uint16_t s4_addr16[2]
In big endian.
Definition net_ip.h:158
uint32_t s4_addr32[1]
In big endian.
Definition net_ip.h:159
IO vector array element.
Definition net_ip.h:250
void * iov_base
Pointer to data.
Definition net_ip.h:251
size_t iov_len
Length of the data.
Definition net_ip.h:252
Message struct.
Definition net_ip.h:257
struct iovec * msg_iov
Scatter/gather array.
Definition net_ip.h:260
socklen_t msg_namelen
Size of socket address.
Definition net_ip.h:259
void * msg_name
Optional socket address, big endian.
Definition net_ip.h:258
int msg_flags
Flags on received message.
Definition net_ip.h:264
size_t msg_controllen
Ancillary data buffer len.
Definition net_ip.h:263
size_t msg_iovlen
Number of elements in msg_iov.
Definition net_ip.h:261
void * msg_control
Ancillary data.
Definition net_ip.h:262
Network Interface unicast IP addresses.
Definition net_if.h:56
IP and other configuration related data for network interface.
Definition net_if.h:586
Network Interface multicast IP addresses.
Definition net_if.h:161
Network Interface structure.
Definition net_if.h:726
Hardware link address structure.
Definition net_linkaddr.h:70
uint8_t addr[6]
The array of bytes representing the address.
Definition net_linkaddr.h:78
uint8_t type
What kind of address is this for.
Definition net_linkaddr.h:72
uint8_t len
The real length of the ll address.
Definition net_linkaddr.h:75
IPv6/IPv4 network connection tuple.
Definition net_ip.h:523
struct net_addr * remote_addr
IPv6/IPv4 remote address.
Definition net_ip.h:524
uint16_t local_port
UDP/TCP local port.
Definition net_ip.h:527
enum net_ip_protocol ip_proto
IP protocol.
Definition net_ip.h:528
uint16_t remote_port
UDP/TCP remote port.
Definition net_ip.h:526
struct net_addr * local_addr
IPv6/IPv4 local address.
Definition net_ip.h:525
Socket address struct for IPv6.
Definition net_ip.h:182
uint8_t sin6_scope_id
Interfaces for a scope.
Definition net_ip.h:186
struct in6_addr sin6_addr
IPv6 address.
Definition net_ip.h:185
uint16_t sin6_port
Port number.
Definition net_ip.h:184
sa_family_t sin6_family
AF_INET6.
Definition net_ip.h:183
Socket address struct for IPv4.
Definition net_ip.h:190
uint16_t sin_port
Port number.
Definition net_ip.h:192
struct in_addr sin_addr
IPv4 address.
Definition net_ip.h:193
sa_family_t sin_family
AF_INET.
Definition net_ip.h:191
Socket address struct for packet socket.
Definition net_ip.h:197
uint8_t sll_pkttype
Packet type.
Definition net_ip.h:202
uint16_t sll_hatype
ARP hardware type.
Definition net_ip.h:201
sa_family_t sll_family
Always AF_PACKET.
Definition net_ip.h:198
uint16_t sll_protocol
Physical-layer protocol.
Definition net_ip.h:199
int sll_ifindex
Interface number.
Definition net_ip.h:200
uint8_t sll_halen
Length of address.
Definition net_ip.h:203
uint8_t sll_addr[8]
Physical-layer address, big endian.
Definition net_ip.h:204
Generic sockaddr struct.
Definition net_ip.h:410
sa_family_t sa_family
Address family.
Definition net_ip.h:411
Byte order helpers.
Misc utilities.
Macros to abstract toolchain specific capabilities.