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); + } }