Trangar / artnet_protocol

A 1:1 implementation of the ArtNet protocol, in Rust
MIT License
22 stars 18 forks source link

Length field in ArtDmx packet has wrong byte order #6

Closed Firionus closed 4 years ago

Firionus commented 4 years ago

Reproduction

Reference packet

A typical ArtDMX packet sent from DMX-Workshop and captured with Wireshark:

0000   ff ff ff ff ff ff 1c 6f 65 d9 51 cf 08 00 45 00   .......oe.Q...E.
0010   02 2e 31 ea 00 00 80 11 00 00 c0 a8 01 0b c0 a8   ..1.............
0020   01 ff 19 36 19 36 02 1a 8f 8f 41 72 74 2d 4e 65   ...6.6....Art-Ne
0030   74 00 00 50 00 0e 3a 00 01 00 02 00 ff ff ff ff   t..P..:.........
0040   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0050   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0060   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0070   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0080   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0090   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00a0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00b0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00c0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00d0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00e0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00f0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0100   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0110   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0120   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0130   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0140   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0150   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0160   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0170   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0180   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0190   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01a0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01b0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01c0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01d0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01e0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01f0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0200   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0210   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0220   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0230   ff ff ff ff ff ff ff ff ff ff ff ff               ............

Here all 512 channels are set to full (ff). The length of the Data Field therefore is 512 or 0x0200. This number is also present in bytes 003a and 003b (the ones before all the ff's), high byte first. This is according to spec.

our packet

Now, let's send a packet with artnet_protocol:

[dependencies]
artnet_protocol = "0.2.0"
use artnet_protocol::*;
use std::net::*;
fn main() {
    let long_artnet_protocol_packet = ArtCommand::Output(Output {
        length: 512,
        data: vec![0xff; 512],
        ..Output::default()
    });

    let socket = UdpSocket::bind(("0.0.0.0", 6454)).unwrap();
    let broadcast_addr = ("192.168.1.255", 6454)
        .to_socket_addrs()
        .unwrap()
        .next()
        .unwrap();
    socket.set_broadcast(true).unwrap();

    let bytes = long_artnet_protocol_packet.into_buffer().unwrap();
    socket.send_to(&bytes, &broadcast_addr).unwrap();
}

Wireshark now captures this packet:

0000   ff ff ff ff ff ff 1c 6f 65 d9 51 cf 08 00 45 00   .......oe.Q...E.
0010   02 2e 33 4b 00 00 80 11 00 00 c0 a8 01 0b c0 a8   ..3K............
0020   01 ff 19 36 19 36 02 1a c7 62 41 72 74 2d 4e 65   ...6.6...bArt-Ne
0030   74 00 00 50 05 39 00 00 00 00 00 02 ff ff ff ff   t..P.9..........
0040   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0050   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0060   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0070   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0080   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0090   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00a0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00b0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00c0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00d0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00e0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00f0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0100   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0110   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0120   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0130   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0140   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0150   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0160   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0170   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0180   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0190   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01a0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01b0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01c0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01d0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01e0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01f0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0200   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0210   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0220   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0230   ff ff ff ff ff ff ff ff ff ff ff ff               ............

You can see that bytes 003a and 003b are flipped compared to the reference packet. The Wireshark Art-Net Protocol therefore interprets the DMX channels as FL FL - only 2 channels at full instead of 512.

The bytes of the length field should be flipped.

Point of failure

The error occurs here: https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/command/mod.rs#L145 but there, only extension happens. The erroneous data seems to be created in https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/command/mod.rs#L136 which again calls https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/command/mod.rs#L220 which again calls https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/macros.rs#L21-L31 where into_buffer for u16 is defined in https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/convert.rs#L113 for which the macro is defined in https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/convert.rs#L98-L102 which means that all u16's are converted as little endian.

This is right for converting from subnet to the ArtDmx fields SubUni and Net. But the length fields require big endian order.