udpsclient: size the TCP receive buffer from max_packet_bytes so large MARTe frames are not dropped
A TCP frame is never fragmented; a real TCPStreamer cycle (240 KB) exceeded the UDP datagram limit and made the client reconnect forever, seeing CONFIG but never DATA. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
a65f953f17
commit
39f82ade31
3 files changed
+17
-4
No files matched your search
Vendored
+9
-2
@@ -198,6 +198,7 @@ struct udps_client {
|
||||
size_t vals_cap;
|
||||
|
||||
uint8_t *rxbuf;
|
||||
size_t rxbuf_cap; /**< bytes allocated for rxbuf */
|
||||
|
||||
udps_held_t held[UDPS_REORDER_SLOTS];
|
||||
size_t held_bytes; /**< payload bytes currently held */
|
||||
@@ -1256,7 +1257,7 @@ static int read_tcp_frame(udps_client_t *c) {
|
||||
if (udps_parse_header(c->rxbuf, UDPS_HEADER_SIZE, &h) != 0) {
|
||||
return -1; /* desynchronised: the stream cannot be resynced */
|
||||
}
|
||||
if (h.payload_bytes > (uint32_t)(UDPS_RX_BUF_BYTES - UDPS_HEADER_SIZE)) {
|
||||
if (h.payload_bytes > c->rxbuf_cap - UDPS_HEADER_SIZE) {
|
||||
return -1;
|
||||
}
|
||||
if (h.payload_bytes > 0u &&
|
||||
@@ -1350,7 +1351,13 @@ udps_client_t *udps_client_create(const udps_client_config_t *cfg) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
c->rxbuf = (uint8_t *)malloc(UDPS_RX_BUF_BYTES);
|
||||
/* A UDP datagram is at most UDPS_MAX_DATAGRAM_BYTES; a TCP frame is not fragmented
|
||||
* and may be as large as max_packet_bytes (MARTe's TCPStreamer allows 1 MiB). */
|
||||
c->rxbuf_cap = UDPS_RX_BUF_BYTES;
|
||||
if (c->cfg.use_tcp && (size_t)c->cfg.max_packet_bytes + UDPS_HEADER_SIZE > c->rxbuf_cap) {
|
||||
c->rxbuf_cap = (size_t)c->cfg.max_packet_bytes + UDPS_HEADER_SIZE;
|
||||
}
|
||||
c->rxbuf = (uint8_t *)malloc(c->rxbuf_cap);
|
||||
if (c->rxbuf == NULL) {
|
||||
free(c);
|
||||
return NULL;
|
||||
|
||||
Reference in new issue
Block a user