lwIP  2.1.0
Lightweight IP stack
IP address handling

Modules

 IPv4 only
 
 IPv6 only
 

Data Structures

struct  ip_addr
 

Macros

#define IP_IS_ANY_TYPE_VAL(ipaddr)   (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)
 
#define IPADDR_ANY_TYPE_INIT   { { { { 0ul, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_ANY }
 
#define ip_addr_copy(dest, src)
 
#define ip_addr_set(dest, src)
 
#define ip_addr_set_ipaddr(dest, src)   ip_addr_set(dest, src)
 
#define ip_addr_set_zero(ipaddr)
 
#define ip_addr_set_any(is_ipv6, ipaddr)
 
#define ip_addr_set_any_val(is_ipv6, ipaddr)
 
#define ip_addr_set_loopback(is_ipv6, ipaddr)
 
#define ip_addr_set_loopback_val(is_ipv6, ipaddr)
 
#define ip_addr_set_hton(dest, src)
 
#define ip_addr_get_network(target, host, netmask)
 
#define ip_addr_netcmp(addr1, addr2, mask)
 
#define ip_addr_cmp(addr1, addr2)
 
#define ip_addr_cmp_zoneless(addr1, addr2)
 
#define ip_addr_isany(ipaddr)
 
#define ip_addr_isany_val(ipaddr)
 
#define ip_addr_isbroadcast(ipaddr, netif)
 
#define ip_addr_ismulticast(ipaddr)
 
#define ip_addr_isloopback(ipaddr)
 
#define ip_addr_islinklocal(ipaddr)
 
#define IPADDR_STRLEN_MAX   IP6ADDR_STRLEN_MAX
 
#define ip4_2_ipv4_mapped_ipv6(ip6addr, ip4addr)
 
#define unmap_ipv4_mapped_ipv6(ip4addr, ip6addr)   (ip4addr)->addr = (ip6addr)->addr[3];
 
#define IP_ANY_TYPE   (&ip_addr_any_type)
 

Typedefs

typedef struct ip_addr ip_addr_t
 

Enumerations

enum  lwip_ip_addr_type { IPADDR_TYPE_V4 = 0U, IPADDR_TYPE_V6 = 6U, IPADDR_TYPE_ANY = 46U }
 

Functions

char * ipaddr_ntoa (const ip_addr_t *addr)
 
char * ipaddr_ntoa_r (const ip_addr_t *addr, char *buf, int buflen)
 
int ipaddr_aton (const char *cp, ip_addr_t *addr)
 

Detailed Description

Macro Definition Documentation

◆ ip4_2_ipv4_mapped_ipv6

#define ip4_2_ipv4_mapped_ipv6 (   ip6addr,
  ip4addr 
)
Value:
do { \
(ip6addr)->addr[3] = (ip4addr)->addr; \
(ip6addr)->addr[2] = PP_HTONL(0x0000FFFFUL); \
(ip6addr)->addr[1] = 0; \
(ip6addr)->addr[0] = 0; \
ip6_addr_clear_zone(ip6addr); } while(0);

◆ ip_addr_cmp

#define ip_addr_cmp (   addr1,
  addr2 
)
Value:
((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116
#define IP_IS_V6_VAL(ipaddr)
Definition: ip_addr.h:98

◆ ip_addr_cmp_zoneless

#define ip_addr_cmp_zoneless (   addr1,
  addr2 
)
Value:
((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
ip6_addr_cmp_zoneless(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116
#define IP_IS_V6_VAL(ipaddr)
Definition: ip_addr.h:98

◆ ip_addr_copy

#define ip_addr_copy (   dest,
  src 
)
Value:
do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \
ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \
ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); ip_clear_no4(&dest); }}while(0)
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116
#define IP_IS_V6_VAL(ipaddr)
Definition: ip_addr.h:98

◆ ip_addr_get_network

#define ip_addr_get_network (   target,
  host,
  netmask 
)
Value:
do{if(IP_IS_V6(host)){ \
ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \
ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); IP_SET_TYPE(target, IPADDR_TYPE_V4); }}while(0)
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
Definition: ip_addr.h:58
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
Definition: ip_addr.h:56

◆ ip_addr_isany

#define ip_addr_isany (   ipaddr)
Value:
(((ipaddr) == NULL) ? 1 : ((IP_IS_V6(ipaddr)) ? \
ip6_addr_isany(ip_2_ip6(ipaddr)) : \
ip4_addr_isany(ip_2_ip4(ipaddr))))
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_isany_val

