diff --git a/configure/CONFIG_ENV b/configure/CONFIG_ENV index 22ace0090..39f3a05d6 100644 --- a/configure/CONFIG_ENV +++ b/configure/CONFIG_ENV @@ -38,6 +38,7 @@ EPICS_CA_MAX_ARRAY_BYTES=16384 EPICS_CA_AUTO_MAX_ARRAY_BYTES=NO EPICS_CA_BEACON_PERIOD=15.0 EPICS_CA_MAX_SEARCH_PERIOD=300.0 +EPICS_CA_MCAST_TTL=1 EPICS_CAS_BEACON_PERIOD= EPICS_CAS_BEACON_PORT= EPICS_CAS_AUTO_BEACON_ADDR_LIST="" diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index 2561f2cf4..e59b86559 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -21,6 +21,11 @@ --> +
Add option EPICS_CA_MCAST_TTL to set the Time To Live (TTL) of any IP multi-cast +CA search or beacon packets sent.
+diff --git a/src/ca/client/udpiiu.cpp b/src/ca/client/udpiiu.cpp index 8bd3b5831..33741aad0 100644 --- a/src/ca/client/udpiiu.cpp +++ b/src/ca/client/udpiiu.cpp @@ -191,6 +191,22 @@ udpiiu::udpiiu ( } #endif +#ifdef IP_MULTICAST_TTL + { + int ttl; + long val; + if(envGetLongConfigParam(&EPICS_CA_MCAST_TTL, &val)) + val =1; + ttl = val; + if ( setsockopt(this->sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { + char sockErrBuf[64]; + epicsSocketConvertErrnoToString ( + sockErrBuf, sizeof ( sockErrBuf ) ); + errlogPrintf("CAC: failed to set mcast ttl %d\n", ttl); + } + } +#endif + int boolValue = true; int status = setsockopt ( this->sock, SOL_SOCKET, SO_BROADCAST, (char *) &boolValue, sizeof ( boolValue ) ); diff --git a/src/ioc/rsrv/caservertask.c b/src/ioc/rsrv/caservertask.c index 0ca74c5b5..8beb1fae2 100644 --- a/src/ioc/rsrv/caservertask.c +++ b/src/ioc/rsrv/caservertask.c @@ -320,6 +320,22 @@ void rsrv_build_addr_lists(void) } } #endif + +#ifdef IP_MULTICAST_TTL + { + int ttl; + long val; + if(envGetLongConfigParam(&EPICS_CA_MCAST_TTL, &val)) + val =1; + ttl = val; + if ( setsockopt(beaconSocket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl))) { + char sockErrBuf[64]; + epicsSocketConvertErrnoToString ( + sockErrBuf, sizeof ( sockErrBuf ) ); + errlogPrintf("rsrv: failed to set mcast ttl %d\n", ttl); + } + } +#endif } /* populate the interface address list (default is empty) */ diff --git a/src/libCom/env/envDefs.h b/src/libCom/env/envDefs.h index 0c9002d71..2d213cc7b 100644 --- a/src/libCom/env/envDefs.h +++ b/src/libCom/env/envDefs.h @@ -51,6 +51,7 @@ epicsShareExtern const ENV_PARAM EPICS_CA_MAX_ARRAY_BYTES; epicsShareExtern const ENV_PARAM EPICS_CA_AUTO_MAX_ARRAY_BYTES; epicsShareExtern const ENV_PARAM EPICS_CA_MAX_SEARCH_PERIOD; epicsShareExtern const ENV_PARAM EPICS_CA_NAME_SERVERS; +epicsShareExtern const ENV_PARAM EPICS_CA_MCAST_TTL; epicsShareExtern const ENV_PARAM EPICS_CAS_INTF_ADDR_LIST; epicsShareExtern const ENV_PARAM EPICS_CAS_IGNORE_ADDR_LIST; epicsShareExtern const ENV_PARAM EPICS_CAS_AUTO_BEACON_ADDR_LIST;