IpAddress.h
Go to the documentation of this file.
1 /*
2  IpAddress.h - Base class that provides IP Address
3  Copyright (c) 2011 Adrian McEwen. All right reserved.
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) any later version.
9 
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public
16  License along with this library; if not, write to the Free Software
17  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19 
20 #pragma once
21 
22 #include <lwip/init.h>
23 #include <lwip/ip_addr.h>
24 #include "Printable.h"
25 #include "WString.h"
26 
27 #if LWIP_VERSION_MAJOR == 2
28 #define LWIP_IP_ADDR_T const ip_addr_t
29 #else
30 using ip_addr_t = struct ip_addr;
32 #define IP_ADDR4(IP, A, B, C, D) IP4_ADDR(IP, A, B, C, D)
33 #define ip_addr_set_ip4_u32(IP, U32) ip4_addr_set_u32(IP, U32)
34 #define ip_addr_get_ip4_u32(IP) ip4_addr_get_u32(IP)
35 #define ip_2_ip4(IP) (IP)
36 #define ip4_addr_netcmp(A, B, C) ip_addr_netcmp(A, B, C)
37 #define LWIP_IP_ADDR_T ip_addr_t
38 #endif
39 
44 class IpAddress
45 {
46 private:
47  ip_addr_t address{0};
48 
49  void fromString(const String& address);
50 
51 public:
52  // Constructors
53  IpAddress() = default;
54 
55  IpAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
56  {
57  IP_ADDR4(&address, first_octet, second_octet, third_octet, fourth_octet);
58  }
59 
60  IpAddress(uint32_t address)
61  {
62  ip_addr_set_ip4_u32(&this->address, address);
63  }
64 
65  IpAddress(ip_addr_t& addr) : address(addr)
66  {
67  }
68 
69  IpAddress(const ip_addr_t& addr) : address(addr)
70  {
71  }
72 
73 #if LWIP_VERSION_MAJOR == 2 && LWIP_IPV6
74  IpAddress(ip4_addr_t& addr)
75  {
76  ip_addr_copy_from_ip4(address, addr);
77  }
78 #endif
79 
83  IpAddress(const uint8_t address[4])
84  {
85  IP_ADDR4(&this->address, address[0], address[1], address[2], address[3]);
86  }
87 
88  IpAddress(const String& address)
89  {
90  fromString(address);
91  }
92 
93  operator uint32_t() const
94  {
95  return ip_addr_get_ip4_u32(&address);
96  }
97 
98  operator ip_addr_t() const
99  {
100  return address;
101  }
102 
103  operator ip_addr_t*()
104  {
105  return &address;
106  }
107 
108 #if LWIP_VERSION_MAJOR == 2 && LWIP_IPV6
109  operator ip4_addr_t() const
110  {
111  return *ip_2_ip4(&address);
112  }
113 
114  operator ip4_addr_t*()
115  {
116  return ip_2_ip4(&address);
117  }
118 #endif
119 
120  bool operator==(const IpAddress& otherAddress) const
121  {
122  return ip_addr_cmp(&address, &otherAddress.address);
123  }
124 
125  bool operator==(const uint8_t addr[4]) const
126  {
127  return *this == IpAddress(addr);
128  }
129 
130  bool operator!=(const IpAddress& otherAddress) const
131  {
132  return !ip_addr_cmp(&address, &otherAddress.address);
133  }
134 
135  bool operator!=(const uint8_t addr[4]) const
136  {
137  return *this != IpAddress(addr);
138  }
139 
140  bool isNull() const
141  {
142  return ip_addr_isany(&address);
143  }
144 
145  String toString() const;
146 
147  bool compare(const IpAddress& addr, const IpAddress& mask) const
148  {
149  return ip_addr_netcmp(&address, &addr.address, ip_2_ip4(&mask.address));
150  }
151 
152  // Overloaded index operator to allow getting and setting individual octets of the address
153  uint8_t operator[](int index) const
154  {
155  if(unsigned(index) >= sizeof(ip4_addr_t)) {
156  abort();
157  }
158 
159  return reinterpret_cast<const uint8_t*>(&ip_2_ip4(&address)->addr)[index];
160  }
161 
162  uint8_t& operator[](int index)
163  {
164  if(unsigned(index) >= sizeof(ip4_addr_t)) {
165  abort();
166  }
167 
168  return reinterpret_cast<uint8_t*>(&ip_2_ip4(&address)->addr)[index];
169  }
170 
171  // Overloaded copy operators to allow initialisation of IpAddress objects from other types
172  IpAddress& operator=(const uint8_t address[4])
173  {
174  IP_ADDR4(&this->address, address[0], address[1], address[2], address[3]);
175  return *this;
176  }
177 
178  IpAddress& operator=(uint32_t address)
179  {
180  ip_addr_set_ip4_u32(&this->address, address);
181  return *this;
182  }
183 
184  IpAddress& operator=(const String& address)
185  {
186  fromString(address);
187  return *this;
188  }
189 
190  size_t printTo(Print& p) const;
191 };
192 
193 inline String toString(IpAddress address)
194 {
195  return address.toString();
196 }
197 
198 // Making this extern saves 100's of bytes; each usage otherwise incurs 4 bytes of BSS
199 #define INADDR_NONE IpAddress()
ip_addr_t ip4_addr_t
Definition: IpAddress.h:31
#define ip_addr_get_ip4_u32(IP)
Definition: IpAddress.h:34
struct ip_addr ip_addr_t
Definition: IpAddress.h:30
#define ip_addr_set_ip4_u32(IP, U32)
Definition: IpAddress.h:33
String toString(IpAddress address)
Definition: IpAddress.h:193
#define IP_ADDR4(IP, A, B, C, D)
Definition: IpAddress.h:32
#define ip_2_ip4(IP)
Definition: IpAddress.h:35
bool fromString(const char *s, Uuid &uuid)
Definition: Uuid.h:147
A class to make it easier to handle and pass around IP addresses.
Definition: IpAddress.h:45
bool isNull() const
Definition: IpAddress.h:140
bool operator!=(const uint8_t addr[4]) const
Definition: IpAddress.h:135
uint8_t operator[](int index) const
Definition: IpAddress.h:153
IpAddress()=default
IpAddress & operator=(uint32_t address)
Definition: IpAddress.h:178
bool operator==(const uint8_t addr[4]) const
Definition: IpAddress.h:125
IpAddress & operator=(const uint8_t address[4])
Definition: IpAddress.h:172
uint8_t & operator[](int index)
Definition: IpAddress.h:162
IpAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
Definition: IpAddress.h:55
String toString() const
bool compare(const IpAddress &addr, const IpAddress &mask) const
Definition: IpAddress.h:147
IpAddress(uint32_t address)
Definition: IpAddress.h:60
IpAddress(ip_addr_t &addr)
Definition: IpAddress.h:65
IpAddress(const ip_addr_t &addr)
Definition: IpAddress.h:69
IpAddress(const uint8_t address[4])
Definition: IpAddress.h:83
IpAddress & operator=(const String &address)
Definition: IpAddress.h:184
bool operator!=(const IpAddress &otherAddress) const
Definition: IpAddress.h:130
size_t printTo(Print &p) const
bool operator==(const IpAddress &otherAddress) const
Definition: IpAddress.h:120
IpAddress(const String &address)
Definition: IpAddress.h:88
Provides formatted output to stream.
Definition: Print.h:37
The String class.
Definition: WString.h:133