lwIP 2.2.0 Lightweight IP stack

Modules | Data Structures | Macros | Typedefs | Enumerations | Functions
IP address handling
Infrastructure

## 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) ip_addr_net_eq((addr1), (addr2), (mask))
#define | ip_addr_net_eq(addr1, addr2, mask)
#define | ip_addr_cmp(addr1, addr2) ip_addr_eq((addr1), (addr2))
#define | ip_addr_eq(addr1, addr2)
#define | ip_addr_cmp_zoneless(addr1, addr2) ip_addr_zoneless_eq((addr1), (addr2))
#define | ip_addr_zoneless_eq(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
| ) |  | ip_addr_eq((addr1), (addr2))

Deprecated:
  Renamed to ip_addr_eq

## ◆ ip_addr_cmp_zoneless

#define ip_addr_cmp_zoneless | ( |  | addr1,
|  |  | addr2
| ) |  | ip_addr_zoneless_eq((addr1), (addr2))

Deprecated:
  Renamed to ip_addr_zoneless_eq

## ◆ 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)
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
ip_2_ip6
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116
IP_IS_V6_VAL
#define IP_IS_V6_VAL(ipaddr)
Definition: ip_addr.h:98

## ◆ ip_addr_eq

#define ip_addr_eq | ( |  | addr1,
|  |  | addr2
| ) |  |

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

Check if two ip addresses are equal.

## ◆ 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)
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IPADDR_TYPE_V6
Definition: ip_addr.h:58
IP_IS_V6
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
IPADDR_TYPE_V4
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))))
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IP_IS_V6
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
ip_2_ip6
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

Check if an ip address is the 'any' address.

## ◆ 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))))
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
ip_2_ip6
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116
IP_IS_V6_VAL
#define IP_IS_V6_VAL(ipaddr)
Definition: ip_addr.h:98

Check if an ip address is the 'any' address, by value.

## ◆ ip_addr_isbroadcast

#define ip_addr_isbroadcast | ( |  | ipaddr,
|  |  | netif
| ) |  |

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

Check if an ip address is a broadcast address.

## ◆ 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)))
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IP_IS_V6
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
ip_2_ip6
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

Check inf an ip address is a link-local address.

## ◆ ip_addr_isloopback

#define ip_addr_isloopback | ( |  | ipaddr | ) |

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

Check inf an ip address is a loopback address.

## ◆ 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)))
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IP_IS_V6
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
ip_2_ip6
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

Check inf an ip address is a multicast address.

## ◆ ip_addr_net_eq

#define ip_addr_net_eq | ( |  | addr1,
|  |  | addr2,
|  |  | mask
| ) |  |

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

Check if two ip addresses are share the same network, for a specific netmask.

## ◆ ip_addr_netcmp

#define ip_addr_netcmp | ( |  | addr1,
|  |  | addr2,
|  |  | mask
| ) |  | ip_addr_net_eq((addr1), (addr2), (mask))

Deprecated:
  Renamed to ip_addr_net_eq

## ◆ 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)
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IP_IS_V6
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
ip_2_ip6
#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)
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IPADDR_TYPE_V6
Definition: ip_addr.h:58
IPADDR_TYPE_V4
Definition: ip_addr.h:56
ip_2_ip6
#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)
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IPADDR_TYPE_V6
Definition: ip_addr.h:58
IPADDR_TYPE_V4
Definition: ip_addr.h:56
ip_2_ip6
#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)
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IPADDR_TYPE_V6
Definition: ip_addr.h:58
IP_IS_V6
#define IP_IS_V6(ipaddr)
Definition: ip_addr.h:102
IPADDR_TYPE_V4
Definition: ip_addr.h:56
ip_2_ip6
#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)
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IPADDR_TYPE_V6
Definition: ip_addr.h:58
IPADDR_TYPE_V4
Definition: ip_addr.h:56
ip_2_ip6
#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)
ip_2_ip4
#define ip_2_ip4(ipaddr)
Definition: ip_addr.h:120
IPADDR_TYPE_V6
Definition: ip_addr.h:58
IPADDR_TYPE_V4
Definition: ip_addr.h:56
ip_2_ip6
#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)
ip_2_ip6
#define ip_2_ip6(ipaddr)
Definition: ip_addr.h:116

## ◆ ip_addr_zoneless_eq

#define ip_addr_zoneless_eq | ( |  | addr1,
|  |  | addr2
| ) |  |

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

Check if two ip addresses are equal, ignoring the zone.

## ◆ IP_ANY_TYPE

#define IP_ANY_TYPE (&ip_addr_any_type)

Macro representing the 'any' address.

## ◆ 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

enum 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

  cp | IP address string to convert
  addr | conversion 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

  addr | ip 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

  addr | ip address in network order to convert
  buf | target buffer where the string is stored
  buflen | length of buf

Returns
  either pointer to buf which now holds the ASCII representation of addr or NULL if buf was too small