From d7901fbb5834594bf1891d0188e487e9a34194cb Mon Sep 17 00:00:00 2001 From: Andreas Haschka Date: Mon, 1 Jul 2019 16:16:40 +0200 Subject: [PATCH 1/3] fix transmit.c compile error on newer gcc (memset() lacking element size) --- artnet/transmit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/artnet/transmit.c b/artnet/transmit.c index ce19b11..448158e 100644 --- a/artnet/transmit.c +++ b/artnet/transmit.c @@ -163,7 +163,7 @@ int artnet_tx_tod_data(node n, int id) { bloc = 0; while (remaining > 0) { - memset(&tod.data.toddata.tod,0x00, ARTNET_MAX_UID_COUNT); + memset(&tod.data.toddata.tod, 0x00, ARTNET_MAX_UID_COUNT * sizeof(tod.data.toddata.tod[0])); lim = min(ARTNET_MAX_UID_COUNT, remaining); tod.data.toddata.blockCount = bloc++; tod.data.toddata.uidCount = lim; From a585ea2140a9d8c488edb08c135689a0bbd812c6 Mon Sep 17 00:00:00 2001 From: Andreas Haschka Date: Mon, 1 Jul 2019 16:17:05 +0200 Subject: [PATCH 2/3] handle_firmware() fix: send word instead of byte size to callback even for special case (firmware size <= 1024 bytes) --- artnet/receive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/artnet/receive.c b/artnet/receive.c index eb87137..cdede39 100644 --- a/artnet/receive.c +++ b/artnet/receive.c @@ -582,7 +582,7 @@ int handle_firmware(node n, artnet_packet p) { n->callbacks.firmware_c.fh(n, n->firmware.ubea, n->firmware.data, - n->firmware.bytes_total, + n->firmware.bytes_total / sizeof(p->data.firmware.data[0]), n->callbacks.firmware_c.data); } else { From 4c8e16def1572b6742dd72ecd15d56b817585729 Mon Sep 17 00:00:00 2001 From: Andreas Haschka Date: Mon, 1 Jul 2019 18:08:10 +0200 Subject: [PATCH 3/3] fix firmware send and receive edge case when firmware size is exactly a multiple of maximum packet data size --- artnet/receive.c | 5 +++++ artnet/transmit.c | 11 ++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/artnet/receive.c b/artnet/receive.c index cdede39..22b203f 100644 --- a/artnet/receive.c +++ b/artnet/receive.c @@ -639,6 +639,11 @@ int handle_firmware(node n, artnet_packet p) { // length should be the remaining data block_length = n->firmware.bytes_total % (ARTNET_FIRMWARE_SIZE * sizeof(uint16_t)); + if (block_length == 0) { + // remaining firmware size matches exactly maximum data size + block_length = ARTNET_FIRMWARE_SIZE * sizeof(uint16_t); + total_blocks--; + } block_id = p->data.firmware.blockId; // ok the blockid field is only 1 byte, so it wraps back to 0x00 we diff --git a/artnet/transmit.c b/artnet/transmit.c index 448158e..00d737c 100644 --- a/artnet/transmit.c +++ b/artnet/transmit.c @@ -272,7 +272,7 @@ int artnet_tx_firmware_reply(node n, in_addr_t ip, int artnet_tx_firmware_packet(node n, firmware_transfer_t *firm) { artnet_packet_t p; uint8_t type = 0; - int data_len, max_len, ret; + int data_len, max_len, remaining, ret; memset(&p, 0x0, sizeof(p)); @@ -282,6 +282,7 @@ int artnet_tx_firmware_packet(node n, firmware_transfer_t *firm) { // calculate length data_len = firm->bytes_total - firm->bytes_current; data_len = min(data_len, max_len); + remaining = firm->bytes_total - firm->bytes_current - data_len; // work out type - 6 cases if(firm->ubea) { @@ -289,10 +290,10 @@ int artnet_tx_firmware_packet(node n, firmware_transfer_t *firm) { if (firm->bytes_current == 0) { // first type = ARTNET_FIRMWARE_UBEAFIRST; - } else if (data_len == max_len) { + } else if ((data_len == max_len) && (remaining > 0)) { // cont type = ARTNET_FIRMWARE_UBEACONT; - } else if (data_len < max_len) { + } else if ((data_len < max_len) || ((data_len == max_len) && (remaining == 0))) { // last type = ARTNET_FIRMWARE_UBEALAST; } else { @@ -304,10 +305,10 @@ int artnet_tx_firmware_packet(node n, firmware_transfer_t *firm) { if (firm->bytes_current == 0) { // first type = ARTNET_FIRMWARE_FIRMFIRST; - } else if (data_len == max_len) { + } else if ((data_len == max_len) && (remaining > 0)) { // cont type = ARTNET_FIRMWARE_FIRMCONT; - } else if (data_len < max_len) { + } else if ((data_len < max_len) || ((data_len == max_len) && (remaining == 0))) { // last type = ARTNET_FIRMWARE_FIRMLAST; } else {