From 5c2dbe7de3f10026e693f055de8b34a7b89c03dd Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Tue, 14 Sep 1999 23:26:41 +0000 Subject: [PATCH] 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. --- src/rsrv/online_notify.c | 259 +++++++++++++++++++-------------------- 1 file changed, 127 insertions(+), 132 deletions(-) diff --git a/src/rsrv/online_notify.c b/src/rsrv/online_notify.c index 2312eadac..f4593ea26 100644 --- a/src/rsrv/online_notify.c +++ b/src/rsrv/online_notify.c @@ -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 . - */ - 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(maxBlocksrcAddr.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 . + */ + 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(maxBlockdestAddr.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); + } }