//#define TRB_DEBUGGER 1
+//#define TRB3 1
/* Used by trb_register_modify and trb_nettrace */
#define TMP_DATA_SIZE (1024 * 2)
static uint16_t dataBufferTemp[32768 * 2]; // temporary buffer for multi-packet responses
// gk this fragment rewritten to support multi-packet responses
- while(1) {
+ const unsigned int udp_max_packets = 64;
+ while(pkt_nr < udp_max_packets) {
// JAM2026: moved this inside receiver loop
FD_ZERO(&fds);
FD_SET(trb3_sockfd, &fds);
- status = pselect(trb3_sockfd + 1, &fds, NULL, NULL, &tv, NULL);
+ // Use shorter timeout after first packet to avoid accumulating excessive delays
+ const struct timespec recv_timeout = { .tv_sec = 2, .tv_nsec = 0 };
+ status = pselect(trb3_sockfd + 1, &fds, NULL, NULL, pkt_nr == 0 ? &tv : &recv_timeout, NULL);
if (status == -1) {
trb_errno = TRB_TRB3_SOCKET_ERROR;
return -1;
return -1;
}
- ///////////////////////////////////////
-
-
status = recvfrom(trb3_sockfd,
(void*)dataBufferTemp,
- 65536,
- //MSG_DONTWAIT,
- MSG_WAITALL, //MSG_DONTWAIT,
+ sizeof(dataBufferTemp),
+ 0,
(struct sockaddr*)&in_addr,
&in_addr_len);
//fprintf(stderr, "trb3_udp_version %d\n", trb3_udp_version);
break;
}
- }
+ }
+
+ // Check if we hit the packet limit without receiving a terminator
+ if (pkt_nr >= udp_max_packets) {
+ if (trb_debug > 1) {
+ fprintf(stderr, "getUDPPackage: max packet count (%u) exceeded\n", udp_max_packets);
+ }
+ trb_errno = TRB_TRB3_DATA_ERROR;
+ return -1;
+ }
+
+
+///////////// JAM 30-06-26: below artefact from qwen3.6 of llmbot.gsi.de
+// return dataBufferSize * 2;
+//}
+//{
+// struct sockaddr_in in_addr;
+// socklen_t in_addr_len = sizeof(struct sockaddr_in);
+// fd_set fds; /* used by select call */
+// int status;
+// int i;
+//
+// dataBufferSize = 0;
+//
+// /* GetData */
+// if (trb_debug > 2) {
+// fprintf(stderr, "Wait UDP Data\n");
+// }
+//
+// /* Wait for data ready and Set Socket Timeout */
+//// FD_ZERO(&fds);
+//// FD_SET(trb3_sockfd, &fds);
+////
+//// status = pselect(trb3_sockfd + 1, &fds, NULL, NULL, &tv, NULL);
+//// if (status == -1) {
+//// trb_errno = TRB_TRB3_SOCKET_ERROR;
+//// return -1;
+//// }
+//// if (FD_ISSET(trb3_sockfd, &fds) == 0) {
+//// trb_errno = TRB_TRB3_SOCKET_TIMEOUT;
+//// return -1;
+//// }
+/////// JAM2026: moved down into while loop
+//
+// /* Read Data */
+//
+// uint8_t command_index_type = 2;
+// uint8_t command_index_ret;
+//
+// dataBufferSize = 0;
+//
+// uint8_t pkt_nr = 0;
+//
+// static uint16_t dataBufferTemp[32768 * 2]; // temporary buffer for multi-packet responses
+//
+//// gk this fragment rewritten to support multi-packet responses
+// const unsigned int udp_max_packets = 64;
+// while(pkt_nr < udp_max_packets) {
+//
+// // JAM2026: moved this inside receiver loop
+// FD_ZERO(&fds);
+// FD_SET(trb3_sockfd, &fds);
+//
+// status = pselect(trb3_sockfd + 1, &fds, NULL, NULL, &tv, NULL);
+// if (status == -1) {
+// trb_errno = TRB_TRB3_SOCKET_ERROR;
+// return -1;
+// }
+// if (FD_ISSET(trb3_sockfd, &fds) == 0) {
+// trb_errno = TRB_TRB3_SOCKET_TIMEOUT;
+// return -1;
+// }
+//
+// ///////////////////////////////////////
+//
+//
+//
+//
+// status = recvfrom(trb3_sockfd,
+// (void*)dataBufferTemp,
+// sizeof(dataBufferTemp),
+// 0,
+// (struct sockaddr*)&in_addr,
+// &in_addr_len);
+//
+// if (status == -1) {
+// if (trb_debug > 2)
+// fprintf(stderr, "Received %d bytes\n", status);
+// (void*)dataBufferTemp,
+// sizeof(dataBufferTemp),
+// 0,
+// (struct sockaddr*)&in_addr,
+// &in_addr_len);
+// (void*)dataBufferTemp,
+// 65536,
+// //MSG_DONTWAIT,
+// MSG_WAITALL, //MSG_DONTWAIT,
+// (struct sockaddr*)&in_addr,
+// &in_addr_len);
+//
+// if (trb_debug > 2)
+// fprintf(stderr, "Received %d bytes\n", status);
+//
+// if (status == -1) {
+// trb_errno = TRB_TRB3_SOCKET_ERROR;
+// return -1;
+// }
+//
+// if (trb_debug > 2) {
+// fprintf(stderr, "udp received: %d\n", status);
+// }
+//
+// //JAM26 debug:
+// //fprintf(stderr, "dataBufferSize %d status %d pkt_nr %d\n", dataBufferSize, status, pkt_nr);
+//
+// //for (i = 0; i < status / 2; i+= 2)
+// // for (i = 0; i < 40; i+= 2)
+// // fprintf(stdout, "%d: %04x %04x\n", i, (unsigned int) dataBufferTemp[i], (unsigned int) dataBufferTemp[i+1]);
+//
+// // workaround for minimal successive packet
+// //if (pkt_nr > 1 && status == 12) {
+// // dataBufferSize -= 1;
+// //}
+//
+//
+// /* Adjust endianess ... */
+// for (i = 0; i < (status - (pkt_nr == 0 ? 0 : 2)) / 2; i++) {
+// dataBufferR[dataBufferSize + i] = ntohs(dataBufferTemp[i + (pkt_nr == 0 ? 0 : 1)]);
+// if (trb_debug > 2) {
+// fprintf(stderr, "%d 0x%04x\n", i, dataBufferR[i]);
+// }
+// }
+//
+// dataBufferSize += status / 2 - (pkt_nr == 0 ? 0 : 1);
+
+
+// /* Check returned udp_command_index */
+// if (trb3_udp_version == 2) {
+// command_index_type = (uint8_t)(dataBufferTemp[0] & 0x00ff);
+// command_index_ret = (uint8_t)(dataBufferTemp[0] >> 8);
+//
+// //fprintf(stderr, "index_type %d index_ret %d %d\n", command_index_type, command_index_ret, udp_command_index);
+//
+// if (command_index_type != 2 && command_index_type != 3 && command_index_type != 4) {
+// if (trb_debug > 1) {
+// fprintf(stderr, "getUDPPackage: invalid command_index_type: %d\n",
+// command_index_type);
+// }
+// trb_errno = TRB_TRB3_INVALID_UDP_HEADER;
+// fprintf(stderr, "exiting because of the command type");
+// return -1;
+// }
+//
+// /*if (command_index_ret != udp_command_index) {
+// if (trb_debug > 1) {
+// fprintf(stderr,
+// "getUDPPackage: invalid : udp_command_index: "
+// "0x%02x != 0x%02x\n",
+// command_index_ret, udp_command_index);
+// }
+// trb_errno = TRB_TRB3_INVALID_UDP_HEADER;
+// return -1;
+// }*/
+//
+//
+// if (command_index_type == 2) {
+// //fprintf(stderr, "getUDPPackage: received standard packet\n");
+// break;
+// }
+// else if (command_index_type == 3) {
+// //fprintf(stderr, "getUDPPackage: received multi-packet flag\n");
+// pkt_nr++;
+// }
+// else if (command_index_type == 4) {
+// //fprintf(stderr, "getUDPPackage: received end-of-response flag\n");
+// break;
+// }
+//
+// }
+// else {
+// //fprintf(stderr, "trb3_udp_version %d\n", trb3_udp_version);
+// break;
+// }
+// }
+
+///////////// JAM 30-06-26: end artefact from qwen3.6 of llmbot.gsi.de
+
//fprintf(stdout, "Total size: %d\n", dataBufferSize);
// for (i = 0; i < dataBufferSize; i+=2)