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
54  {
55  }
56 
57  IpAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
58  {
59  IP_ADDR4(&address, first_octet, second_octet, third_octet, fourth_octet);
60  }
61 
62  IpAddress(uint32_t address)
63  {
64  ip_addr_set_ip4_u32(&this->address, address);
65  }
66 
68  {
69  address = addr;
70  }
71 
72  IpAddress(const ip_addr_t& addr)
73  {
74  address = addr;
75  }
76 
77 #if LWIP_VERSION_MAJOR == 2 && LWIP_IPV6
78  IpAddress(ip4_addr_t& addr)
79  {
80  ip_addr_copy_from_ip4(address, addr);
81  }
82 #endif
83 
87  IpAddress(const uint8_t address[4])
88  {
89  IP_ADDR4(&this->address, address[0], address[1], address[2], address[3]);
90  }
91 
92  IpAddress(const String& address)
93  {
94  fromString(address);
95  }
96 
97  operator uint32_t() const
98  {
99  return ip_addr_get_ip4_u32(&address);
100  }
101 
102  operator ip_addr_t() const
103  {
104  return address;
105  }
106 
107  operator ip_addr_t*()
108  {
109  return &address;
110  }
111 
112 #if LWIP_VERSION_MAJOR == 2 && LWIP_IPV6
113  operator ip4_addr_t() const
114  {
115  return *ip_2_ip4(&address);
116  }
117 
118  operator ip4_addr_t*()
119  {
120  return ip_2_ip4(&address);
121  }
122 #endif
123 
124  bool operator==(const IpAddress& otherAddress) const
125  {
126  return ip_addr_cmp(&address, &otherAddress.address);
127  }
128 
129  bool operator==(const uint8_t addr[4]) const
130  {
131  return *this == IpAddress(addr);
132  }
133 
134  bool operator!=(const IpAddress& otherAddress) const
135  {
136  return !ip_addr_cmp(&address, &otherAddress.address);
137  }
138 
139  bool operator!=(const uint8_t addr[4]) const
140  {
141  return *this != IpAddress(addr);
142  }
143 
144  bool isNull() const
145  {
146  return ip_addr_isany(&address);
147  }
148 
149  String toString() const;
150 
151  bool compare(const IpAddress& addr, const IpAddress& mask) const
152  {
153  return ip_addr_netcmp(&address, &addr.address, ip_2_ip4(&mask.address));
154  }
155 
156  // Overloaded index operator to allow getting and setting individual octets of the address
157  uint8_t operator[](int index) const
158  {
159  if(unsigned(index) >= sizeof(ip4_addr_t)) {
160  abort();
161  }
162 
163  return reinterpret_cast<const uint8_t*>(&ip_2_ip4(&address)->addr)[index];
164  }
165 
166  uint8_t& operator[](int index)
167  {
168  if(unsigned(index) >= sizeof(ip4_addr_t)) {
169  abort();
170  }
171 
172  return reinterpret_cast<uint8_t*>(&ip_2_ip4(&address)->addr)[index];
173  }
174 
175  // Overloaded copy operators to allow initialisation of IpAddress objects from other types
176  IpAddress& operator=(const uint8_t address[4])
177  {
178  IP_ADDR4(&this->address, address[0], address[1], address[2], address[3]);
179  return *this;
180  }
181 
182  IpAddress& operator=(uint32_t address)
183  {
184  ip_addr_set_ip4_u32(&this->address, address);
185  return *this;
186  }
187 
188  IpAddress& operator=(const String& address)
189  {
190  fromString(address);
191  return *this;
192  }
193 
194  size_t printTo(Print& p) const;
195 };
196 
197 inline String toString(IpAddress address)
198 {
199  return address.toString();
200 }
201 
202 // Making this extern saves 100's of bytes; each usage otherwise incurs 4 bytes of BSS
203 #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:197
#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:149
A class to make it easier to handle and pass around IP addresses.
Definition: IpAddress.h:45
bool isNull() const
Definition: IpAddress.h:144
bool operator!=(const uint8_t addr[4]) const
Definition: IpAddress.h:139
uint8_t operator[](int index) const
Definition: IpAddress.h:157
IpAddress & operator=(uint32_t address)
Definition: IpAddress.h:182
bool operator==(const uint8_t addr[4]) const
Definition: IpAddress.h:129
IpAddress & operator=(const uint8_t address[4])
Definition: IpAddress.h:176
uint8_t & operator[](int index)
Definition: IpAddress.h:166
IpAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
Definition: IpAddress.h:57
String toString() const
bool compare(const IpAddress &addr, const IpAddress &mask) const
Definition: IpAddress.h:151
IpAddress(uint32_t address)
Definition: IpAddress.h:62
IpAddress(ip_addr_t &addr)
Definition: IpAddress.h:67
IpAddress(const ip_addr_t &addr)
Definition: IpAddress.h:72
IpAddress(const uint8_t address[4])
Definition: IpAddress.h:87
IpAddress & operator=(const String &address)
Definition: IpAddress.h:188
bool operator!=(const IpAddress &otherAddress) const
Definition: IpAddress.h:134
size_t printTo(Print &p) const
bool operator==(const IpAddress &otherAddress) const
Definition: IpAddress.h:124
IpAddress()
Definition: IpAddress.h:53
IpAddress(const String &address)
Definition: IpAddress.h:92
Provides formatted output to stream.
Definition: Print.h:37
The String class.
Definition: WString.h:137