#define ip_addr_isany_val (   ipaddr)
Value:
((IP_IS_V6_VAL(ipaddr)) ? \
ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116
#define IP_IS_V6_VAL(ipaddr)
Definition: ip_addr.h:98

◆ ip_addr_isbroadcast

#define ip_addr_isbroadcast (   ipaddr,
  netif 
)
Value:
((IP_IS_V6(ipaddr)) ? \
0 : \
ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
Definition: netif.h:260

◆ ip_addr_islinklocal

#define ip_addr_islinklocal (   ipaddr)
Value:
((IP_IS_V6(ipaddr)) ? \
ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \
ip4_addr_islinklocal(ip_2_ip4(ipaddr)))
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_isloopback

#define ip_addr_isloopback (   ipaddr)
Value:
((IP_IS_V6(ipaddr)) ? \
ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \
#define ip4_addr_isloopback(ipaddr)
Definition: ip4_addr.h:119
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_ismulticast

#define ip_addr_ismulticast (   ipaddr)
Value:
((IP_IS_V6(ipaddr)) ? \
ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \
ip4_addr_ismulticast(ip_2_ip4(ipaddr)))
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_netcmp

#define ip_addr_netcmp (   addr1,
  addr2,
  mask 
)
Value:
((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
0 : \
ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
#define ip4_addr_netcmp(addr1, addr2, mask)
Definition: ip4_addr.h:141

◆ ip_addr_set

#define ip_addr_set (   dest,
  src 
)
Value:
do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \
ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \
ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); ip_clear_no4(dest); }}while(0)
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_set_any

#define ip_addr_set_any (   is_ipv6,
  ipaddr 
)
Value:
do{if(is_ipv6){ \
ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0)
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
Definition: ip_addr.h:58
Definition: ip_addr.h:56
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_set_any_val

#define ip_addr_set_any_val (   is_ipv6,
  ipaddr 
)
Value:
do{if(is_ipv6){ \
ip6_addr_set_any(ip_2_ip6(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V6); }else{ \
ip4_addr_set_any(ip_2_ip4(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }}while(0)
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
Definition: ip_addr.h:58
Definition: ip_addr.h:56
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_set_hton

#define ip_addr_set_hton (   dest,
  src 
)
Value:
do{if(IP_IS_V6(src)){ \
ip6_addr_set_hton(ip_2_ip6(dest), ip_2_ip6(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \
ip4_addr_set_hton(ip_2_ip4(dest), ip_2_ip4(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0)
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
Definition: ip_addr.h:58
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
Definition: ip_addr.h:56
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_set_ipaddr

#define ip_addr_set_ipaddr (   dest,
  src 
)    ip_addr_set(dest, src)

◆ ip_addr_set_loopback

#define ip_addr_set_loopback (   is_ipv6,
  ipaddr 
)
Value:
do{if(is_ipv6){ \
ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0)
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
Definition: ip_addr.h:58
Definition: ip_addr.h:56
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_set_loopback_val

#define ip_addr_set_loopback_val (   is_ipv6,
  ipaddr 
)
Value:
do{if(is_ipv6){ \
ip6_addr_set_loopback(ip_2_ip6(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V6); }else{ \
ip4_addr_set_loopback(ip_2_ip4(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }}while(0)
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
Definition: ip_addr.h:58
Definition: ip_addr.h:56
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ ip_addr_set_zero

#define ip_addr_set_zero (   ipaddr)
Value:
do{ \
ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0)
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

◆ IP_ANY_TYPE

#define IP_ANY_TYPE   (&ip_addr_any_type)

◆ IP_IS_ANY_TYPE_VAL

#define IP_IS_ANY_TYPE_VAL (   ipaddr)    (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)

◆ IPADDR_ANY_TYPE_INIT

#define IPADDR_ANY_TYPE_INIT   { { { { 0ul, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_ANY }

◆ IPADDR_STRLEN_MAX

#define IPADDR_STRLEN_MAX   IP6ADDR_STRLEN_MAX

◆ unmap_ipv4_mapped_ipv6

#define unmap_ipv4_mapped_ipv6 (   ip4addr,
  ip6addr 
)    (ip4addr)->addr = (ip6addr)->addr[3];

Typedef Documentation

◆ ip_addr_t

typedef struct ip_addr ip_addr_t

A union struct for both IP version's addresses. ATTENTION: watch out for its size when adding IPv6 address scope!

Enumeration Type Documentation

◆ lwip_ip_addr_type

IP address types for use in ip_addr_t.type member.

See also
tcp_new_ip_type(), udp_new_ip_type(), raw_new_ip_type().
Enumerator
IPADDR_TYPE_V4 

IPv4

IPADDR_TYPE_V6 

IPv6

IPADDR_TYPE_ANY 

IPv4+IPv6 ("dual-stack")

Function Documentation

◆ ipaddr_aton()

int ipaddr_aton ( const char *  cp,
ip_addr_t addr 
)

Convert IP address string (both versions) to numeric. The version is auto-detected from the string.

Parameters
cpIP address string to convert
addrconversion result is stored here
Returns
1 on success, 0 on error

◆ ipaddr_ntoa()

char* ipaddr_ntoa ( const ip_addr_t addr)

Convert numeric IP address (both versions) into ASCII representation. returns ptr to static buffer; not reentrant!

Parameters
addrip address in network order to convert
Returns
pointer to a global static (!) buffer that holds the ASCII representation of addr

◆ ipaddr_ntoa_r()

char* ipaddr_ntoa_r ( const ip_addr_t addr,
char *  buf,
int  buflen 
)

Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.

Parameters
addrip address in network order to convert
buftarget buffer where the string is stored
buflenlength of buf
Returns
either pointer to buf which now holds the ASCII representation of addr or NULL if buf was too small