From 3ad0bee154ec7d7dfba2e999800308722c44a020 Mon Sep 17 00:00:00 2001 From: hadaq Date: Wed, 18 Jul 2012 00:16:50 +0000 Subject: [PATCH] only one UDP PAckage can be received, i.e. 64K; Timeout set to 3s, 3 retries in case of timeout --- libtrbnet/trberror.c | 5 +++-- libtrbnet/trberror.h | 3 ++- libtrbnet/trbnet.c | 44 +++++++++++++++++++++++++++----------------- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/libtrbnet/trberror.c b/libtrbnet/trberror.c index 017b19a..0b82483 100644 --- a/libtrbnet/trberror.c +++ b/libtrbnet/trberror.c @@ -6,7 +6,7 @@ #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}; @@ -91,7 +91,8 @@ const char* trb_errorstr(int trberrno) "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) { diff --git a/libtrbnet/trberror.h b/libtrbnet/trberror.h index 1acb866..7ffb998 100644 --- a/libtrbnet/trberror.h +++ b/libtrbnet/trberror.h @@ -46,7 +46,8 @@ typedef enum { 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 */ diff --git a/libtrbnet/trbnet.c b/libtrbnet/trbnet.c index 8f6d4da..68c2eff 100644 --- a/libtrbnet/trbnet.c +++ b/libtrbnet/trbnet.c @@ -1,9 +1,11 @@ -#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 @@ -415,6 +417,7 @@ static int getUDPPackage() static int sendTrbPackage(size_t size) { + unsigned int timeoutCtr = 0; int status; int i; @@ -429,13 +432,23 @@ static int sendTrbPackage(size_t size) 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; } @@ -1276,11 +1289,8 @@ int trb_fifo_read(uint8_t channel, 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++; } @@ -1610,8 +1620,8 @@ int init_ports() } /* 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)); -- 2.43.0