In this revision I no longer include the interface's IP address inside

the beacon message because it is difficult to predict which interface
will be used ahead of time, and because any beacon redirect
servers in use can always reassign the appropriate field in the
beacon message to the effective IP address.
This commit is contained in:
Jeff Hill
1999-09-14 23:26:41 +00:00
parent e4f77f1f73
commit 5c2dbe7de3

View File

@@ -64,141 +64,136 @@ static char *sccsId = "@(#) $Id$";
/*
* RSRV_ONLINE_NOTIFY_TASK
*
*
*
*/
int rsrv_online_notify_task()
{
caAddrNode *pNode;
unsigned long delay;
unsigned long maxdelay;
long longStatus;
double maxPeriod;
caHdr msg;
struct sockaddr_in recv_addr;
int status;
int sock;
int true = TRUE;
unsigned short port;
taskwdInsert(taskIdSelf(),NULL,NULL);
longStatus = envGetDoubleConfigParam (
&EPICS_CA_BEACON_PERIOD,
&maxPeriod);
if (longStatus || maxPeriod<=0.0) {
maxPeriod = 15.0;
epicsPrintf (
"EPICS \"%s\" float fetch failed\n",
EPICS_CA_BEACON_PERIOD.name);
epicsPrintf (
"Setting \"%s\" = %f\n",
EPICS_CA_BEACON_PERIOD.name,
maxPeriod);
}
/*
* 1 tick initial delay between beacons
*/
delay = 1ul;
maxdelay = (unsigned long) maxPeriod*sysClkRateGet();
/*
* Open the socket.
* Use ARPA Internet address format and datagram socket.
* Format described in <sys/socket.h>.
*/
if((sock = socket (AF_INET, SOCK_DGRAM, 0)) == ERROR){
logMsg("CAS: online socket creation error\n",
0,
0,
0,
0,
0,
0);
abort();
}
status = setsockopt( sock,
SOL_SOCKET,
SO_BROADCAST,
(char *)&true,
sizeof(true));
if(status<0){
abort();
}
bfill((char *)&recv_addr, sizeof recv_addr, 0);
recv_addr.sin_family = AF_INET;
recv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* let slib pick lcl addr */
recv_addr.sin_port = htons(0); /* let slib pick port */
status = bind(sock, (struct sockaddr *)&recv_addr, sizeof recv_addr);
if(status<0)
abort();
bfill((char *)&msg, sizeof msg, 0);
msg.m_cmmd = htons (CA_PROTO_RSRV_IS_UP);
msg.m_count = htons (ca_server_port);
ellInit(&beaconAddrList);
/*
* load user and auto configured
* broadcast address list
*/
port = caFetchPortConfig(&EPICS_CA_REPEATER_PORT, CA_REPEATER_PORT);
caSetupBCastAddrList (&beaconAddrList, sock, port);
# ifdef DEBUG
caPrintAddrList(&beaconAddrList);
# endif
while(TRUE){
int maxBlock;
/*
* check max block and disable new channels
* if its to small
*/
maxBlock = memFindMax();
if(maxBlock<MAX_BLOCK_THRESHOLD){
casBelowMaxBlockThresh = TRUE;
}
else{
casBelowMaxBlockThresh = FALSE;
}
pNode = (caAddrNode *) beaconAddrList.node.next;
while(pNode){
msg.m_available =
pNode->srcAddr.in.sin_addr.s_addr;
status = sendto(
sock,
(char *)&msg,
sizeof(msg),
0,
&pNode->destAddr.sa,
sizeof(pNode->destAddr.sa));
if(status < 0){
logMsg( "%s: CA beacon error was \"%s\"\n",
(int) __FILE__,
(int) strerror(errnoGet()),
0,
0,
0,
0);
}
else{
assert(status == sizeof(msg));
}
pNode = (caAddrNode *)pNode->node.next;
}
taskDelay(delay);
delay = min(delay << 1, maxdelay);
}
caAddrNode *pNode;
unsigned long delay;
unsigned long maxdelay;
long longStatus;
double maxPeriod;
caHdr msg;
struct sockaddr_in recv_addr;
int status;
int sock;
int true = TRUE;
unsigned short port;
taskwdInsert(taskIdSelf(),NULL,NULL);
longStatus = envGetDoubleConfigParam (
&EPICS_CA_BEACON_PERIOD,
&maxPeriod);
if (longStatus || maxPeriod<=0.0) {
maxPeriod = 15.0;
epicsPrintf (
"EPICS \"%s\" float fetch failed\n",
EPICS_CA_BEACON_PERIOD.name);
epicsPrintf (
"Setting \"%s\" = %f\n",
EPICS_CA_BEACON_PERIOD.name,
maxPeriod);
}
/*
* 1 tick initial delay between beacons
*/
delay = 1ul;
maxdelay = (unsigned long) maxPeriod*sysClkRateGet();
/*
* Open the socket.
* Use ARPA Internet address format and datagram socket.
* Format described in <sys/socket.h>.
*/
if((sock = socket (AF_INET, SOCK_DGRAM, 0)) == ERROR){
logMsg("CAS: online socket creation error\n",
0,
0,
0,
0,
0,
0);
abort();
}
status = setsockopt( sock,
SOL_SOCKET,
SO_BROADCAST,
(char *)&true,
sizeof(true));
if(status<0){
abort();
}
bfill((char *)&recv_addr, sizeof recv_addr, 0);
recv_addr.sin_family = AF_INET;
recv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* let slib pick lcl addr */
recv_addr.sin_port = htons(0); /* let slib pick port */
status = bind(sock, (struct sockaddr *)&recv_addr, sizeof recv_addr);
if(status<0)
abort();
bfill((char *)&msg, sizeof msg, 0);
msg.m_cmmd = htons (CA_PROTO_RSRV_IS_UP);
msg.m_count = htons (ca_server_port);
msg.m_available = htonl (INADDR_ANY);
ellInit(&beaconAddrList);
/*
* load user and auto configured
* broadcast address list
*/
port = caFetchPortConfig(&EPICS_CA_REPEATER_PORT, CA_REPEATER_PORT);
caSetupBCastAddrList (&beaconAddrList, sock, port);
# ifdef DEBUG
caPrintAddrList(&beaconAddrList);
# endif
while(TRUE){
int maxBlock;
/*
* check max block and disable new channels
* if its to small
*/
maxBlock = memFindMax();
if(maxBlock<MAX_BLOCK_THRESHOLD){
casBelowMaxBlockThresh = TRUE;
}
else{
casBelowMaxBlockThresh = FALSE;
}
pNode = (caAddrNode *) beaconAddrList.node.next;
while(pNode){
status = sendto(
sock,
(char *)&msg,
sizeof(msg),
0,
&pNode->destAddr.sa,
sizeof(pNode->destAddr.sa));
if(status < 0){
logMsg( "%s: CA beacon error was \"%s\"\n",
(int) __FILE__,
(int) strerror(errnoGet()),
0,
0,
0,
0);
}
else{
assert(status == sizeof(msg));
}
pNode = (caAddrNode *)pNode->node.next;
}
taskDelay(delay);
delay = min(delay << 1, maxdelay);
}
}