mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
275 lines
7.8 KiB
C
275 lines
7.8 KiB
C
/*
|
|
* 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 <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html">
|
|
* The Open Group Base Specifications Issue 7, <netinet/in.h>
|
|
* </a>
|
|
*
|
|
* @author Martine Lenders <mlenders@inf.fu-berlin.de>
|
|
*/
|
|
#ifndef NETINET_IN_H
|
|
#define NETINET_IN_H
|
|
|
|
#include <inttypes.h>
|
|
#include <sys/socket.h>
|
|
|
|
#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 */
|