From e5805926d0f02c26522de7c8c9c4e21ae589bd80 Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Sat, 3 Aug 2013 21:01:15 +0100 Subject: [PATCH] Added Multicast UDP support Fix #1531 --- libraries/Ethernet/src/EthernetUdp.cpp | 34 ++++++++++++++++++++++++++ libraries/Ethernet/src/EthernetUdp.h | 1 + 2 files changed, 35 insertions(+) diff --git a/libraries/Ethernet/src/EthernetUdp.cpp b/libraries/Ethernet/src/EthernetUdp.cpp index b5dcb78cc..2baee82df 100644 --- a/libraries/Ethernet/src/EthernetUdp.cpp +++ b/libraries/Ethernet/src/EthernetUdp.cpp @@ -216,3 +216,37 @@ void EthernetUDP::flush() } } +/* Start EthernetUDP socket, listening at local port PORT */ +uint8_t EthernetUDP::beginMulticast(IPAddress ip, uint16_t port) +{ + if (_sock != MAX_SOCK_NUM) + return 0; + + for (int i = 0; i < MAX_SOCK_NUM; i++) { + uint8_t s = W5100.readSnSR(i); + if (s == SnSR::CLOSED || s == SnSR::FIN_WAIT) { + _sock = i; + break; + } + } + + if (_sock == MAX_SOCK_NUM) + return 0; + + // Calculate MAC address from Multicast IP Address + byte mac[] = { 0x01, 0x00, 0x5E, 0x00, 0x00, 0x00 }; + + mac[3] = ip[1] & 0x7F; + mac[4] = ip[2]; + mac[5] = ip[3]; + + W5100.writeSnDIPR(_sock, rawIPAddress(ip)); //239.255.0.1 + W5100.writeSnDPORT(_sock, port); + W5100.writeSnDHAR(_sock,mac); + + _remaining = 0; + socket(_sock, SnMR::UDP, port, SnMR::MULTI); + return 1; +} + + diff --git a/libraries/Ethernet/src/EthernetUdp.h b/libraries/Ethernet/src/EthernetUdp.h index 8a6b7ab5a..f318e3512 100644 --- a/libraries/Ethernet/src/EthernetUdp.h +++ b/libraries/Ethernet/src/EthernetUdp.h @@ -53,6 +53,7 @@ private: public: EthernetUDP(); // Constructor virtual uint8_t begin(uint16_t); // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use + virtual uint8_t beginMulticast(IPAddress, uint16_t); // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use virtual void stop(); // Finish with the UDP socket // Sending UDP packets