#include "trberror.h"
/* Error Handling */
-#define NUM_ERRORS 39
+#define NUM_ERRORS 40
int trb_errno = TRB_NONE;
TRB_TERM trb_term = {0, 0, 0, 0};
"Pexor Device Error ioctl call, FIFO Transfer Error",
"Command is not supported by TRB3",
"TRB3 Socket Error",
- "TRB3 Socket Timeout"
+ "TRB3 Socket Timeout",
+ "TRB3 incomplete UDP Package, data > 64K"
};
if (trberrno < NUM_ERRORS) {
TRB_PEXOR_DEVICE_FIFO_TRANSFER = 35,
TRB_TRB3_CMD_NOT_SUPPORTED = 36,
TRB_TRB3_SOCKET_ERROR = 37,
- TRB_TRB3_SOCKET_TIMEOUT = 38
+ TRB_TRB3_SOCKET_TIMEOUT = 38,
+ TRB_TRB3_INCOMPLETE_UDP = 39
} TRB_ERROR;
/* last TRBNet-TermPackage */
-#ifdef PEXOR
-const char trbnet_version[] = "$Revision: 4.28 $ Local Pexor";
+#ifdef ETRAX
+const char trbnet_version[] = "$Revision: 4.29 $ Local Etrax";
+#elif defined PEXOR
+const char trbnet_version[] = "$Revision: 4.29 $ Local Pexor";
#elif defined TRB3
-const char trbnet_version[] = "$Revision: 4.28 $ Local TRB3";
+const char trbnet_version[] = "$Revision: 4.29 $ Local TRB3";
#else
-const char trbnet_version[] = "$Revision: 4.28 $ Local Etrax";
+const char trbnet_version[] = "$Revision: 4.29 $ UNKNOWN, i.e. ERROR";
#endif
#include <stdlib.h>
static int sendTrbPackage(size_t size)
{
+ unsigned int timeoutCtr = 0;
int status;
int i;
udpBuffer[i] = htons(udpBuffer[i]);
}
- if (send(trb3_sockfd, (void*)udpBuffer, size * 2, MSG_CONFIRM) == -1) {
- trb_errno = TRB_TRB3_SOCKET_ERROR;
- return -1;
- }
+ while (timeoutCtr < 3) {
+ if (trb_debug > 2) {
+ fprintf(stderr, "Send UDP request attempt #%d\n", timeoutCtr);
+ }
+ if (send(trb3_sockfd, (void*)udpBuffer, size * 2, MSG_CONFIRM) == -1) {
+ trb_errno = TRB_TRB3_SOCKET_ERROR;
+ return -1;
+ }
- /* GetData */
- status = getUDPPackage();
+ /* GetData */
+ status = getUDPPackage();
+ if (status > 0) break; /* Success */
+ if (trb_errno == TRB_TRB3_SOCKET_ERROR) break; /* UDP Error */
+
+ /* UDP Timeout, resend request */
+ timeoutCtr++;
+ }
return status;
}
tmp++;
#else
if (tmp - dataBuffer >= dataBufferSize) {
- /* Get next UDP BUffer */
- if (getUDPPackage() <= 0) {
- return -1;
- }
- tmp = dataBuffer;
+ trb_errno = TRB_TRB3_INCOMPLETE_UDP;
+ return -1;
} else {
tmp++;
}
}
/* Set Socket Timepout */
- tv.tv_sec = 10; /* 30 Secs Timeout */
- tv.tv_usec = 0; // Not init'ing this can cause strange errors
+ tv.tv_sec = 3; /* 10 Secs Timeout */
+ tv.tv_usec = 0; /* do not init this, it can cause strange errors */
setsockopt(trb3_sockfd_in, SOL_SOCKET, SO_RCVTIMEO,
(char *)&tv,sizeof(struct timeval));