diff --git a/wled00/src/dependencies/e131/ESPAsyncE131.cpp b/wled00/src/dependencies/e131/ESPAsyncE131.cpp index 937e6828ef..8961e75e8a 100644 --- a/wled00/src/dependencies/e131/ESPAsyncE131.cpp +++ b/wled00/src/dependencies/e131/ESPAsyncE131.cpp @@ -99,33 +99,37 @@ bool ESPAsyncE131::initMulticast(uint16_t port, uint16_t universe, uint8_t n) { void ESPAsyncE131::parsePacket(AsyncUDPPacket _packet) { bool error = false; - uint8_t protocol = P_E131; + uint8_t protocol = P_ARTNET; const size_t pktLen = _packet.length(); e131_packet_t *sbuff = reinterpret_cast(_packet.data()); // E1.31 packet identifier (ACN_ID = "ASC-E1.17"), need at least 16 bytes to safely read acn_id (offset 4, length 12). if (pktLen >= 16) { - if (memcmp(sbuff->acn_id, ESPAsyncE131::ACN_ID, sizeof(sbuff->acn_id))) - protocol = P_ARTNET; + if (!memcmp(sbuff->acn_id, ESPAsyncE131::ACN_ID, sizeof(sbuff->acn_id))) + protocol = P_E131; } if (protocol == P_ARTNET) { - if (memcmp(sbuff->art_id, ESPAsyncE131::ART_ID, sizeof(sbuff->art_id))) - error = true; //not "Art-Net" - if (sbuff->art_opcode != ARTNET_OPCODE_OPDMX && sbuff->art_opcode != ARTNET_OPCODE_OPPOLL) - error = true; //not a DMX or poll packet - } else { //E1.31 error handling - if (htonl(sbuff->root_vector) != ESPAsyncE131::VECTOR_ROOT) - error = true; - if (htonl(sbuff->frame_vector) != ESPAsyncE131::VECTOR_FRAME) - error = true; - if (sbuff->dmp_vector != ESPAsyncE131::VECTOR_DMP) - error = true; - if (sbuff->property_values[0] != 0) - error = true; - } - + if (pktLen < 10) { + error = true; // Need at least Art-Net ID (8) + opcode (2) + } else { + if (memcmp(sbuff->art_id, ESPAsyncE131::ART_ID, sizeof(sbuff->art_id))) + error = true; //not "Art-Net" + if (sbuff->art_opcode != ARTNET_OPCODE_OPDMX && sbuff->art_opcode != ARTNET_OPCODE_OPPOLL) + error = true; //not a DMX or poll packet + } + } else { //E1.31 error handling + if (htonl(sbuff->root_vector) != ESPAsyncE131::VECTOR_ROOT) + error = true; + if (htonl(sbuff->frame_vector) != ESPAsyncE131::VECTOR_FRAME) + error = true; + if (sbuff->dmp_vector != ESPAsyncE131::VECTOR_DMP) + error = true; + if (sbuff->property_values[0] != 0) + error = true; + } + if (error && _packet.localPort() == DDP_DEFAULT_PORT) { //DDP packet error = false; protocol = P_DDP;