From 03fde89dd4f710d438c1f5be9c10bf9de06ecd00 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 4 Feb 2016 18:44:33 -0500 Subject: [PATCH] rsrv: EPICS_CAS_IGNORE_ADDR_LIST --- src/ioc/rsrv/caservertask.c | 23 +++++++++++++++++++++++ src/ioc/rsrv/cast_server.c | 13 ++++++++++++- src/ioc/rsrv/server.h | 1 + 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/ioc/rsrv/caservertask.c b/src/ioc/rsrv/caservertask.c index 1fba6a941..be548aa41 100644 --- a/src/ioc/rsrv/caservertask.c +++ b/src/ioc/rsrv/caservertask.c @@ -424,6 +424,29 @@ void rsrv_build_addr_lists(void) if (ellCount(&beaconAddrList)==0) fprintf(stderr, "Warning: RSRV has empty beacon address list\n"); + + { + osiSockAddrNode *node; + ELLLIST temp = ELLLIST_INIT, + temp2= ELLLIST_INIT; + size_t idx = 0; + + addAddrToChannelAccessAddressList ( &temp, &EPICS_CAS_IGNORE_ADDR_LIST, 0, 0 ); + removeDuplicateAddresses(&temp2, &temp, 0); + + /* Keep the list of addresses to ignore in an array on the assumption that + * it is short enough that using a hash table would be slower. + * 0.0.0.0 indicates end of list + */ + casIgnoreAddrs = callocMustSucceed(1+ellCount(&temp2), sizeof(casIgnoreAddrs[0]), "casIgnoreAddrs"); + + while((node=(osiSockAddrNode*)ellGet(&temp2))!=NULL) + { + casIgnoreAddrs[idx++] = node->addr.ia.sin_addr.s_addr; + free(node); + } + casIgnoreAddrs[idx] = 0; + } } static dbServer rsrv_server = { diff --git a/src/ioc/rsrv/cast_server.c b/src/ioc/rsrv/cast_server.c index 040455f89..4820859ac 100644 --- a/src/ioc/rsrv/cast_server.c +++ b/src/ioc/rsrv/cast_server.c @@ -176,8 +176,19 @@ void cast_server(void *pParm) sockErrBuf); epicsThreadSleep(1.0); } + + } else { + size_t idx; + for(idx=0; casIgnoreAddrs[idx]; idx++) + { + if(new_recv_addr.sin_addr.s_addr==casIgnoreAddrs[idx]) { + status = -1; /* ignore */ + break; + } + } } - else if (casudp_ctl == ctlRun) { + + if (status >= 0 && casudp_ctl == ctlRun) { client->recv.cnt = (unsigned) status; client->recv.stk = 0ul; epicsTimeGetCurrent(&client->time_at_last_recv); diff --git a/src/ioc/rsrv/server.h b/src/ioc/rsrv/server.h index 239edac95..ca9116358 100644 --- a/src/ioc/rsrv/server.h +++ b/src/ioc/rsrv/server.h @@ -177,6 +177,7 @@ GLBLTYPE ELLLIST servers; /* rsrv_iface_config::node, read-only after GLBLTYPE ELLLIST beaconAddrList; GLBLTYPE SOCKET beaconSocket; GLBLTYPE ELLLIST casIntfAddrList, casMCastAddrList; +GLBLTYPE epicsUInt32 *casIgnoreAddrs; GLBLTYPE epicsMutexId clientQlock; GLBLTYPE BUCKET *pCaBucket; /* locked by clientQlock */ GLBLTYPE void *rsrvClientFreeList;