Skip to content

Commit cf31166

Browse files
committed
Add IPv6 support to WiFiServer
One of most useful features of IPv6 to have arduino accessible from internet, without any port forward and etc. Change is fairly trivial and backward compatible with old code, tested with WiFiTelnetToSerial and AsyncUDPServer. Signed-off-by: Denys Fedoryshchenko <[email protected]>
1 parent c36cc3b commit cf31166

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

libraries/WiFi/src/WiFiServer.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ WiFiClient WiFiServer::available(){
4747
_accepted_sockfd = -1;
4848
}
4949
else {
50-
struct sockaddr_in _client;
51-
int cs = sizeof(struct sockaddr_in);
50+
struct sockaddr_in6 _client;
51+
int cs = sizeof(struct sockaddr_in6);
5252
#ifdef ESP_IDF_VERSION_MAJOR
5353
client_sock = lwip_accept(sockfd, (struct sockaddr *)&_client, (socklen_t*)&cs);
5454
#else
@@ -76,14 +76,23 @@ void WiFiServer::begin(uint16_t port, int enable){
7676
if(port){
7777
_port = port;
7878
}
79-
struct sockaddr_in server;
80-
sockfd = socket(AF_INET , SOCK_STREAM, 0);
79+
struct sockaddr_in6 server;
80+
sockfd = socket(AF_INET6 , SOCK_STREAM, 0);
8181
if (sockfd < 0)
8282
return;
8383
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
84-
server.sin_family = AF_INET;
85-
server.sin_addr.s_addr = _addr;
86-
server.sin_port = htons(_port);
84+
server.sin6_family = AF_INET6;
85+
if (_addr.type() == IPv4) {
86+
log_e("---------------- IPv4");
87+
memcpy(server.sin6_addr.s6_addr+11, (uint8_t*)&_addr[0], 4);
88+
server.sin6_addr.s6_addr[10] = 0xFF;
89+
server.sin6_addr.s6_addr[11] = 0xFF;
90+
} else {
91+
log_e("---------------- IPv6");
92+
memcpy(server.sin6_addr.s6_addr, (uint8_t*)&_addr[0], 16);
93+
}
94+
memset(server.sin6_addr.s6_addr, 0x0, 16);
95+
server.sin6_port = htons(_port);
8796
if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0)
8897
return;
8998
if(listen(sockfd , _max_clients) < 0)
@@ -106,8 +115,8 @@ bool WiFiServer::hasClient() {
106115
if (_accepted_sockfd >= 0) {
107116
return true;
108117
}
109-
struct sockaddr_in _client;
110-
int cs = sizeof(struct sockaddr_in);
118+
struct sockaddr_in6 _client;
119+
int cs = sizeof(struct sockaddr_in6);
111120
#ifdef ESP_IDF_VERSION_MAJOR
112121
_accepted_sockfd = lwip_accept(sockfd, (struct sockaddr *)&_client, (socklen_t*)&cs);
113122
#else

libraries/WiFi/src/WiFiServer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ class WiFiServer : public Server {
3737
public:
3838
void listenOnLocalhost(){}
3939

40-
// _addr(INADDR_ANY) is the same as _addr() ==> 0.0.0.0
4140
WiFiServer(uint16_t port=80, uint8_t max_clients=4):sockfd(-1),_accepted_sockfd(-1),_addr(),_port(port),_max_clients(max_clients),_listening(false),_noDelay(false) {
4241
log_v("WiFiServer::WiFiServer(port=%d, ...)", port);
4342
}

0 commit comments

Comments
 (0)