- Notifications
You must be signed in to change notification settings - Fork 7.6k
/
Copy pathIPAddress.h
140 lines (116 loc) · 4.37 KB
/
IPAddress.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
IPAddress.h - Base class that provides IPAddress
Copyright (c) 2011 Adrian McEwen. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include<stdint.h>
#include"Printable.h"
#include"WString.h"
#include"lwip/ip_addr.h"
#include"esp_netif_ip_addr.h"
#include"sdkconfig.h"
#defineIPADDRESS_V4_BYTES_INDEX12
#defineIPADDRESS_V4_DWORD_INDEX3
// A class to make it easier to handle and pass around IP addresses
enum IPType {
IPv4,
IPv6
};
classIPAddress : publicPrintable {
private:
union {
uint8_t bytes[16];
uint32_t dword[4];
} _address;
IPType _type;
uint8_t _zone;
// Access the raw byte array containing the address. Because this returns a pointer
// to the internal structure rather than a copy of the address this function should only
// be used when you know that the usage of the returned uint8_t* will be transient and not
// stored.
uint8_t *raw_address() {
return _type == IPv4 ? &_address.bytes[IPADDRESS_V4_BYTES_INDEX] : _address.bytes;
}
public:
// Constructors
// Default IPv4
IPAddress();
IPAddress(IPType ip_type);
IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet);
IPAddress(
uint8_t o1, uint8_t o2, uint8_t o3, uint8_t o4, uint8_t o5, uint8_t o6, uint8_t o7, uint8_t o8, uint8_t o9, uint8_t o10, uint8_t o11, uint8_t o12,
uint8_t o13, uint8_t o14, uint8_t o15, uint8_t o16, uint8_t z = 0
);
// IPv4; see implementation note
IPAddress(uint32_t address);
// Default IPv4
IPAddress(constuint8_t *address);
IPAddress(IPType ip_type, constuint8_t *address, uint8_t z = 0);
// If IPv4 fails tries IPv6 see fromString function
IPAddress(constchar *address);
IPAddress(const IPAddress &address);
boolfromString(constchar *address);
boolfromString(const String &address) {
returnfromString(address.c_str());
}
// Overloaded cast operator to allow IPAddress objects to be used where a uint32_t is expected
// NOTE: IPv4 only; see implementation note
operatoruint32_t() const {
return _type == IPv4 ? _address.dword[IPADDRESS_V4_DWORD_INDEX] : 0;
};
booloperator==(const IPAddress &addr) const;
booloperator!=(const IPAddress &addr) const {
return !(*this == addr);
};
// NOTE: IPv4 only; we don't know the length of the pointer
booloperator==(constuint8_t *addr) const;
// Overloaded index operator to allow getting and setting individual octets of the address
uint8_toperator[](int index) const;
uint8_t &operator[](int index);
// Overloaded copy operators to allow initialization of IPAddress objects from other types
// NOTE: IPv4 only
IPAddress &operator=(constuint8_t *address);
// NOTE: IPv4 only; see implementation note
IPAddress &operator=(uint32_t address);
// If IPv4 fails tries IPv6 see fromString function
IPAddress &operator=(constchar *address);
IPAddress &operator=(const IPAddress &address);
virtualsize_tprintTo(Print &p) const;
String toString(bool includeZone = false) const;
IPType type() const {
return _type;
}
// Espresif LwIP conversions
IPAddress(constip_addr_t *addr);
voidto_ip_addr_t(ip_addr_t *addr) const;
IPAddress &from_ip_addr_t(constip_addr_t *addr);
#if CONFIG_LWIP_IPV6
esp_ip6_addr_type_taddr_type() const;
#endif
uint8_tzone() const {
return (type() == IPv6) ? _zone : 0;
}
size_tprintTo(Print &p, bool includeZone) const;
friendclassUDP;
friendclassClient;
friendclassServer;
friendclassEthernetClass;
friendclassDhcpClass;
friendclassDNSClient;
protected:
boolfromString4(constchar *address);
boolfromString6(constchar *address);
};
externconst IPAddress IN6ADDR_ANY;
externconst IPAddress INADDR_NONE;