From: Paul Guyot Date: Sun, 4 Jun 2017 14:15:13 +0000 (+0000) Subject: Send metadata too large for UDP maximum message size into chunks. X-Git-Tag: 3.1~10^2~55^2 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F533%2Fhead;p=thirdparty%2Fshairport-sync.git Send metadata too large for UDP maximum message size into chunks. --- diff --git a/rtsp.c b/rtsp.c index b2c08ca9..af8ada51 100644 --- a/rtsp.c +++ b/rtsp.c @@ -1083,6 +1083,44 @@ void metadata_process(uint32_t type, uint32_t code, char *data, uint32_t length) memcpy(ptr, data, length); sendto(metadata_sock, metadata_sockmsg, length + 8, 0, (struct sockaddr *)&metadata_sockaddr, sizeof(metadata_sockaddr)); + } else if (metadata_sock >= 0) { + // send metadata in numbered chunks + uint32_t chunk_ix = 0; + uint32_t chunk_total = length / (config.metadata_sockmsglength - 24); + if (chunk_total * (config.metadata_sockmsglength - 24) < length) { + chunk_total++; + } + uint32_t remaining = length; + uint32_t v; + char* data_crsr = data; + do { + char *ptr = metadata_sockmsg; + memcpy(ptr, "ssncchnk", 8); + ptr += 8; + v = htonl(chunk_ix); + memcpy(ptr, &v, 4); + ptr += 4; + v = htonl(chunk_total); + memcpy(ptr, &v, 4); + ptr += 4; + v = htonl(type); + memcpy(ptr, &v, 4); + ptr += 4; + v = htonl(code); + memcpy(ptr, &v, 4); + ptr += 4; + uint32_t datalen = remaining; + if (datalen > config.metadata_sockmsglength - 24) { + datalen = config.metadata_sockmsglength - 24; + } + memcpy(ptr, data_crsr, datalen); + data_crsr += datalen; + sendto(metadata_sock, metadata_sockmsg, datalen + 24, 0, (struct sockaddr *)&metadata_sockaddr, + sizeof(metadata_sockaddr)); + chunk_ix++; + remaining -= datalen; + if (remaining == 0) break; + } while (1); } // readers may go away and come back