diff --git a/libraries/ESP8266WiFi/keywords.txt b/libraries/ESP8266WiFi/keywords.txt index f64dd135c..b61a30d70 100644 --- a/libraries/ESP8266WiFi/keywords.txt +++ b/libraries/ESP8266WiFi/keywords.txt @@ -47,6 +47,7 @@ beginPacket KEYWORD2 beginPacketMulticast KEYWORD2 endPacket KEYWORD2 parsePacket KEYWORD2 +destinationIP KEYWORD2 remoteIP KEYWORD2 remotePort KEYWORD2 softAP KEYWORD2 diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.cpp b/libraries/ESP8266WiFi/src/WiFiUdp.cpp index 100bc1a60..f2328aa6b 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.cpp +++ b/libraries/ESP8266WiFi/src/WiFiUdp.cpp @@ -240,6 +240,17 @@ uint16_t WiFiUDP::remotePort() return _ctx->getRemotePort(); } +IPAddress WiFiUDP::destinationIP() +{ + IPAddress addr; + + if (!_ctx) + return addr; + + addr = _ctx->getDestAddress(); + return addr; +} + uint16_t WiFiUDP::localPort() { if (!_ctx) diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.h b/libraries/ESP8266WiFi/src/WiFiUdp.h index d06d3c194..a6bdc00da 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.h +++ b/libraries/ESP8266WiFi/src/WiFiUdp.h @@ -97,6 +97,9 @@ public: virtual IPAddress remoteIP(); // Return the port of the host who sent the current incoming packet virtual uint16_t remotePort(); + // Return the destination address for incoming packets, + // useful to distinguish multicast and ordinary packets + IPAddress destinationIP(); // Return the local port for outgoing packets uint16_t localPort(); diff --git a/libraries/ESP8266WiFi/src/include/UdpContext.h b/libraries/ESP8266WiFi/src/include/UdpContext.h index dcf585639..e244486e1 100644 --- a/libraries/ESP8266WiFi/src/include/UdpContext.h +++ b/libraries/ESP8266WiFi/src/include/UdpContext.h @@ -26,7 +26,8 @@ class UdpContext; extern "C" void esp_yield(); extern "C" void esp_schedule(); - +#define GET_IP_HDR(pb) reinterpret_cast(((uint8_t*)((pb)->payload)) - UDP_HLEN - IP_HLEN); +#define GET_UDP_HDR(pb) reinterpret_cast(((uint8_t*)((pb)->payload)) - UDP_HLEN); class UdpContext { public: @@ -122,7 +123,7 @@ public: if (!_rx_buf) return 0; - struct ip_hdr* iphdr = (struct ip_hdr*) (((uint8_t*)_rx_buf->payload) - UDP_HLEN - IP_HLEN); + ip_hdr* iphdr = GET_IP_HDR(_rx_buf); return iphdr->src.addr; } @@ -131,10 +132,16 @@ public: if (!_rx_buf) return 0; - struct udp_hdr* udphdr = (struct udp_hdr*) (((uint8_t*)_rx_buf->payload) - UDP_HLEN); + udp_hdr* udphdr = GET_UDP_HDR(_rx_buf); return ntohs(udphdr->src); } + uint32_t getDestAddress() + { + ip_hdr* iphdr = GET_IP_HDR(_rx_buf); + return iphdr->dest.addr; + } + uint16_t getLocalPort() { if (!_pcb)