xref: /nrf52832-nimble/rt-thread/components/net/sal_socket/include/sal_ipaddr.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2018-05-18     ChenYong     First version
9*10465441SEvalZero  */
10*10465441SEvalZero #ifndef SAL_IPADDR_H__
11*10465441SEvalZero #define SAL_IPADDR_H__
12*10465441SEvalZero 
13*10465441SEvalZero #include "sal_type.h"
14*10465441SEvalZero 
15*10465441SEvalZero #ifdef __cplusplus
16*10465441SEvalZero extern "C" {
17*10465441SEvalZero #endif
18*10465441SEvalZero 
19*10465441SEvalZero /** IPv4 only: set the IP address given as an u32_t */
20*10465441SEvalZero #define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))
21*10465441SEvalZero /** IPv4 only: get the IP address as an u32_t */
22*10465441SEvalZero #define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr)
23*10465441SEvalZero 
24*10465441SEvalZero #define IP4ADDR_STRLEN_MAX  16
25*10465441SEvalZero 
26*10465441SEvalZero /* These macros should be calculated by the preprocessor and are used
27*10465441SEvalZero    with compile-time constants only (so that there is no little-endian
28*10465441SEvalZero    overhead at runtime). */
29*10465441SEvalZero #define PP_HTONS(x) ((((x) & 0x00ffUL) << 8) | (((x) & 0xff00UL) >> 8))
30*10465441SEvalZero #define PP_NTOHS(x) PP_HTONS(x)
31*10465441SEvalZero #define PP_HTONL(x) ((((x) & 0x000000ffUL) << 24) | \
32*10465441SEvalZero                      (((x) & 0x0000ff00UL) <<  8) | \
33*10465441SEvalZero                      (((x) & 0x00ff0000UL) >>  8) | \
34*10465441SEvalZero                      (((x) & 0xff000000UL) >> 24))
35*10465441SEvalZero #define PP_NTOHL(x) PP_HTONL(x)
36*10465441SEvalZero 
37*10465441SEvalZero #define htons(x) (u16_t)PP_HTONS(x)
38*10465441SEvalZero #define ntohs(x) (u16_t)PP_NTOHS(x)
39*10465441SEvalZero #define htonl(x) (u32_t)PP_HTONL(x)
40*10465441SEvalZero #define ntohl(x) (u32_t)PP_NTOHL(x)
41*10465441SEvalZero 
42*10465441SEvalZero /* If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED
43*10465441SEvalZero    to prevent this code from redefining it. */
44*10465441SEvalZero #if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED)
45*10465441SEvalZero typedef u32_t in_addr_t;
46*10465441SEvalZero #endif
47*10465441SEvalZero 
48*10465441SEvalZero struct in_addr
49*10465441SEvalZero {
50*10465441SEvalZero     in_addr_t s_addr;
51*10465441SEvalZero };
52*10465441SEvalZero 
53*10465441SEvalZero struct in6_addr
54*10465441SEvalZero {
55*10465441SEvalZero     union
56*10465441SEvalZero     {
57*10465441SEvalZero         u32_t u32_addr[4];
58*10465441SEvalZero         u8_t u8_addr[16];
59*10465441SEvalZero     } un;
60*10465441SEvalZero #define s6_addr  un.u8_addr
61*10465441SEvalZero };
62*10465441SEvalZero 
63*10465441SEvalZero enum sal_ip_addr_type
64*10465441SEvalZero {
65*10465441SEvalZero     /** IPv4 */
66*10465441SEvalZero     IPADDR_TYPE_V4 = 0U,
67*10465441SEvalZero     /** IPv6 */
68*10465441SEvalZero     IPADDR_TYPE_V6 = 6U,
69*10465441SEvalZero     /** IPv4+IPv6 ("dual-stack") */
70*10465441SEvalZero     IPADDR_TYPE_ANY = 46U
71*10465441SEvalZero };
72*10465441SEvalZero 
73*10465441SEvalZero typedef struct ip4_addr
74*10465441SEvalZero {
75*10465441SEvalZero     u32_t addr;
76*10465441SEvalZero } ip4_addr_t;
77*10465441SEvalZero 
78*10465441SEvalZero typedef struct ip6_addr
79*10465441SEvalZero {
80*10465441SEvalZero     u32_t addr[4];
81*10465441SEvalZero } ip6_addr_t;
82*10465441SEvalZero 
83*10465441SEvalZero typedef struct _ip_addr
84*10465441SEvalZero {
85*10465441SEvalZero     union
86*10465441SEvalZero     {
87*10465441SEvalZero         ip6_addr_t ip6;
88*10465441SEvalZero         ip4_addr_t ip4;
89*10465441SEvalZero     } u_addr;
90*10465441SEvalZero     /** @ref sal_ip_addr_type */
91*10465441SEvalZero     u8_t type;
92*10465441SEvalZero } ip_addr_t;
93*10465441SEvalZero 
94*10465441SEvalZero /** 255.255.255.255 */
95*10465441SEvalZero #define IPADDR_NONE         ((u32_t)0xffffffffUL)
96*10465441SEvalZero /** 127.0.0.1 */
97*10465441SEvalZero #define IPADDR_LOOPBACK     ((u32_t)0x7f000001UL)
98*10465441SEvalZero /** 0.0.0.0 */
99*10465441SEvalZero #define IPADDR_ANY          ((u32_t)0x00000000UL)
100*10465441SEvalZero /** 255.255.255.255 */
101*10465441SEvalZero #define IPADDR_BROADCAST    ((u32_t)0xffffffffUL)
102*10465441SEvalZero 
103*10465441SEvalZero /** 255.255.255.255 */
104*10465441SEvalZero #define INADDR_NONE         IPADDR_NONE
105*10465441SEvalZero /** 127.0.0.1 */
106*10465441SEvalZero #define INADDR_LOOPBACK     IPADDR_LOOPBACK
107*10465441SEvalZero /** 0.0.0.0 */
108*10465441SEvalZero #define INADDR_ANY          IPADDR_ANY
109*10465441SEvalZero /** 255.255.255.255 */
110*10465441SEvalZero #define INADDR_BROADCAST    IPADDR_BROADCAST
111*10465441SEvalZero 
112*10465441SEvalZero #define IPADDR_BROADCAST_STRING "255.255.255.255"
113*10465441SEvalZero 
114*10465441SEvalZero in_addr_t sal_ipaddr_addr(const char *cp);
115*10465441SEvalZero int sal_ip4addr_aton(const char *cp, ip4_addr_t *addr);
116*10465441SEvalZero char *sal_ip4addr_ntoa(const ip4_addr_t *addr);
117*10465441SEvalZero char *sal_ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen);
118*10465441SEvalZero 
119*10465441SEvalZero #define inet_addr(cp) sal_ipaddr_addr(cp)
120*10465441SEvalZero #define inet_aton(cp,addr) sal_ip4addr_aton(cp,(ip4_addr_t*)addr)
121*10465441SEvalZero #define inet_ntoa(addr) sal_ip4addr_ntoa((const ip4_addr_t*)&(addr))
122*10465441SEvalZero #define inet_ntoa_r(addr, buf, buflen)  sal_ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen)
123*10465441SEvalZero 
124*10465441SEvalZero #ifdef __cplusplus
125*10465441SEvalZero }
126*10465441SEvalZero #endif
127*10465441SEvalZero 
128*10465441SEvalZero #endif /* SAL_IPADDR_H__ */
129