Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
net_ip.h
Go to the documentation of this file.
1
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
23#include <string.h>
24#include <zephyr/types.h>
25#include <stdbool.h>
26#include <sys/util.h>
27#include <sys/byteorder.h>
28#include <toolchain.h>
29
30#include <net/net_linkaddr.h>
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
37/* Specifying VLAN tag here in order to avoid circular dependencies */
38#define NET_VLAN_TAG_UNSPEC 0x0fff
41/* Protocol families. */
42#define PF_UNSPEC 0
43#define PF_INET 1
44#define PF_INET6 2
45#define PF_PACKET 3
46#define PF_CAN 4
47#define PF_NET_MGMT 5
48#define PF_LOCAL 6
49#define PF_UNIX PF_LOCAL
51/* Address families. */
52#define AF_UNSPEC PF_UNSPEC
53#define AF_INET PF_INET
54#define AF_INET6 PF_INET6
55#define AF_PACKET PF_PACKET
56#define AF_CAN PF_CAN
57#define AF_NET_MGMT PF_NET_MGMT
58#define AF_LOCAL PF_LOCAL
59#define AF_UNIX PF_UNIX
72};
73
81};
82
88};
89
96#define ntohs(x) sys_be16_to_cpu(x)
97
104#define ntohl(x) sys_be32_to_cpu(x)
105
112#define ntohll(x) sys_be64_to_cpu(x)
113
120#define htons(x) sys_cpu_to_be16(x)
121
128#define htonl(x) sys_cpu_to_be32(x)
129
136#define htonll(x) sys_cpu_to_be64(x)
137
139struct in6_addr {
140 union {
142 uint16_t s6_addr16[8]; /* In big endian */
143 uint32_t s6_addr32[4]; /* In big endian */
144 };
145};
146
148struct in_addr {
149 union {
151 uint16_t s4_addr16[2]; /* In big endian */
152 uint32_t s4_addr32[1]; /* In big endian */
153 uint32_t s_addr; /* In big endian, for POSIX compatibility. */
154 };
155};
156
158typedef unsigned short int sa_family_t;
159
161typedef size_t socklen_t;
162
163/*
164 * Note that the sin_port and sin6_port are in network byte order
165 * in various sockaddr* structs.
166 */
167
170 sa_family_t sin6_family; /* AF_INET6 */
171 uint16_t sin6_port; /* Port number */
172 struct in6_addr sin6_addr; /* IPv6 address */
173 uint8_t sin6_scope_id; /* interfaces for a scope */
174};
175
177 sa_family_t sin6_family; /* AF_INET6 */
178 uint16_t sin6_port; /* Port number */
179 struct in6_addr *sin6_addr; /* IPv6 address */
180 uint8_t sin6_scope_id; /* interfaces for a scope */
181};
182
185 sa_family_t sin_family; /* AF_INET */
186 uint16_t sin_port; /* Port number */
187 struct in_addr sin_addr; /* IPv4 address */
188};
189
191 sa_family_t sin_family; /* AF_INET */
192 uint16_t sin_port; /* Port number */
193 struct in_addr *sin_addr; /* IPv4 address */
194};
195
198 sa_family_t sll_family; /* Always AF_PACKET */
199 uint16_t sll_protocol; /* Physical-layer protocol */
200 int sll_ifindex; /* Interface number */
201 uint16_t sll_hatype; /* ARP hardware type */
202 uint8_t sll_pkttype; /* Packet type */
203 uint8_t sll_halen; /* Length of address */
204 uint8_t sll_addr[8]; /* Physical-layer address */
205};
206
208 sa_family_t sll_family; /* Always AF_PACKET */
209 uint16_t sll_protocol; /* Physical-layer protocol */
210 int sll_ifindex; /* Interface number */
211 uint16_t sll_hatype; /* ARP hardware type */
212 uint8_t sll_pkttype; /* Packet type */
213 uint8_t sll_halen; /* Length of address */
214 uint8_t *sll_addr; /* Physical-layer address */
215};
216
220};
221
222#if !defined(HAVE_IOVEC)
223struct iovec {
224 void *iov_base;
225 size_t iov_len;
226};
227#endif
228
229struct msghdr {
230 void *msg_name; /* optional socket address */
231 socklen_t msg_namelen; /* size of socket address */
232 struct iovec *msg_iov; /* scatter/gather array */
233 size_t msg_iovlen; /* number of elements in msg_iov */
234 void *msg_control; /* ancillary data */
235 size_t msg_controllen; /* ancillary data buffer len */
236 int msg_flags; /* flags on received message */
237};
238
239struct cmsghdr {
240 socklen_t cmsg_len; /* Number of bytes, including header */
241 int cmsg_level; /* Originating protocol */
242 int cmsg_type; /* Protocol-specific type */
243 /* Flexible array member to force alignment of cmsghdr */
244 z_max_align_t cmsg_data[];
245};
246
247/* Alignment for headers and data. These are arch specific but define
248 * them here atm if not found alredy.
249 */
250#if !defined(ALIGN_H)
251#define ALIGN_H(x) ROUND_UP(x, __alignof__(struct cmsghdr))
252#endif
253#if !defined(ALIGN_D)
254#define ALIGN_D(x) ROUND_UP(x, __alignof__(z_max_align_t))
255#endif
256
257#if !defined(CMSG_FIRSTHDR)
258#define CMSG_FIRSTHDR(msghdr) \
259 ((msghdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
260 (struct cmsghdr *)((msghdr)->msg_control) : NULL)
261#endif
262
263#if !defined(CMSG_NXTHDR)
264#define CMSG_NXTHDR(msghdr, cmsg) \
265 (((cmsg) == NULL) ? CMSG_FIRSTHDR(msghdr) : \
266 (((uint8_t *)(cmsg) + ALIGN_H((cmsg)->cmsg_len) + \
267 ALIGN_D(sizeof(struct cmsghdr)) > \
268 (uint8_t *)((msghdr)->msg_control) + (msghdr)->msg_controllen) ? \
269 NULL : \
270 (struct cmsghdr *)((uint8_t *)(cmsg) + \
271 ALIGN_H((cmsg)->cmsg_len))))
272#endif
273
274#if !defined(CMSG_DATA)
275#define CMSG_DATA(cmsg) ((uint8_t *)(cmsg) + ALIGN_D(sizeof(struct cmsghdr)))
276#endif
277
278#if !defined(CMSG_SPACE)
279#define CMSG_SPACE(length) (ALIGN_D(sizeof(struct cmsghdr)) + ALIGN_H(length))
280#endif
281
282#if !defined(CMSG_LEN)
283#define CMSG_LEN(length) (ALIGN_D(sizeof(struct cmsghdr)) + length)
284#endif
285
288/* Packet types. */
289#define PACKET_HOST 0 /* To us */
290#define PACKET_BROADCAST 1 /* To all */
291#define PACKET_MULTICAST 2 /* To group */
292#define PACKET_OTHERHOST 3 /* To someone else */
293#define PACKET_OUTGOING 4 /* Originated by us */
294#define PACKET_LOOPBACK 5
295#define PACKET_FASTROUTE 6
296
297/* Note: These macros are defined in a specific order.
298 * The largest sockaddr size is the last one.
299 */
300#if defined(CONFIG_NET_IPV4)
301#undef NET_SOCKADDR_MAX_SIZE
302#undef NET_SOCKADDR_PTR_MAX_SIZE
303#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in))
304#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in_ptr))
305#endif
306
307#if defined(CONFIG_NET_SOCKETS_PACKET)
308#undef NET_SOCKADDR_MAX_SIZE
309#undef NET_SOCKADDR_PTR_MAX_SIZE
310#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_ll))
311#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_ll_ptr))
312#endif
313
314#if defined(CONFIG_NET_IPV6)
315#undef NET_SOCKADDR_MAX_SIZE
316#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in6))
317#if !defined(CONFIG_NET_SOCKETS_PACKET)
318#undef NET_SOCKADDR_PTR_MAX_SIZE
319#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in6_ptr))
320#endif
321#endif
322
323#if !defined(CONFIG_NET_IPV4)
324#if !defined(CONFIG_NET_IPV6)
325#if !defined(CONFIG_NET_SOCKETS_PACKET)
326#define NET_SOCKADDR_MAX_SIZE (sizeof(struct sockaddr_in6))
327#define NET_SOCKADDR_PTR_MAX_SIZE (sizeof(struct sockaddr_in6_ptr))
328#endif
329#endif
330#endif
331
335struct sockaddr {
337 char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
338};
339
342struct sockaddr_ptr {
343 sa_family_t family;
344 char data[NET_SOCKADDR_PTR_MAX_SIZE - sizeof(sa_family_t)];
345};
346
347/* Same as sockaddr in our case */
348struct sockaddr_storage {
349 sa_family_t ss_family;
350 char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
351};
352
353/* Socket address struct for UNIX domain sockets */
354struct sockaddr_un {
355 sa_family_t sun_family; /* AF_UNIX */
356 char sun_path[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)];
357};
358
359struct net_addr {
360 sa_family_t family;
361 union {
362 struct in6_addr in6_addr;
363 struct in_addr in_addr;
364 };
365};
366
367#define IN6ADDR_ANY_INIT { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, \
368 0, 0, 0, 0, 0, 0, 0 } } }
369#define IN6ADDR_LOOPBACK_INIT { { { 0, 0, 0, 0, 0, 0, 0, \
370 0, 0, 0, 0, 0, 0, 0, 0, 1 } } }
371
372extern const struct in6_addr in6addr_any;
373extern const struct in6_addr in6addr_loopback;
374
378#define INET_ADDRSTRLEN 16
382#define INET6_ADDRSTRLEN 46
383
386/* These are for internal usage of the stack */
387#define NET_IPV6_ADDR_LEN sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")
388#define NET_IPV4_ADDR_LEN sizeof("xxx.xxx.xxx.xxx")
389
390#define INADDR_ANY 0
391#define INADDR_ANY_INIT { { { INADDR_ANY } } }
392
400
405};
406
416 NET_PRIORITY_NC = 7
417} __packed;
418
419#define NET_MAX_PRIORITIES 8 /* How many priority values there are */
420
422struct net_tuple {
423 struct net_addr *remote_addr;
424 struct net_addr *local_addr;
428};
429
436} __packed;
437
450} __packed;
451
454struct net_ipv6_hdr {
455 uint8_t vtc;
456 uint8_t tcflow;
457 uint16_t flow;
458 uint16_t len;
459 uint8_t nexthdr;
460 uint8_t hop_limit;
461 struct in6_addr src;
462 struct in6_addr dst;
463} __packed;
464
465struct net_ipv6_frag_hdr {
466 uint8_t nexthdr;
467 uint8_t reserved;
468 uint16_t offset;
469 uint32_t id;
470} __packed;
471
472struct net_ipv4_hdr {
473 uint8_t vhl;
474 uint8_t tos;
475 uint16_t len;
476 uint8_t id[2];
477 uint8_t offset[2];
478 uint8_t ttl;
479 uint8_t proto;
480 uint16_t chksum;
481 struct in_addr src;
482 struct in_addr dst;
483} __packed;
484
485struct net_icmp_hdr {
486 uint8_t type;
487 uint8_t code;
488 uint16_t chksum;
489} __packed;
490
491struct net_udp_hdr {
492 uint16_t src_port;
493 uint16_t dst_port;
494 uint16_t len;
495 uint16_t chksum;
496} __packed;
497
498struct net_tcp_hdr {
499 uint16_t src_port;
500 uint16_t dst_port;
501 uint8_t seq[4];
502 uint8_t ack[4];
503 uint8_t offset;
505 uint8_t wnd[2];
506 uint16_t chksum;
507 uint8_t urg[2];
508 uint8_t optdata[0];
509} __packed;
510
511static inline const char *net_addr_type2str(enum net_addr_type type)
512{
513 switch (type) {
515 return "AUTO";
516 case NET_ADDR_DHCP:
517 return "DHCP";
518 case NET_ADDR_MANUAL:
519 return "MANUAL";
521 return "OVERRIDE";
522 case NET_ADDR_ANY:
523 default:
524 break;
525 }
526
527 return "<unknown>";
528}
529
530/* IPv6 extension headers types */
531#define NET_IPV6_NEXTHDR_HBHO 0
532#define NET_IPV6_NEXTHDR_DESTO 60
533#define NET_IPV6_NEXTHDR_ROUTING 43
534#define NET_IPV6_NEXTHDR_FRAG 44
535#define NET_IPV6_NEXTHDR_NONE 59
536
541union net_ip_header {
542 struct net_ipv4_hdr *ipv4;
543 struct net_ipv6_hdr *ipv6;
544};
545
546union net_proto_header {
547 struct net_udp_hdr *udp;
548 struct net_tcp_hdr *tcp;
549};
550
551#define NET_UDPH_LEN 8 /* Size of UDP header */
552#define NET_TCPH_LEN 20 /* Size of TCP header */
553#define NET_ICMPH_LEN 4 /* Size of ICMP header */
554
555#define NET_IPV6H_LEN 40 /* Size of IPv6 header */
556#define NET_ICMPV6H_LEN NET_ICMPH_LEN /* Size of ICMPv6 header */
557#define NET_IPV6UDPH_LEN (NET_UDPH_LEN + NET_IPV6H_LEN) /* IPv6 + UDP */
558#define NET_IPV6TCPH_LEN (NET_TCPH_LEN + NET_IPV6H_LEN) /* IPv6 + TCP */
559#define NET_IPV6ICMPH_LEN (NET_IPV6H_LEN + NET_ICMPH_LEN) /* ICMPv6 + IPv6 */
560#define NET_IPV6_FRAGH_LEN 8
561
562#define NET_IPV4H_LEN 20 /* Size of IPv4 header */
563#define NET_ICMPV4H_LEN NET_ICMPH_LEN /* Size of ICMPv4 header */
564#define NET_IPV4UDPH_LEN (NET_UDPH_LEN + NET_IPV4H_LEN) /* IPv4 + UDP */
565#define NET_IPV4TCPH_LEN (NET_TCPH_LEN + NET_IPV4H_LEN) /* IPv4 + TCP */
566#define NET_IPV4ICMPH_LEN (NET_IPV4H_LEN + NET_ICMPH_LEN) /* ICMPv4 + IPv4 */
567
577static inline bool net_ipv6_is_addr_loopback(struct in6_addr *addr)
578{
579 return UNALIGNED_GET(&addr->s6_addr32[0]) == 0 &&
580 UNALIGNED_GET(&addr->s6_addr32[1]) == 0 &&
581 UNALIGNED_GET(&addr->s6_addr32[2]) == 0 &&
582 ntohl(UNALIGNED_GET(&addr->s6_addr32[3])) == 1;
583}
584
592static inline bool net_ipv6_is_addr_mcast(const struct in6_addr *addr)
593{
594 return addr->s6_addr[0] == 0xFF;
595}
596
597struct net_if;
598struct net_if_config;
599
600extern struct net_if_addr *net_if_ipv6_addr_lookup(const struct in6_addr *addr,
601 struct net_if **iface);
602
610static inline bool net_ipv6_is_my_addr(struct in6_addr *addr)
611{
612 return net_if_ipv6_addr_lookup(addr, NULL) != NULL;
613}
614
616 const struct in6_addr *addr, struct net_if **iface);
617
626static inline bool net_ipv6_is_my_maddr(struct in6_addr *maddr)
627{
628 return net_if_ipv6_maddr_lookup(maddr, NULL) != NULL;
629}
630
640static inline bool net_ipv6_is_prefix(const uint8_t *addr1,
641 const uint8_t *addr2,
642 uint8_t length)
643{
644 uint8_t bits = 128 - length;
645 uint8_t bytes = length / 8U;
646 uint8_t remain = bits % 8;
647 uint8_t mask;
648
649 if (length > 128) {
650 return false;
651 }
652
653 if (memcmp(addr1, addr2, bytes)) {
654 return false;
655 }
656
657 if (!remain) {
658 /* No remaining bits, the prefixes are the same as first
659 * bytes are the same.
660 */
661 return true;
662 }
663
664 /* Create a mask that has remaining most significant bits set */
665 mask = ((0xff << (8 - remain)) ^ 0xff) << remain;
666
667 return (addr1[bytes] & mask) == (addr2[bytes] & mask);
668}
669
677static inline bool net_ipv4_is_addr_loopback(struct in_addr *addr)
678{
679 return addr->s4_addr[0] == 127U;
680}
681
689static inline bool net_ipv4_is_addr_unspecified(const struct in_addr *addr)
690{
691 return UNALIGNED_GET(&addr->s_addr) == 0;
692}
693
701static inline bool net_ipv4_is_addr_mcast(const struct in_addr *addr)
702{
703 return (ntohl(UNALIGNED_GET(&addr->s_addr)) & 0xF0000000) == 0xE0000000;
704}
705
713static inline bool net_ipv4_is_ll_addr(const struct in_addr *addr)
714{
715 return (ntohl(UNALIGNED_GET(&addr->s_addr)) & 0xA9FE0000) == 0xA9FE0000;
716}
717
727#define net_ipaddr_copy(dest, src) \
728 UNALIGNED_PUT(UNALIGNED_GET(src), dest)
729
738static inline bool net_ipv4_addr_cmp(const struct in_addr *addr1,
739 const struct in_addr *addr2)
740{
741 return UNALIGNED_GET(&addr1->s_addr) == UNALIGNED_GET(&addr2->s_addr);
742}
743
752static inline bool net_ipv6_addr_cmp(const struct in6_addr *addr1,
753 const struct in6_addr *addr2)
754{
755 return !memcmp(addr1, addr2, sizeof(struct in6_addr));
756}
757
765static inline bool net_ipv6_is_ll_addr(const struct in6_addr *addr)
766{
767 return UNALIGNED_GET(&addr->s6_addr16[0]) == htons(0xFE80);
768}
769
777static inline bool net_ipv6_is_ula_addr(const struct in6_addr *addr)
778{
779 return addr->s6_addr[0] == 0xFD;
780}
781
788
795
802
803struct net_if;
804extern bool net_if_ipv4_addr_mask_cmp(struct net_if *iface,
805 const struct in_addr *addr);
806
816static inline bool net_ipv4_addr_mask_cmp(struct net_if *iface,
817 const struct in_addr *addr)
818{
819 return net_if_ipv4_addr_mask_cmp(iface, addr);
820}
821
822extern bool net_if_ipv4_is_addr_bcast(struct net_if *iface,
823 const struct in_addr *addr);
824
833#if defined(CONFIG_NET_NATIVE_IPV4)
834static inline bool net_ipv4_is_addr_bcast(struct net_if *iface,
835 const struct in_addr *addr)
836{
838 return true;
839 }
840
841 return net_if_ipv4_is_addr_bcast(iface, addr);
842}
843#else
844static inline bool net_ipv4_is_addr_bcast(struct net_if *iface,
845 const struct in_addr *addr)
846{
847 ARG_UNUSED(iface);
848 ARG_UNUSED(addr);
849
850 return false;
851}
852#endif
853
854extern struct net_if_addr *net_if_ipv4_addr_lookup(const struct in_addr *addr,
855 struct net_if **iface);
856
866static inline bool net_ipv4_is_my_addr(const struct in_addr *addr)
867{
868 bool ret;
869
870 ret = net_if_ipv4_addr_lookup(addr, NULL) != NULL;
871 if (!ret) {
872 ret = net_ipv4_is_addr_bcast(NULL, addr);
873 }
874
875 return ret;
876}
877
885static inline bool net_ipv6_is_addr_unspecified(const struct in6_addr *addr)
886{
887 return UNALIGNED_GET(&addr->s6_addr32[0]) == 0 &&
888 UNALIGNED_GET(&addr->s6_addr32[1]) == 0 &&
889 UNALIGNED_GET(&addr->s6_addr32[2]) == 0 &&
890 UNALIGNED_GET(&addr->s6_addr32[3]) == 0;
891}
892
901static inline bool net_ipv6_is_addr_solicited_node(const struct in6_addr *addr)
902{
903 return UNALIGNED_GET(&addr->s6_addr32[0]) == htonl(0xff020000) &&
904 UNALIGNED_GET(&addr->s6_addr32[1]) == 0x00000000 &&
905 UNALIGNED_GET(&addr->s6_addr32[2]) == htonl(0x00000001) &&
906 ((UNALIGNED_GET(&addr->s6_addr32[3]) & htonl(0xff000000)) ==
907 htonl(0xff000000));
908}
909
920static inline bool net_ipv6_is_addr_mcast_scope(const struct in6_addr *addr,
921 int scope)
922{
923 return (addr->s6_addr[0] == 0xff) && (addr->s6_addr[1] == scope);
924}
925
935static inline bool net_ipv6_is_same_mcast_scope(const struct in6_addr *addr_1,
936 const struct in6_addr *addr_2)
937{
938 return (addr_1->s6_addr[0] == 0xff) && (addr_2->s6_addr[0] == 0xff) &&
939 (addr_1->s6_addr[1] == addr_2->s6_addr[1]);
940}
941
949static inline bool net_ipv6_is_addr_mcast_global(const struct in6_addr *addr)
950{
951 return net_ipv6_is_addr_mcast_scope(addr, 0x0e);
952}
953
963static inline bool net_ipv6_is_addr_mcast_iface(const struct in6_addr *addr)
964{
965 return net_ipv6_is_addr_mcast_scope(addr, 0x01);
966}
967
977static inline bool net_ipv6_is_addr_mcast_link(const struct in6_addr *addr)
978{
979 return net_ipv6_is_addr_mcast_scope(addr, 0x02);
980}
981
991static inline bool net_ipv6_is_addr_mcast_mesh(const struct in6_addr *addr)
992{
993 return net_ipv6_is_addr_mcast_scope(addr, 0x03);
994}
995
1005static inline bool net_ipv6_is_addr_mcast_site(const struct in6_addr *addr)
1006{
1007 return net_ipv6_is_addr_mcast_scope(addr, 0x05);
1008}
1009
1019static inline bool net_ipv6_is_addr_mcast_org(const struct in6_addr *addr)
1020{
1021 return net_ipv6_is_addr_mcast_scope(addr, 0x08);
1022}
1023
1034static inline bool net_ipv6_is_addr_mcast_group(const struct in6_addr *addr,
1035 const struct in6_addr *group)
1036{
1037 return UNALIGNED_GET(&addr->s6_addr16[1]) == group->s6_addr16[1] &&
1038 UNALIGNED_GET(&addr->s6_addr16[2]) == group->s6_addr16[2] &&
1039 UNALIGNED_GET(&addr->s6_addr16[3]) == group->s6_addr16[3] &&
1040 UNALIGNED_GET(&addr->s6_addr32[1]) == group->s6_addr32[1] &&
1041 UNALIGNED_GET(&addr->s6_addr32[2]) == group->s6_addr32[1] &&
1042 UNALIGNED_GET(&addr->s6_addr32[3]) == group->s6_addr32[3];
1043}
1044
1053static inline bool
1055{
1056 static const struct in6_addr all_nodes_mcast_group = {
1057 { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1058 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }
1059 };
1060
1061 return net_ipv6_is_addr_mcast_group(addr, &all_nodes_mcast_group);
1062}
1063
1073static inline bool
1075{
1076 return net_ipv6_is_addr_mcast_iface(addr) &&
1078}
1079
1089static inline bool
1091{
1092 return net_ipv6_is_addr_mcast_link(addr) &&
1094}
1095
1103static inline
1105 struct in6_addr *dst)
1106{
1107 dst->s6_addr[0] = 0xFF;
1108 dst->s6_addr[1] = 0x02;
1109 UNALIGNED_PUT(0, &dst->s6_addr16[1]);
1110 UNALIGNED_PUT(0, &dst->s6_addr16[2]);
1111 UNALIGNED_PUT(0, &dst->s6_addr16[3]);
1112 UNALIGNED_PUT(0, &dst->s6_addr16[4]);
1113 dst->s6_addr[10] = 0U;
1114 dst->s6_addr[11] = 0x01;
1115 dst->s6_addr[12] = 0xFF;
1116 dst->s6_addr[13] = src->s6_addr[13];
1117 UNALIGNED_PUT(UNALIGNED_GET(&src->s6_addr16[7]), &dst->s6_addr16[7]);
1118}
1119
1132static inline void net_ipv6_addr_create(struct in6_addr *addr,
1133 uint16_t addr0, uint16_t addr1,
1134 uint16_t addr2, uint16_t addr3,
1135 uint16_t addr4, uint16_t addr5,
1136 uint16_t addr6, uint16_t addr7)
1137{
1138 UNALIGNED_PUT(htons(addr0), &addr->s6_addr16[0]);
1139 UNALIGNED_PUT(htons(addr1), &addr->s6_addr16[1]);
1140 UNALIGNED_PUT(htons(addr2), &addr->s6_addr16[2]);
1141 UNALIGNED_PUT(htons(addr3), &addr->s6_addr16[3]);
1142 UNALIGNED_PUT(htons(addr4), &addr->s6_addr16[4]);
1143 UNALIGNED_PUT(htons(addr5), &addr->s6_addr16[5]);
1144 UNALIGNED_PUT(htons(addr6), &addr->s6_addr16[6]);
1145 UNALIGNED_PUT(htons(addr7), &addr->s6_addr16[7]);
1146}
1147
1153static inline void net_ipv6_addr_create_ll_allnodes_mcast(struct in6_addr *addr)
1154{
1155 net_ipv6_addr_create(addr, 0xff02, 0, 0, 0, 0, 0, 0, 0x0001);
1156}
1157
1164{
1165 net_ipv6_addr_create(addr, 0xff02, 0, 0, 0, 0, 0, 0, 0x0002);
1166}
1167
1174static inline void net_ipv6_addr_create_iid(struct in6_addr *addr,
1175 struct net_linkaddr *lladdr)
1176{
1177 UNALIGNED_PUT(htonl(0xfe800000), &addr->s6_addr32[0]);
1178 UNALIGNED_PUT(0, &addr->s6_addr32[1]);
1179
1180 switch (lladdr->len) {
1181 case 2:
1182 /* The generated IPv6 shall not toggle the
1183 * Universal/Local bit. RFC 6282 ch 3.2.2
1184 */
1185 if (lladdr->type == NET_LINK_IEEE802154 ||
1186 lladdr->type == NET_LINK_CANBUS) {
1187 UNALIGNED_PUT(0, &addr->s6_addr32[2]);
1188 addr->s6_addr[11] = 0xff;
1189 addr->s6_addr[12] = 0xfe;
1190 addr->s6_addr[13] = 0U;
1191 addr->s6_addr[14] = lladdr->addr[0];
1192 addr->s6_addr[15] = lladdr->addr[1];
1193 }
1194
1195 break;
1196 case 6:
1197 /* We do not toggle the Universal/Local bit
1198 * in Bluetooth. See RFC 7668 ch 3.2.2
1199 */
1200 memcpy(&addr->s6_addr[8], lladdr->addr, 3);
1201 addr->s6_addr[11] = 0xff;
1202 addr->s6_addr[12] = 0xfe;
1203 memcpy(&addr->s6_addr[13], lladdr->addr + 3, 3);
1204
1205#if defined(CONFIG_NET_L2_BT_ZEP1656)
1206 /* Workaround against older Linux kernel BT IPSP code.
1207 * This will be removed eventually.
1208 */
1209 if (lladdr->type == NET_LINK_BLUETOOTH) {
1210 addr->s6_addr[8] ^= 0x02;
1211 }
1212#endif
1213
1214 if (lladdr->type == NET_LINK_ETHERNET) {
1215 addr->s6_addr[8] ^= 0x02;
1216 }
1217
1218 break;
1219 case 8:
1220 memcpy(&addr->s6_addr[8], lladdr->addr, lladdr->len);
1221 addr->s6_addr[8] ^= 0x02;
1222 break;
1223 }
1224}
1225
1231static inline bool net_ipv6_addr_based_on_ll(const struct in6_addr *addr,
1232 const struct net_linkaddr *lladdr)
1233{
1234 if (!addr || !lladdr) {
1235 return false;
1236 }
1237
1238 switch (lladdr->len) {
1239 case 2:
1240 if (!memcmp(&addr->s6_addr[14], lladdr->addr, lladdr->len) &&
1241 addr->s6_addr[8] == 0U &&
1242 addr->s6_addr[9] == 0U &&
1243 addr->s6_addr[10] == 0U &&
1244 addr->s6_addr[11] == 0xff &&
1245 addr->s6_addr[12] == 0xfe) {
1246 return true;
1247 }
1248
1249 break;
1250 case 6:
1251 if (lladdr->type == NET_LINK_ETHERNET) {
1252 if (!memcmp(&addr->s6_addr[9], &lladdr->addr[1], 2) &&
1253 !memcmp(&addr->s6_addr[13], &lladdr->addr[3], 3) &&
1254 addr->s6_addr[11] == 0xff &&
1255 addr->s6_addr[12] == 0xfe &&
1256 (addr->s6_addr[8] ^ 0x02) == lladdr->addr[0]) {
1257 return true;
1258 }
1259 } else if (lladdr->type == NET_LINK_BLUETOOTH) {
1260 if (!memcmp(&addr->s6_addr[9], &lladdr->addr[1], 2) &&
1261 !memcmp(&addr->s6_addr[13], &lladdr->addr[3], 3) &&
1262 addr->s6_addr[11] == 0xff &&
1263 addr->s6_addr[12] == 0xfe
1264#if defined(CONFIG_NET_L2_BT_ZEP1656)
1265 /* Workaround against older Linux kernel BT IPSP
1266 * code. This will be removed eventually.
1267 */
1268 && (addr->s6_addr[8] ^ 0x02) == lladdr->addr[0]
1269#endif
1270 ) {
1271 return true;
1272 }
1273 }
1274
1275 break;
1276 case 8:
1277 if (!memcmp(&addr->s6_addr[9], &lladdr->addr[1],
1278 lladdr->len - 1) &&
1279 (addr->s6_addr[8] ^ 0x02) == lladdr->addr[0]) {
1280 return true;
1281 }
1282
1283 break;
1284 }
1285
1286 return false;
1287}
1288
1297static inline struct sockaddr_in6 *net_sin6(const struct sockaddr *addr)
1298{
1299 return (struct sockaddr_in6 *)addr;
1300}
1301
1310static inline struct sockaddr_in *net_sin(const struct sockaddr *addr)
1311{
1312 return (struct sockaddr_in *)addr;
1313}
1314
1323static inline
1324struct sockaddr_in6_ptr *net_sin6_ptr(const struct sockaddr_ptr *addr)
1325{
1326 return (struct sockaddr_in6_ptr *)addr;
1327}
1328
1337static inline
1338struct sockaddr_in_ptr *net_sin_ptr(const struct sockaddr_ptr *addr)
1339{
1340 return (struct sockaddr_in_ptr *)addr;
1341}
1342
1351static inline
1352struct sockaddr_ll_ptr *net_sll_ptr(const struct sockaddr_ptr *addr)
1353{
1354 return (struct sockaddr_ll_ptr *)addr;
1355}
1356
1365static inline
1366struct sockaddr_can_ptr *net_can_ptr(const struct sockaddr_ptr *addr)
1367{
1368 return (struct sockaddr_can_ptr *)addr;
1369}
1370
1384__syscall int net_addr_pton(sa_family_t family, const char *src, void *dst);
1385
1397__syscall char *net_addr_ntop(sa_family_t family, const void *src,
1398 char *dst, size_t size);
1399
1421bool net_ipaddr_parse(const char *str, size_t str_len,
1422 struct sockaddr *addr);
1423
1435static inline int32_t net_tcp_seq_cmp(uint32_t seq1, uint32_t seq2)
1436{
1437 return (int32_t)(seq1 - seq2);
1438}
1439
1450static inline bool net_tcp_seq_greater(uint32_t seq1, uint32_t seq2)
1451{
1452 return net_tcp_seq_cmp(seq1, seq2) > 0;
1453}
1454
1466int net_bytes_from_str(uint8_t *buf, int buf_len, const char *src);
1467
1477
1487
1496static inline enum net_priority net_vlan2priority(uint8_t priority)
1497{
1498 /* Map according to IEEE 802.1Q */
1499 static const uint8_t vlan2priority[] = {
1508 };
1509
1510 if (priority >= ARRAY_SIZE(vlan2priority)) {
1511 /* Use Best Effort as the default priority */
1512 return NET_PRIORITY_BE;
1513 }
1514
1515 return (enum net_priority)vlan2priority[priority];
1516}
1517
1525static inline uint8_t net_priority2vlan(enum net_priority priority)
1526{
1527 /* The conversion works both ways */
1528 return (uint8_t)net_vlan2priority(priority);
1529}
1530
1539const char *net_family2str(sa_family_t family);
1540
1541#ifdef __cplusplus
1542}
1543#endif
1544
1545#include <syscalls/net_ip.h>
1546
1552#endif /* ZEPHYR_INCLUDE_NET_NET_IP_H_ */
Byte order helpers.
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:610
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:1132
static bool net_ipv4_addr_cmp(const struct in_addr *addr1, const struct in_addr *addr2)
Compare two IPv4 addresses.
Definition: net_ip.h:738
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:1019
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:1496
static int32_t net_tcp_seq_cmp(uint32_t seq1, uint32_t seq2)
Compare TCP sequence numbers.
Definition: net_ip.h:1435
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:592
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
Definition: net_ip.h:158
static void net_ipv6_addr_create_ll_allrouters_mcast(struct in6_addr *addr)
Create link local allrouters multicast IPv6 address.
Definition: net_ip.h:1163
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
Definition: net_ip.h:431
static bool net_ipv6_addr_cmp(const struct in6_addr *addr1, const struct in6_addr *addr2)
Compare two IPv6 addresses.
Definition: net_ip.h:752
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:1074
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:866
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:935
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:991
static struct sockaddr_in_ptr * net_sin_ptr(const struct sockaddr_ptr *addr)
Get sockaddr_in_ptr from sockaddr_ptr. This is a helper so that the code calling this function can be...
Definition: net_ip.h:1338
const struct in_addr * net_ipv4_broadcast_address(void)
Return pointer to broadcast (all bits ones) IPv4 address.
#define htons(x)
Convert 16-bit value from host to network byte order.
Definition: net_ip.h:120
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:949
static void net_ipv6_addr_create_ll_allnodes_mcast(struct in6_addr *addr)
Create link local allnodes multicast IPv6 address.
Definition: net_ip.h:1153
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:901
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:1104
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:1034
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:1005
static void net_ipv6_addr_create_iid(struct in6_addr *addr, struct net_linkaddr *lladdr)
Create IPv6 address interface identifier.
Definition: net_ip.h:1174
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:977
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:816
net_ip_protocol_secure
Definition: net_ip.h:75
net_ip_mtu
Definition: net_ip.h:395
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.
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:677
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:1525
bool net_if_ipv4_is_addr_bcast(struct net_if *iface, const struct in_addr *addr)
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:640
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...
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:577
static bool net_tcp_seq_greater(uint32_t seq1, uint32_t seq2)
Check that one TCP sequence number is greater.
Definition: net_ip.h:1450
net_sock_type
Definition: net_ip.h:84
const struct in6_addr * net_ipv6_unspecified_address(void)
Return pointer to any (all bits zeros) IPv6 address.
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:1090
const char * net_family2str(sa_family_t family)
Return network address family value as a string. This is only usable for debugging.
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:713
static struct sockaddr_can_ptr * net_can_ptr(const struct sockaddr_ptr *addr)
Get sockaddr_can_ptr from sockaddr_ptr. This is a helper so that the code needing this functionality ...
Definition: net_ip.h:1366
#define ntohl(x)
Convert 32-bit value from network to host byte order.
Definition: net_ip.h:104
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:844
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:765
static struct sockaddr_in * net_sin(const struct sockaddr *addr)
Get sockaddr_in from sockaddr. This is a helper so that the code calling this function can be made sh...
Definition: net_ip.h:1310
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:1054
size_t socklen_t
Definition: net_ip.h:161
static struct sockaddr_ll_ptr * net_sll_ptr(const struct sockaddr_ptr *addr)
Get sockaddr_ll_ptr from sockaddr_ptr. This is a helper so that the code calling this function can be...
Definition: net_ip.h:1352
static struct sockaddr_in6 * net_sin6(const struct sockaddr *addr)
Get sockaddr_in6 from sockaddr. This is a helper so that the code calling this function can be made s...
Definition: net_ip.h:1297
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:689
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:920
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:777
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:963
#define htonl(x)
Convert 32-bit value from host to network byte order.
Definition: net_ip.h:128
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. This is a helper so that the code calling this function can b...
Definition: net_ip.h:1324
net_priority
Definition: net_ip.h:408
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:701
net_ip_protocol
Definition: net_ip.h:62
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:1231
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:626
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:885
net_addr_type
Definition: net_ip.h:439
@ NET_ADDR_ANY_STATE
Definition: net_ip.h:432
@ NET_ADDR_TENTATIVE
Definition: net_ip.h:433
@ NET_ADDR_DEPRECATED
Definition: net_ip.h:435
@ NET_ADDR_PREFERRED
Definition: net_ip.h:434
@ IPPROTO_TLS_1_1
Definition: net_ip.h:77
@ IPPROTO_TLS_1_0
Definition: net_ip.h:76
@ IPPROTO_DTLS_1_0
Definition: net_ip.h:79
@ IPPROTO_TLS_1_2
Definition: net_ip.h:78
@ IPPROTO_DTLS_1_2
Definition: net_ip.h:80
@ NET_IPV4_MTU
Definition: net_ip.h:404
@ NET_IPV6_MTU
Definition: net_ip.h:399
@ SOCK_DGRAM
Definition: net_ip.h:86
@ SOCK_RAW
Definition: net_ip.h:87
@ SOCK_STREAM
Definition: net_ip.h:85
@ NET_PRIORITY_NC
Definition: net_ip.h:416
@ NET_PRIORITY_IC
Definition: net_ip.h:415
@ NET_PRIORITY_CA
Definition: net_ip.h:412
@ NET_PRIORITY_VO
Definition: net_ip.h:414
@ NET_PRIORITY_VI
Definition: net_ip.h:413
@ NET_PRIORITY_BE
Definition: net_ip.h:410
@ NET_PRIORITY_EE
Definition: net_ip.h:411
@ NET_PRIORITY_BK
Definition: net_ip.h:409
@ IPPROTO_IP
Definition: net_ip.h:63
@ IPPROTO_RAW
Definition: net_ip.h:71
@ IPPROTO_IPIP
Definition: net_ip.h:66
@ IPPROTO_TCP
Definition: net_ip.h:67
@ IPPROTO_IGMP
Definition: net_ip.h:65
@ IPPROTO_ICMP
Definition: net_ip.h:64
@ IPPROTO_IPV6
Definition: net_ip.h:69
@ IPPROTO_UDP
Definition: net_ip.h:68
@ IPPROTO_ICMPV6
Definition: net_ip.h:70
@ NET_ADDR_ANY
Definition: net_ip.h:441
@ NET_ADDR_OVERRIDABLE
Definition: net_ip.h:449
@ NET_ADDR_DHCP
Definition: net_ip.h:445
@ NET_ADDR_MANUAL
Definition: net_ip.h:447
@ NET_ADDR_AUTOCONF
Definition: net_ip.h:443
@ NET_LINK_CANBUS
Definition: net_linkaddr.h:61
@ NET_LINK_IEEE802154
Definition: net_linkaddr.h:51
@ NET_LINK_ETHERNET
Definition: net_linkaddr.h:55
@ NET_LINK_BLUETOOTH
Definition: net_linkaddr.h:53
#define ARRAY_SIZE(array)
Number of elements in the given array.
Definition: util.h:92
flags
Definition: http_parser.h:131
static ZTEST_BMEM volatile int ret
Definition: k_float_disable.c:28
Public API for network link address.
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__INT32_TYPE__ int32_t
Definition: stdint.h:44
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
__UINT16_TYPE__ uint16_t
Definition: stdint.h:59
void * memcpy(void *_MLIBC_RESTRICT d, const void *_MLIBC_RESTRICT s, size_t n)
int memcmp(const void *m1, const void *m2, size_t n)
Definition: net_ip.h:239
int cmsg_type
Definition: net_ip.h:242
socklen_t cmsg_len
Definition: net_ip.h:240
z_max_align_t cmsg_data[]
Definition: net_ip.h:244
int cmsg_level
Definition: net_ip.h:241
Definition: net_ip.h:139
uint8_t s6_addr[16]
Definition: net_ip.h:141
uint32_t s6_addr32[4]
Definition: net_ip.h:143
uint16_t s6_addr16[8]
Definition: net_ip.h:142
Definition: net_ip.h:148
uint8_t s4_addr[4]
Definition: net_ip.h:150
uint32_t s_addr
Definition: net_ip.h:153
uint16_t s4_addr16[2]
Definition: net_ip.h:151
uint32_t s4_addr32[1]
Definition: net_ip.h:152
Definition: net_ip.h:223
void * iov_base
Definition: net_ip.h:224
size_t iov_len
Definition: net_ip.h:225
Definition: net_ip.h:229
struct iovec * msg_iov
Definition: net_ip.h:232
socklen_t msg_namelen
Definition: net_ip.h:231
void * msg_name
Definition: net_ip.h:230
int msg_flags
Definition: net_ip.h:236
size_t msg_controllen
Definition: net_ip.h:235
size_t msg_iovlen
Definition: net_ip.h:233
void * msg_control
Definition: net_ip.h:234
Network Interface unicast IP addresses.
Definition: net_if.h:49
IP and other configuration related data for network interface.
Definition: net_if.h:373
Network Interface multicast IP addresses.
Definition: net_if.h:90
Network Interface structure.
Definition: net_if.h:468
Hardware link address structure.
Definition: net_linkaddr.h:69
uint8_t * addr
Definition: net_linkaddr.h:71
uint8_t type
Definition: net_linkaddr.h:77
uint8_t len
Definition: net_linkaddr.h:74
Definition: net_ip.h:422
struct net_addr * remote_addr
Definition: net_ip.h:423
uint16_t local_port
Definition: net_ip.h:426
enum net_ip_protocol ip_proto
Definition: net_ip.h:427
uint16_t remote_port
Definition: net_ip.h:425
struct net_addr * local_addr
Definition: net_ip.h:424
Definition: net_ip.h:217
sa_family_t can_family
Definition: net_ip.h:218
int can_ifindex
Definition: net_ip.h:219
Definition: net_ip.h:176
sa_family_t sin6_family
Definition: net_ip.h:177
uint16_t sin6_port
Definition: net_ip.h:178
uint8_t sin6_scope_id
Definition: net_ip.h:180
struct in6_addr * sin6_addr
Definition: net_ip.h:179
Definition: net_ip.h:169
uint8_t sin6_scope_id
Definition: net_ip.h:173
struct in6_addr sin6_addr
Definition: net_ip.h:172
uint16_t sin6_port
Definition: net_ip.h:171
sa_family_t sin6_family
Definition: net_ip.h:170
Definition: net_ip.h:190
struct in_addr * sin_addr
Definition: net_ip.h:193
uint16_t sin_port
Definition: net_ip.h:192
sa_family_t sin_family
Definition: net_ip.h:191
Definition: net_ip.h:184
uint16_t sin_port
Definition: net_ip.h:186
struct in_addr sin_addr
Definition: net_ip.h:187
sa_family_t sin_family
Definition: net_ip.h:185
Definition: net_ip.h:207
uint8_t * sll_addr
Definition: net_ip.h:214
uint16_t sll_hatype
Definition: net_ip.h:211
int sll_ifindex
Definition: net_ip.h:210
uint8_t sll_pkttype
Definition: net_ip.h:212
sa_family_t sll_family
Definition: net_ip.h:208
uint8_t sll_halen
Definition: net_ip.h:213
uint16_t sll_protocol
Definition: net_ip.h:209
Definition: net_ip.h:197
uint8_t sll_pkttype
Definition: net_ip.h:202
uint16_t sll_hatype
Definition: net_ip.h:201
sa_family_t sll_family
Definition: net_ip.h:198
uint16_t sll_protocol
Definition: net_ip.h:199
int sll_ifindex
Definition: net_ip.h:200
uint8_t sll_halen
Definition: net_ip.h:203
uint8_t sll_addr[8]
Definition: net_ip.h:204
Definition: net_ip.h:335
char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)]
Definition: net_ip.h:337
sa_family_t sa_family
Definition: net_ip.h:336
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
Macros to abstract toolchain specific capabilities.
Misc utilities.