/* * Copyright (C) 2013-15 Freie Universität Berlin * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level * directory for more details. */ /** * @addtogroup posix_sockets * @{ */ /** * @file * @brief Main socket header * @see * The Open Group Base Specifications Issue 7, * * * @author Martine Lenders */ #ifndef NETINET_IN_H #define NETINET_IN_H #include #include #include "net/protnum.h" #include "net/ipv6/addr.h" #include "sys/bytes.h" #ifdef __cplusplus extern "C" { #endif #define INET_ADDRSTRLEN (16) /**< Length of the string form for IPv4. */ #define INET6_ADDRSTRLEN (46) /**< Length of the string form for IPv6. */ /** * IPv4 local host address. */ #define INADDR_ANY ((in_addr_t)0x00000000) /** * IPv4 broadcast address. */ #define INADDR_BROADCAST ((in_addr_t)0xffffffff) /** * IPv6 wildcard address. */ #define IN6ADDR_ANY_INIT IPV6_ADDR_UNSPECIFIED /** * IPv6 loopback address. */ #define IN6ADDR_LOOPBACK_INIT IPV6_ADDR_LOOPBACK /** * @name IPv6 address macros * @{ */ /** * @brief Check if address is the unspecified address (`::`). * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not the unspecified address. * @return any other value otherwise. */ #define IN6_IS_ADDR_UNSPECIFIED(addr) ((int)(ipv6_addr_is_unspecified((const ipv6_addr_t *)(addr)))) /** * @brief Check if address is the loopback address (`::1`). * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not the loopback address. * @return any other value otherwise. */ #define IN6_IS_ADDR_LOOPBACK(addr) ((int)(ipv6_addr_is_loopback((const ipv6_addr_t *)(addr)))) /** * @brief Check if address is a multicast address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not a multicast address. * @return any other value otherwise. */ #define IN6_IS_ADDR_MULTICAST(addr) ((int)(ipv6_addr_is_multicast((const ipv6_addr_t *)(addr)))) /** * @brief Check if address is a link-local address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not a link-local address. * @return any other value otherwise. */ #define IN6_IS_ADDR_LINKLOCAL(addr) ((int)(ipv6_addr_is_link_local((const ipv6_addr_t *)addr))) /** * @brief Check if address is a site-local address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not a site-local address. * @return any other value otherwise. */ #define IN6_IS_ADDR_SITELOCAL(addr) ((int)(ipv6_addr_is_site_local((const ipv6_addr_t *)addr))) /** * @brief Check if address is an IPv4 mapped address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not an IPv4 mapped address. * @return any other value otherwise. */ #define IN6_IS_ADDR_V4MAPPED(addr) ((int)(ipv6_addr_is_ipv4_mapped((const ipv6_addr_t *)addr))) /** * @brief Check if address is an IPv4-compatible address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not an IPv4-compatible address. * @return any other value otherwise. */ #define IN6_IS_ADDR_V4COMPAT(addr) ((int)(ipv6_addr_is_ipv4_compat((const ipv6_addr_t *)addr))) /** * @brief Check if address is a multicast node-local address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not a multicast node-local address. * @return any other value otherwise. */ #define IN6_IS_ADDR_MC_NODELOCAL(addr) (IN6_IS_ADDR_MULTICAST(addr) && \ (int)((addr->s6_addr[1] & 0x0f) == IPV6_ADDR_MCAST_SCP_IF_LOCAL)) /** * @brief Check if address is a multicast link-local address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not a multicast link-local address. * @return any other value otherwise. */ #define IN6_IS_ADDR_MC_LINKLOCAL(addr) (IN6_IS_ADDR_MULTICAST(addr) && \ (int)((addr->s6_addr[1] & 0x0f) == IPV6_ADDR_MCAST_SCP_LINK_LOCAL)) /** * @brief Check if address is a multicast site-local address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not a multicast site-local address. * @return any other value otherwise. */ #define IN6_IS_ADDR_MC_SITELOCAL(addr) (IN6_IS_ADDR_MULTICAST(addr) && \ (int)((addr->s6_addr[1] & 0x0f) == IPV6_ADDR_MCAST_SCP_SITE_LOCAL)) /** * @brief Check if address is a multicast organization-local address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not a multicast organization-local address. * @return any other value otherwise. */ #define IN6_IS_ADDR_MC_ORGLOCAL(addr) (IN6_IS_ADDR_MULTICAST(addr) && \ (int)((addr->s6_addr[1] & 0x0f) == IPV6_ADDR_MCAST_SCP_ORG_LOCAL)) /** * @brief Check if address is a multicast global address. * * @param[in] addr address of type `const struct in6_addr *` * * @return 0, when an address is not a multicast global address. * @return any other value otherwise. */ #define IN6_IS_ADDR_MC_GLOBAL(addr) (IN6_IS_ADDR_MULTICAST(addr) && \ (int)((addr->s6_addr[1] & 0x0f) == IPV6_ADDR_MCAST_SCP_GLOBAL)) /** @} */ /** * @name Protocol numbers for option * @{ */ #define IPPROTO_IP (PROTNUM_IPV4) /**< Internet Protocol version 4 */ #define IPPROTO_IPV6 (PROTNUM_IPV6) /**< Internet Protocol version 6 */ #define IPPROTO_ICMP (PROTNUM_ICMP) /**< Internet Control Message Protocol */ #define IPPROTO_ICMPV6 (PROTNUM_ICMPV6) /**< ICMP for IPv6 */ #define IPPROTO_RAW (PROTNUM_RESERVED) /**< Raw IP packets protocol */ #define IPPROTO_TCP (PROTNUM_TCP) /**< Transmission control protocol */ #define IPPROTO_UDP (PROTNUM_UDP) /**< User datagram protocol */ /** @} */ /** * @todo IPv6 option names */ typedef uint16_t in_port_t; /**< Internet port type */ typedef uint32_t in_addr_t; /**< IPv4 address type */ /** * IPv4 address structure type. */ struct in_addr { in_addr_t s_addr; /**< an IPv4 address */ }; /** * @brief IPv6 address structure type. */ struct in6_addr { uint8_t s6_addr[16]; /**< unsigned 8-bit integer array */ }; /** * @brief IPv4 socket address type. * @extends struct sockaddr */ struct sockaddr_in { sa_family_t sin_family; /**< Protocol family, always AF_INET */ in_port_t sin_port; /**< Port number */ struct in_addr sin_addr; /**< IPv4 address */ }; /** * IPv6 socket address type. * @extends struct sockaddr */ struct sockaddr_in6 { /** * Protocol family, always AF_INET6. Member of struct sockaddr_in6 */ sa_family_t sin6_family; /**< Protocol family, always AF_INET6 */ in_port_t sin6_port; /**< Port number */ uint32_t sin6_flowinfo; /**< IPv6 traffic class and flow information */ struct in6_addr sin6_addr; /**< IPv6 address */ uint32_t sin6_scope_id; /**< Set of interfaces for a scope */ }; /** * @brief IPv6 multicast request. */ struct ipv6_mreq { struct in6_addr ipv6mr_multiaddr; /**< an IPv6 multicast address */ unsigned ipv6mr_interface; /**< interface index, leave 0 for default */ }; /** * IPv6 socket address for the wildcard address. */ extern const struct in6_addr in6addr_any; /** * IPv6 socket address for the loopback address. */ extern const struct in6_addr in6addr_loopback; #ifdef __cplusplus } #endif /** * @} */ #endif /* NETINET_IN_H */