Send metadata too large for UDP maximum message size into chunks.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user