fix(sacn): Multicast kam nie an - htonl() zerriss die Gruppenadresse
Die Lampe trat seit jeher der falschen Gruppe bei. Aus Universe 1 wurde 239.255.239.255 statt 239.255.0.1, und damit lauschte sie auf einer Adresse, auf die niemand sendet: Multicast kam nie an, Unicast lief, und der Beitritt meldete trotzdem Erfolg - er gelang ja, nur eben fuer die falsche Gruppe. Ursache ist ein nicht geklammertes Makro im SDK: #define htonl(n) (((n & 0xff) << 24) | ((n & 0xff00) << 8) | ...) Stand die Adressrechnung direkt im Aufruf, traf die Maske nach der Textersetzung nur den letzten Term, weil & staerker bindet als |. Nachgerechnet ergibt das fuer Universe 1 exakt die 0xefffefff, die am EVK auf der seriellen Konsole stand. Die Rechnung liegt jetzt in nl_e131_group_addr() - im reinen, host-testbaren Teil, mit Testfaellen fuer beide Byte-Haelften. Der Aufrufer reicht eine Variable an htonl(), keinen Ausdruck mehr. Gefunden am EVK ueber die serielle Konsole, nachdem vier Netz-Konfigurationen und fuenf andere Theorien nichts ergeben hatten.
This commit is contained in:
@@ -23,4 +23,10 @@ typedef struct {
|
||||
* `out` wird nur bei true beschrieben. */
|
||||
bool nl_e131_parse(const uint8_t *buf, size_t len, nl_e131_packet_t *out);
|
||||
|
||||
/* Die Multicast-Gruppe eines Universe nach E1.31 Anhang A: 239.255.<hi>.<lo>, als Zahl in
|
||||
* HOST-Byte-Reihenfolge. Steht hier und nicht im Empfangs-Task, damit sie im Host-Test
|
||||
* nachgerechnet werden kann - der Wert war schon einmal falsch, und man sieht es einer
|
||||
* Lampe nicht an: sie tritt dann sauber einer Gruppe bei, auf die niemand sendet. */
|
||||
uint32_t nl_e131_group_addr(uint16_t universe);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user