Skip to content

Commit

Permalink
Merge f37b763 into 0ba95cd
Browse files Browse the repository at this point in the history
  • Loading branch information
MarkRivers authored Nov 6, 2024
2 parents 0ba95cd + f37b763 commit 8059e41
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
1 change: 1 addition & 0 deletions asyn/asynDriver/asynDriver.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ typedef struct asynManager {
asynStatus (*isEnabled)(asynUser *pasynUser,int *yesNo);
asynStatus (*isAutoConnect)(asynUser *pasynUser,int *yesNo);
asynStatus (*setAutoConnectTimeout)(double timeout);
asynStatus (*getAutoConnectTimeout)(double *timeout);
asynStatus (*waitConnect)(asynUser *pasynUser, double timeout);
/*The following are methods for interrupts*/
asynStatus (*registerInterruptSource)(const char *portName,
Expand Down
11 changes: 11 additions & 0 deletions asyn/asynDriver/asynManager.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ static asynStatus isConnected(asynUser *pasynUser,int *yesNo);
static asynStatus isEnabled(asynUser *pasynUser,int *yesNo);
static asynStatus isAutoConnect(asynUser *pasynUser,int *yesNo);
static asynStatus setAutoConnectTimeout(double timeout);
static asynStatus getAutoConnectTimeout(double *timeout);
static asynStatus waitConnect(asynUser *pasynUser, double timeout);
static asynStatus registerInterruptSource(const char *portName,
asynInterface *pasynInterface, void **pasynPvt);
Expand Down Expand Up @@ -374,6 +375,7 @@ static asynManager manager = {
isEnabled,
isAutoConnect,
setAutoConnectTimeout,
getAutoConnectTimeout,
waitConnect,
registerInterruptSource,
getInterruptPvt,
Expand Down Expand Up @@ -2376,6 +2378,15 @@ static asynStatus setAutoConnectTimeout(double timeout)
return asynSuccess;
}

static asynStatus getAutoConnectTimeout(double *timeout)
{
if(!pasynBase) asynInit();
epicsMutexMustLock(pasynBase->lock);
*timeout = pasynBase->autoConnectTimeout;
epicsMutexUnlock(pasynBase->lock);
return asynSuccess;
}

static asynStatus setQueueLockPortTimeout(asynUser *pasynUser, double timeout)
{
userPvt *puserPvt = asynUserToUserPvt(pasynUser);
Expand Down
25 changes: 25 additions & 0 deletions asyn/drvAsynSerial/drvAsynIPPort.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,12 @@
# endif
#endif

/* Linux after version 2.3.31 (2001) supports SO_SNDTIMEO for connect() calls. It uses a timeval argument.
* Windows supports SO_SNDTIMEO but it takes a DWORD argument and does not appear to apply to connect() calls. */
#if defined(linux)
# define USE_CONNECTTIMEOUT
#endif

/* If SO_REUSEPORT is not defined then use SO_REUSEADDR instead.
It is not defined on RTEMS, Windows and older Linux versions. */
#ifndef SO_REUSEPORT
Expand Down Expand Up @@ -511,6 +517,20 @@ connectIt(void *drvPvt, asynUser *pasynUser)
* problem is just that the device has DHCP'd itself an new number.
*/
if (tty->socketType != SOCK_DGRAM) {
double connectTimeout;
struct timeval saveTV, connectTV;
socklen_t svlen = sizeof saveTV;
pasynManager->getAutoConnectTimeout(&connectTimeout);
connectTV.tv_sec = (long)connectTimeout;
connectTV.tv_usec = (long)((connectTimeout - connectTV.tv_sec)*1000000);
#ifdef USE_CONNECTTIMEOUT
if (getsockopt (fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&saveTV, &svlen) < 0) {
asynPrint(pasynUser, ASYN_TRACE_ERROR, "connectIt, error calling getsockopt for SO_SNDTIMEO: %s\n", strerror(SOCKERRNO));
}
if (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&connectTV, sizeof connectTV) < 0) {
asynPrint(pasynUser, ASYN_TRACE_ERROR, "connectIt, error calling setsockopt for SO_SNDTIMEO: %s\n", strerror(SOCKERRNO));
}
#endif
if (connect(fd, &tty->farAddr.oa.sa, (int)tty->farAddrSize) < 0) {
epicsSnprintf(pasynUser->errorMessage,pasynUser->errorMessageSize,
"Can't connect to %s: %s",
Expand All @@ -520,6 +540,11 @@ connectIt(void *drvPvt, asynUser *pasynUser)
tty->flags |= FLAG_NEED_LOOKUP;
return asynError;
}
#ifdef USE_CONNECTTIMEOUT
if (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&saveTV, sizeof saveTV) < 0) {
asynPrint(pasynUser, ASYN_TRACE_ERROR, "connectIt, error calling setsockopt for SO_SNDTIMEO: %s\n", strerror(SOCKERRNO));
}
#endif
}
}
i = 1;
Expand Down

0 comments on commit 8059e41

Please sign in to comment.