* include/netinet/in.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __INCLUDE_NETINET_IN_H
#define __INCLUDE_NETINET_IN_H
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdint.h>
#include <endian.h>
* Pre-processor Definitions
****************************************************************************/
#define IPPROTO_IP 0
#define IPPROTO_HOPOPTS 0
#define IPPROTO_ICMP 1
#define IPPROTO_IGMP 2
#define IPPROTO_IPIP 4
#define IPPROTO_TCP 6
#define IPPROTO_EGP 8
#define IPPROTO_PUP 12
#define IPPROTO_UDP 17
#define IPPROTO_IDP 22
#define IPPROTO_TP 29
#define IPPROTO_DCCP 33
#define IPPROTO_IPV6 41
#define IPPROTO_ROUTING 43
#define IPPROTO_FRAGMENT 44
#define IPPROTO_RSVP 46
#define IPPROTO_GRE 47
#define IPPROTO_ESP 50
#define IPPROTO_AH 51
#define IPPROTO_ICMP6 58
#define IPPROTO_ICMPV6 IPPROTO_ICMP6
#define IPPROTO_NONE 59
#define IPPROTO_DSTOPTS 60
#define IPPROTO_MTP 92
#define IPPROTO_ENCAP 98
#define IPPROTO_BEETPH 94
#define IPPROTO_PIM 103
#define IPPROTO_COMP 108
#define IPPROTO_SCTP 132
#define IPPROTO_UDPLITE 136
#define IPPROTO_MPLS 137
#define IPPROTO_RAW 255
#define IP_MULTICAST_IF (__SO_PROTOCOL + 1)
* multicast socket */
#define IP_MULTICAST_TTL (__SO_PROTOCOL + 2)
* live value of outgoing
* multicast packets */
#define IP_MULTICAST_LOOP (__SO_PROTOCOL + 3)
* determines whether sent
* multicast packets should
* be looped back to local
* sockets. */
#define IP_ADD_MEMBERSHIP (__SO_PROTOCOL + 4)
#define IP_DROP_MEMBERSHIP (__SO_PROTOCOL + 5)
#define IP_UNBLOCK_SOURCE (__SO_PROTOCOL + 6)
* blocked multicast source */
#define IP_BLOCK_SOURCE (__SO_PROTOCOL + 7)
* data from source */
#define IP_ADD_SOURCE_MEMBERSHIP (__SO_PROTOCOL + 8)
* allow receive only from
* source */
#define IP_DROP_SOURCE_MEMBERSHIP (__SO_PROTOCOL + 9)
* group. Stop receiving
* data from a given
* multicast group that come
* from a given source */
#define IP_MSFILTER (__SO_PROTOCOL + 10)
* state filtering API */
#define IP_MULTICAST_ALL (__SO_PROTOCOL + 11)
* of multicast messages bound
* to INADDR_ANY */
#define IP_PKTINFO (__SO_PROTOCOL + 12)
* the incoming packet */
#define IP_TOS (__SO_PROTOCOL + 13)
* (TOS) field */
#define IP_TTL (__SO_PROTOCOL + 14)
* of IP packets sent by the
* network stack */
#define IPV6_JOIN_GROUP (__SO_PROTOCOL + 1)
#define IPV6_LEAVE_GROUP (__SO_PROTOCOL + 2)
#define IPV6_MULTICAST_HOPS (__SO_PROTOCOL + 3)
#define IPV6_MULTICAST_IF (__SO_PROTOCOL + 4)
* outgoing multicast packets */
#define IPV6_MULTICAST_LOOP (__SO_PROTOCOL + 5)
* delivered back to the local
* application */
#define IPV6_UNICAST_HOPS (__SO_PROTOCOL + 6)
#define IPV6_V6ONLY (__SO_PROTOCOL + 7)
* to IPv6 communications only */
#define IPV6_PKTINFO (__SO_PROTOCOL + 8)
* incoming packet */
#define IPV6_RECVPKTINFO (__SO_PROTOCOL + 9)
* the incoming packet */
#define IPV6_TCLASS (__SO_PROTOCOL + 10)
* field */
#define IPV6_RECVHOPLIMIT (__SO_PROTOCOL + 11)
#define IPV6_HOPLIMIT (__SO_PROTOCOL + 12)
#define MCAST_EXCLUDE 0
#define MCAST_INCLUDE 1
* On subnets, host and network parts are found according to
* the subnet mask, not these masks.
*/
#define IN_CLASSA(a) ((((in_addr_t)(a)) & 0x80000000) == 0)
#define IN_CLASSA_NET 0xff000000
#define IN_CLASSA_NSHIFT 24
#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
#define IN_CLASSA_MAX 128
#define IN_CLASSB(a) ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
#define IN_CLASSB_NET 0xffff0000
#define IN_CLASSB_NSHIFT 16
#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
#define IN_CLASSB_MAX 65536
#define IN_CLASSC(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
#define IN_CLASSC_NET 0xffffff00
#define IN_CLASSC_NSHIFT 8
#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
#define IN_CLASSD(i) (((in_addr_t)(i) & 0xf0000000) == 0xe0000000)
#define IN_MULTICAST(i) IN_CLASSD(i)
#define INADDR_ANY ((in_addr_t)0x00000000)
* incoming messages */
#define INADDR_BROADCAST ((in_addr_t)0xffffffff)
* all hosts */
#define INADDR_NONE ((in_addr_t)0xffffffff)
* error return */
#define INADDR_LOOPBACK ((in_addr_t)0x7f000001)
#define IN6ADDR_ANY_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}}
#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}}
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
#define IN6_IS_ADDR_MULTICAST(a) \
((a)->s6_addr[0] == 0xff)
#define IN6_IS_ADDR_LINKLOCAL(a) \
(((a)->s6_addr16[0] & HTONS(0xffc0)) == HTONS(0xfe80))
#define IN6_IS_ADDR_LOOPBACK(a) \
((a)->s6_addr32[0] == 0 && \
(a)->s6_addr32[1] == 0 && \
(a)->s6_addr32[2] == 0 && \
(a)->s6_addr32[3] == HTONL(1))
#define IN6_IS_ADDR_UNSPECIFIED(a) \
((a)->s6_addr32[0] == 0 && \
(a)->s6_addr32[1] == 0 && \
(a)->s6_addr32[2] == 0 && \
(a)->s6_addr32[3] == 0)
#define IN6_IS_ADDR_GLOBAL(a) \
(!IN6_IS_ADDR_MULTICAST(a) && \
!IN6_IS_ADDR_LINKLOCAL(a) && \
!IN6_IS_ADDR_LOOPBACK(a) && \
!IN6_IS_ADDR_UNSPECIFIED(a))
#define IN6_IS_ADDR_V4COMPAT(a) \
((a)->s6_addr32[0] == 0 && \
(a)->s6_addr32[1] == 0 && \
(a)->s6_addr32[2] == 0 && \
(a)->s6_addr32[3] != 0 && \
(a)->s6_addr32[3] != NTOHL(1))
#define IN6_IS_ADDR_V4MAPPED(a) \
((a)->s6_addr32[0] == 0 && \
(a)->s6_addr32[1] == 0 && \
(a)->s6_addr32[2] == HTONL(0xffff))
#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
(IN6_IS_ADDR_MULTICAST(a) && ((a)->s6_addr[1] & 0xf) == 0x2)
#define IN6_IS_ADDR_SITELOCAL(a) \
(((a)->s6_addr16[0] & HTONS(0xffc0)) == HTONS(0xfec0))
* order to network byte order. The 16-bit version of this macro is required
* for uIP:
*/
#define HTONS htobe16
#define HTONL htobe32
#define HTONQ htobe64
#define NTOHS be16toh
#define NTOHL be32toh
#define NTOHQ be64toh
* Public Type Definitions
****************************************************************************/
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
uint8_t sin_zero[8];
};
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
struct ip_mreqn
{
struct in_addr imr_multiaddr;
struct in_addr imr_address;
unsigned int imr_ifindex;
};
struct ip_mreq_source
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
struct in_addr imr_sourceaddr;
};
struct ip_msfilter
{
struct in_addr imsf_multiaddr;
struct in_addr imsf_interface;
uint32_t imsf_fmode;
uint32_t imsf_numsrc;
struct in_addr imsf_slist[1];
};
struct in_pktinfo
{
int ipi_ifindex;
struct in_addr ipi_spec_dst;
struct in_addr ipi_addr;
};
struct in6_addr
{
union
{
uint8_t u6_addr8[16];
uint16_t u6_addr16[8];
uint32_t u6_addr32[4];
} in6_u;
};
struct sockaddr_in6
{
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
struct ipv6_mreq
{
struct in6_addr ipv6mr_multiaddr;
unsigned int ipv6mr_interface;
};
struct in6_pktinfo
{
struct in6_addr ipi6_addr;
int ipi6_ifindex;
};
struct in6_ifreq
{
struct in6_addr ifr6_addr;
uint32_t ifr6_prefixlen;
int ifr6_ifindex;
};
* Public Data
****************************************************************************/
#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
EXTERN const struct in6_addr in6addr_any;
* Public Function Prototypes
****************************************************************************/
*
* REVISIT: Since network order is defined as big-endian, the following
* functions are equivalent to functions declared in endian.h:
*
* htonl htobe32
* htons htobe16
* ntohl be32toh
* ntohs be16toh
*/
uint32_t ntohl(uint32_t nl);
uint16_t ntohs(uint16_t ns);
uint64_t ntohq(uint64_t nq);
uint32_t htonl(uint32_t hl);
uint16_t htons(uint16_t hs);
uint64_t htonq(uint64_t hq);
#undef EXTERN
#if defined(__cplusplus)
}
#endif
#endif