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