added beacon anomaly flag init/allow ip 255.255.255.255
This commit is contained in:
@@ -80,7 +80,7 @@ int cac_select_io(struct timeval *ptimeout, int flags)
|
||||
continue;
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
/* Under WIN32, FD_SETSIZE is the number of sockets,
|
||||
* not the max. file descriptor value that you may select() !
|
||||
*
|
||||
@@ -151,16 +151,11 @@ int cac_select_io(struct timeval *ptimeout, int flags)
|
||||
status = 0;
|
||||
}
|
||||
else {
|
||||
# if defined(__hpux)
|
||||
# define HPCAST (int *)
|
||||
# else
|
||||
# define HPCAST
|
||||
# endif
|
||||
status = select(
|
||||
maxfd+1,
|
||||
HPCAST &pfdi->readMask,
|
||||
HPCAST &pfdi->writeMask,
|
||||
HPCAST NULL,
|
||||
&pfdi->readMask,
|
||||
&pfdi->writeMask,
|
||||
NULL,
|
||||
&autoTimeOut);
|
||||
if (status<0) {
|
||||
int errnoCpy = SOCKERRNO;
|
||||
|
||||
@@ -113,6 +113,7 @@ static char *sccsId = "@(#) $Id$";
|
||||
#define CA_GLBLSOURCE
|
||||
#include "iocinf.h"
|
||||
#include "net_convert.h"
|
||||
#include "ipAddrToA.h"
|
||||
|
||||
LOCAL void tcp_recv_msg(struct ioc_in_use *piiu);
|
||||
LOCAL void cac_connect_iiu(struct ioc_in_use *piiu);
|
||||
@@ -226,6 +227,7 @@ int net_proto
|
||||
piiu->claimsPending = FALSE;
|
||||
piiu->recvPending = FALSE;
|
||||
piiu->pushPending = FALSE;
|
||||
piiu->beaconAnomaly = FALSE;
|
||||
|
||||
switch(piiu->sock_proto)
|
||||
{
|
||||
@@ -506,9 +508,7 @@ int net_proto
|
||||
|
||||
|
||||
if (fd_register_func) {
|
||||
LOCKEVENTS;
|
||||
(*fd_register_func)((void *)fd_register_arg, sock, TRUE);
|
||||
UNLOCKEVENTS;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -647,7 +647,7 @@ LOCAL void cac_connect_iiu (struct ioc_in_use *piiu)
|
||||
/*
|
||||
* caSetupBCastAddrList()
|
||||
*/
|
||||
void caSetupBCastAddrList (ELLLIST *pList, SOCKET sock, unsigned port)
|
||||
void caSetupBCastAddrList (ELLLIST *pList, SOCKET sock, unsigned short port)
|
||||
{
|
||||
char *pstr;
|
||||
char yesno[32u];
|
||||
@@ -1325,12 +1325,9 @@ LOCAL void ca_process_udp(struct ioc_in_use *piiu)
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* CLOSE_IOC()
|
||||
*
|
||||
* set an iiu in the disconnected state
|
||||
*
|
||||
*
|
||||
*/
|
||||
LOCAL void close_ioc (IIU *piiu)
|
||||
{
|
||||
@@ -1364,7 +1361,7 @@ LOCAL void close_ioc (IIU *piiu)
|
||||
chanDisconnectCount = ellCount(&piiu->chidlist);
|
||||
|
||||
/*
|
||||
* remove IOC from the hash table
|
||||
* remove IOC from the beacon hash table
|
||||
*/
|
||||
pNode = (caAddrNode *) piiu->destAddr.node.next;
|
||||
assert (pNode);
|
||||
@@ -1391,9 +1388,7 @@ LOCAL void close_ioc (IIU *piiu)
|
||||
}
|
||||
|
||||
if (fd_register_func) {
|
||||
LOCKEVENTS;
|
||||
(*fd_register_func) ((void *)fd_register_arg, piiu->sock_chan, FALSE);
|
||||
UNLOCKEVENTS;
|
||||
}
|
||||
|
||||
status = socket_close (piiu->sock_chan);
|
||||
@@ -1424,10 +1419,10 @@ LOCAL void close_ioc (IIU *piiu)
|
||||
|
||||
/*
|
||||
* cacDisconnectChannel()
|
||||
* (LOCK must be applied when calling this routine)
|
||||
*/
|
||||
void cacDisconnectChannel(ciu chix, enum channel_state state)
|
||||
{
|
||||
LOCK;
|
||||
|
||||
chix->type = TYPENOTCONN;
|
||||
chix->count = 0u;
|
||||
@@ -1453,7 +1448,6 @@ void cacDisconnectChannel(ciu chix, enum channel_state state)
|
||||
caIOBlockListFree (&pend_write_list, chix,
|
||||
TRUE, ECA_DISCONN);
|
||||
|
||||
LOCKEVENTS;
|
||||
if (chix->pConnFunc) {
|
||||
struct connection_handler_args args;
|
||||
|
||||
@@ -1468,7 +1462,6 @@ void cacDisconnectChannel(ciu chix, enum channel_state state)
|
||||
args.ar = chix->ar;
|
||||
(*chix->pAccessRightsFunc) (args);
|
||||
}
|
||||
UNLOCKEVENTS;
|
||||
}
|
||||
removeFromChanList(chix);
|
||||
/*
|
||||
@@ -1477,6 +1470,7 @@ void cacDisconnectChannel(ciu chix, enum channel_state state)
|
||||
assert (piiuCast);
|
||||
addToChanList(chix, piiuCast);
|
||||
cacSetRetryInterval(0u);
|
||||
UNLOCK;
|
||||
}
|
||||
|
||||
|
||||
@@ -1762,20 +1756,20 @@ char *localHostName()
|
||||
* caAddConfiguredAddr()
|
||||
*/
|
||||
void caAddConfiguredAddr(ELLLIST *pList, const ENV_PARAM *pEnv,
|
||||
SOCKET socket, int port)
|
||||
SOCKET socket, unsigned short port)
|
||||
{
|
||||
caAddrNode *pNode;
|
||||
const char *pStr;
|
||||
const char *pToken;
|
||||
caAddr addr;
|
||||
caAddr localAddr;
|
||||
char buf[32u]; /* large enough to hold an IP address */
|
||||
int status;
|
||||
caAddrNode *pNode;
|
||||
const char *pStr;
|
||||
const char *pToken;
|
||||
caAddr addr;
|
||||
caAddr localAddr;
|
||||
char buf[32u]; /* large enough to hold an IP address */
|
||||
int status;
|
||||
|
||||
pStr = envGetConfigParamPtr(pEnv);
|
||||
if(!pStr){
|
||||
return;
|
||||
}
|
||||
pStr = envGetConfigParamPtr(pEnv);
|
||||
if(!pStr){
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* obtain a local address
|
||||
@@ -1785,29 +1779,25 @@ void caAddConfiguredAddr(ELLLIST *pList, const ENV_PARAM *pEnv,
|
||||
return;
|
||||
}
|
||||
|
||||
while( (pToken = getToken(&pStr, buf, sizeof(buf))) ){
|
||||
memset((char *)&addr,0,sizeof(addr));
|
||||
addr.in.sin_family = AF_INET;
|
||||
addr.in.sin_port = htons(port);
|
||||
addr.in.sin_addr.s_addr = inet_addr(pToken);
|
||||
if (addr.in.sin_addr.s_addr == ~0ul) {
|
||||
ca_printf(
|
||||
"%s: Parsing '%s'\n",
|
||||
__FILE__,
|
||||
pEnv->name);
|
||||
ca_printf(
|
||||
"\tBad internet address format: '%s'\n",
|
||||
pToken);
|
||||
while( (pToken = getToken(&pStr, buf, sizeof(buf))) ){
|
||||
status = aToIPAddr(pToken, port, &addr.in);
|
||||
if (status<0) {
|
||||
ca_printf(
|
||||
"%s: Parsing '%s'\n",
|
||||
__FILE__,
|
||||
pEnv->name);
|
||||
ca_printf(
|
||||
"\tBad internet address format: '%s'\n",
|
||||
pToken);
|
||||
continue;
|
||||
}
|
||||
|
||||
pNode = (caAddrNode *) calloc(1,sizeof(*pNode));
|
||||
if(pNode){
|
||||
pNode->destAddr.in = addr.in;
|
||||
pNode->srcAddr.in = localAddr.in;
|
||||
ellAdd(pList, &pNode->node);
|
||||
}
|
||||
}
|
||||
pNode = (caAddrNode *) calloc(1,sizeof(*pNode));
|
||||
if(pNode){
|
||||
pNode->destAddr.in = addr.in;
|
||||
pNode->srcAddr.in = localAddr.in;
|
||||
ellAdd(pList, &pNode->node);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -276,10 +276,8 @@ typedef struct timeval ca_time;
|
||||
/*
|
||||
* these control the duration and period of name resolution
|
||||
* broadcasts
|
||||
*
|
||||
* MAXCONNTRIES must be less than the number of bits in type long
|
||||
*/
|
||||
#define MAXCONNTRIES 30 /* N conn retries on unchanged net */
|
||||
#define MAXCONNTRIES 100 /* N conn retries on unchanged net */
|
||||
|
||||
/*
|
||||
* A prime number works best here (see comment in retrySearchRequest()
|
||||
@@ -384,13 +382,12 @@ typedef struct caclient_put_notify{
|
||||
#define nextFastBucketId (ca_static->ca_nextFastBucketId)
|
||||
|
||||
#if defined(vxWorks)
|
||||
# define io_done_sem (ca_static->ca_io_done_sem)
|
||||
# define io_done_sem (ca_static->ca_io_done_sem)
|
||||
# define evuser (ca_static->ca_evuser)
|
||||
# define client_lock (ca_static->ca_client_lock)
|
||||
# define event_lock (ca_static->ca_event_lock)
|
||||
# define local_chidlist (ca_static->ca_local_chidlist)
|
||||
# define lcl_buff_list (ca_static->ca_lcl_buff_list)
|
||||
# define event_tid (ca_static->ca_event_tid)
|
||||
# define lock_tid (ca_static->ca_lock_tid)
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -482,6 +479,7 @@ typedef struct ioc_in_use{
|
||||
unsigned claimsPending:1;
|
||||
unsigned recvPending:1;
|
||||
unsigned pushPending:1;
|
||||
unsigned beaconAnomaly:1;
|
||||
}IIU;
|
||||
|
||||
/*
|
||||
@@ -517,11 +515,11 @@ struct CA_STATIC {
|
||||
ELLLIST fdInfoFreeList;
|
||||
ELLLIST fdInfoList;
|
||||
ca_time currentTime;
|
||||
ca_time programBeginTime;
|
||||
ca_time ca_conn_next_retry;
|
||||
ca_time ca_conn_retry_delay;
|
||||
ca_time ca_last_repeater_try;
|
||||
ca_real ca_connectTMO;
|
||||
ca_time programBeginTime;
|
||||
IIU *ca_piiuCast;
|
||||
void (*ca_exception_func)
|
||||
(struct exception_handler_args);
|
||||
@@ -563,7 +561,6 @@ struct CA_STATIC {
|
||||
SEM_ID ca_io_done_sem;
|
||||
SEM_ID ca_blockSem;
|
||||
SEM_ID ca_client_lock;
|
||||
SEM_ID ca_event_lock; /* dont allow events to preempt */
|
||||
SEM_ID ca_putNotifyLock;
|
||||
ELLLIST ca_local_chidlist;
|
||||
ELLLIST ca_lcl_buff_list;
|
||||
@@ -571,7 +568,7 @@ struct CA_STATIC {
|
||||
ELLLIST ca_taskVarList;
|
||||
void *ca_evuser;
|
||||
void *ca_dbMonixFreeList;
|
||||
int ca_event_tid;
|
||||
int ca_lock_tid;
|
||||
int ca_tid;
|
||||
int recv_tid;
|
||||
#endif
|
||||
@@ -697,7 +694,7 @@ const struct sockaddr_in *pina, /* only used by TCP connections */
|
||||
int net_proto
|
||||
);
|
||||
|
||||
void caSetupBCastAddrList (ELLLIST *pList, SOCKET sock, unsigned port);
|
||||
void caSetupBCastAddrList (ELLLIST *pList, SOCKET sock, unsigned short port);
|
||||
|
||||
int ca_os_independent_init (void);
|
||||
|
||||
@@ -732,7 +729,7 @@ void genLocalExcepWFL(long stat, char *ctx,
|
||||
char *pFile, unsigned line);
|
||||
#define genLocalExcep(STAT, PCTX) \
|
||||
genLocalExcepWFL (STAT, PCTX, __FILE__, __LINE__)
|
||||
void cac_reconnect_channel(ciu chan);
|
||||
void cac_reconnect_channel(caResId id);
|
||||
void retryPendingClaims(IIU *piiu);
|
||||
void cacSetRetryInterval(unsigned retryNo);
|
||||
void addToChanList(ciu chan, IIU *piiu);
|
||||
|
||||
@@ -41,7 +41,7 @@ extern "C" {
|
||||
#if defined(VAX)
|
||||
# define CA_FLOAT_MIT
|
||||
# define CA_LITTLE_ENDIAN
|
||||
#elif defined(_X86_)
|
||||
#elif defined(_M_IX86)
|
||||
# define CA_FLOAT_IEEE
|
||||
# define CA_LITTLE_ENDIAN
|
||||
#elif (defined(__ALPHA) && defined(VMS) || defined(__alpha)) && defined(VMS)
|
||||
|
||||
@@ -38,7 +38,7 @@ static char *sccsId = "@(#) $Id$";
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
# include <windows.h>
|
||||
#else
|
||||
# include <sys/types.h>
|
||||
|
||||
@@ -66,35 +66,28 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# define CA_OS_CONFIGURED
|
||||
#endif /*VMS*/
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
# define CA_OS_CONFIGURED
|
||||
#endif /*WIN32*/
|
||||
#endif /*_WIN32*/
|
||||
|
||||
#ifndef CA_OS_CONFIGURED
|
||||
#error Please define one of vxWorks, UNIX, VMS, or WIN32
|
||||
#error Please define one of vxWorks, UNIX, VMS, or _WIN32
|
||||
#endif
|
||||
|
||||
#if defined(vxWorks)
|
||||
# define POST_IO_EV semGive(io_done_sem)
|
||||
# define VXTASKIDNONE 0
|
||||
# define LOCK semTake(client_lock, WAIT_FOREVER);
|
||||
# define UNLOCK semGive(client_lock);
|
||||
# define LOCKEVENTS \
|
||||
{semTake(event_lock, WAIT_FOREVER); event_tid=(int)taskIdCurrent;}
|
||||
# define UNLOCKEVENTS \
|
||||
{event_tid=VXTASKIDNONE; semGive(event_lock);}
|
||||
# define EVENTLOCKTEST \
|
||||
(((int)taskIdCurrent)==event_tid || ca_static->recv_tid == (int)taskIdCurrent)
|
||||
# define VXTHISTASKID taskIdSelf()
|
||||
# define abort() taskSuspend(VXTHISTASKID)
|
||||
# define VXTASKIDNONE 0
|
||||
# define LOCK {semTake(client_lock, WAIT_FOREVER); lock_tid=(int)taskIdCurrent;}
|
||||
# define UNLOCK {lock_tid=VXTASKIDNONE; semGive(client_lock);}
|
||||
# define EVENTLOCKTEST (lock_tid==(int)taskIdCurrent)
|
||||
# define VXTHISTASKID taskIdSelf()
|
||||
# define abort() taskSuspend(VXTHISTASKID)
|
||||
#endif
|
||||
|
||||
#if defined(UNIX)
|
||||
# define POST_IO_EV
|
||||
# define LOCK
|
||||
# define UNLOCK
|
||||
# define LOCKEVENTS
|
||||
# define UNLOCKEVENTS
|
||||
# define EVENTLOCKTEST (post_msg_active)
|
||||
#endif
|
||||
|
||||
@@ -102,19 +95,15 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# define POST_IO_EV
|
||||
# define LOCK
|
||||
# define UNLOCK
|
||||
# define LOCKEVENTS
|
||||
# define UNLOCKEVENTS
|
||||
# define EVENTLOCKTEST (post_msg_active)
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef _WIN32
|
||||
# define POST_IO_EV
|
||||
# define LOCK
|
||||
# define UNLOCK
|
||||
# define LOCKEVENTS
|
||||
# define UNLOCKEVENTS
|
||||
# define EVENTLOCKTEST (post_msg_active)
|
||||
#endif /*WIN32*/
|
||||
#endif /*_WIN32*/
|
||||
|
||||
#endif /* INCos_depenh */
|
||||
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* $Log$
|
||||
* Revision 1.22 1997/06/13 09:14:23 jhill
|
||||
* connect/search proto changes
|
||||
*
|
||||
* Revision 1.21 1997/04/10 19:26:17 jhill
|
||||
* asynch connect, faster connect, ...
|
||||
*
|
||||
@@ -162,8 +165,15 @@ char *localUserName()
|
||||
|
||||
pName = getlogin();
|
||||
if(!pName){
|
||||
pName = getpwuid(getuid())->pw_name;
|
||||
if(!pName){
|
||||
struct passwd *p;
|
||||
p = getpwuid(getuid());
|
||||
if (p) {
|
||||
pName = p->pw_name;
|
||||
if (!pName) {
|
||||
pName = "";
|
||||
}
|
||||
}
|
||||
else {
|
||||
pName = "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,6 +63,9 @@
|
||||
* datagram socket (and watching for ECONNREFUSED)
|
||||
*
|
||||
* $Log$
|
||||
* Revision 1.39 1997/04/23 17:05:09 jhill
|
||||
* pc port changes
|
||||
*
|
||||
* Revision 1.38 1996/11/02 00:51:04 jhill
|
||||
* many pc port, const in API, and other changes
|
||||
*
|
||||
@@ -124,13 +127,13 @@ LOCAL void fanOut(struct sockaddr_in *pFrom, const char *pMsg, unsigned msgSize)
|
||||
*/
|
||||
void ca_repeater()
|
||||
{
|
||||
int status;
|
||||
int size;
|
||||
SOCKET sock;
|
||||
struct sockaddr_in from;
|
||||
struct sockaddr_in local;
|
||||
int from_size = sizeof from;
|
||||
unsigned short port;
|
||||
int status;
|
||||
int size;
|
||||
SOCKET sock;
|
||||
struct sockaddr_in from;
|
||||
struct sockaddr_in local;
|
||||
int from_size = sizeof from;
|
||||
unsigned short port;
|
||||
|
||||
port = caFetchPortConfig(
|
||||
&EPICS_CA_REPEATER_PORT,
|
||||
|
||||
207
src/ca/service.c
207
src/ca/service.c
@@ -253,6 +253,7 @@ const struct in_addr *pnet_addr
|
||||
|
||||
case CA_PROTO_ECHO:
|
||||
piiu->echoPending = FALSE;
|
||||
piiu->beaconAnomaly = FALSE;
|
||||
break;
|
||||
|
||||
case CA_PROTO_WRITE_NOTIFY:
|
||||
@@ -266,8 +267,8 @@ const struct in_addr *pnet_addr
|
||||
monix = (miu) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!monix){
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -290,11 +291,8 @@ const struct in_addr *pnet_addr
|
||||
*/
|
||||
args.status = ntohl(piiu->curMsg.m_cid);
|
||||
|
||||
LOCKEVENTS;
|
||||
(*monix->usr_func) (args);
|
||||
UNLOCKEVENTS;
|
||||
}
|
||||
LOCK;
|
||||
ellDelete(&pend_write_list, &monix->node);
|
||||
caIOBlockFree(monix);
|
||||
UNLOCK;
|
||||
@@ -314,8 +312,8 @@ const struct in_addr *pnet_addr
|
||||
monix = (miu) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!monix){
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -332,18 +330,18 @@ const struct in_addr *pnet_addr
|
||||
* format to host format
|
||||
*
|
||||
*/
|
||||
# ifdef CONVERSION_REQUIRED
|
||||
if (piiu->curMsg.m_type<NELEMENTS(cac_dbr_cvrt)) {
|
||||
(*cac_dbr_cvrt[piiu->curMsg.m_type])(
|
||||
piiu->pCurData,
|
||||
piiu->pCurData,
|
||||
FALSE,
|
||||
piiu->curMsg.m_count);
|
||||
}
|
||||
else {
|
||||
piiu->curMsg.m_cid = htonl(ECA_BADTYPE);
|
||||
}
|
||||
# endif
|
||||
# ifdef CONVERSION_REQUIRED
|
||||
if (piiu->curMsg.m_type<NELEMENTS(cac_dbr_cvrt)) {
|
||||
(*cac_dbr_cvrt[piiu->curMsg.m_type])(
|
||||
piiu->pCurData,
|
||||
piiu->pCurData,
|
||||
FALSE,
|
||||
piiu->curMsg.m_count);
|
||||
}
|
||||
else {
|
||||
piiu->curMsg.m_cid = htonl(ECA_BADTYPE);
|
||||
}
|
||||
# endif
|
||||
|
||||
args.usr = (void *) monix->usr_arg;
|
||||
args.chid = monix->chan;
|
||||
@@ -365,11 +363,8 @@ const struct in_addr *pnet_addr
|
||||
args.status = ECA_NORMAL;
|
||||
}
|
||||
|
||||
LOCKEVENTS;
|
||||
(*monix->usr_func) (args);
|
||||
UNLOCKEVENTS;
|
||||
}
|
||||
LOCK;
|
||||
ellDelete(&pend_read_list, &monix->node);
|
||||
caIOBlockFree(monix);
|
||||
UNLOCK;
|
||||
@@ -388,44 +383,43 @@ const struct in_addr *pnet_addr
|
||||
monix = (miu) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!monix){
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* m_postsize = 0 is a confirmation of a
|
||||
* monitor cancel
|
||||
*/
|
||||
if (!piiu->curMsg.m_postsize) {
|
||||
LOCK;
|
||||
pChan = (ciu) monix->chan; /* discard const */
|
||||
ellDelete(&pChan->eventq, &monix->node);
|
||||
caIOBlockFree(monix);
|
||||
UNLOCK;
|
||||
|
||||
break;
|
||||
}
|
||||
/* only call if not disabled */
|
||||
if (!monix->usr_func)
|
||||
if (!monix->usr_func) {
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* convert the data buffer from net
|
||||
* format to host format
|
||||
*/
|
||||
# ifdef CONVERSION_REQUIRED
|
||||
if (piiu->curMsg.m_type<NELEMENTS(cac_dbr_cvrt)) {
|
||||
(*cac_dbr_cvrt[piiu->curMsg.m_type])(
|
||||
piiu->pCurData,
|
||||
piiu->pCurData,
|
||||
FALSE,
|
||||
piiu->curMsg.m_count);
|
||||
}
|
||||
else {
|
||||
piiu->curMsg.m_cid = htonl(ECA_BADTYPE);
|
||||
}
|
||||
# ifdef CONVERSION_REQUIRED
|
||||
if (piiu->curMsg.m_type<NELEMENTS(cac_dbr_cvrt)) {
|
||||
(*cac_dbr_cvrt[piiu->curMsg.m_type])(
|
||||
piiu->pCurData,
|
||||
piiu->pCurData,
|
||||
FALSE,
|
||||
piiu->curMsg.m_count);
|
||||
}
|
||||
else {
|
||||
piiu->curMsg.m_cid = htonl(ECA_BADTYPE);
|
||||
}
|
||||
# endif
|
||||
|
||||
/*
|
||||
@@ -456,10 +450,8 @@ const struct in_addr *pnet_addr
|
||||
}
|
||||
|
||||
/* call their handler */
|
||||
LOCKEVENTS;
|
||||
(*monix->usr_func) (args);
|
||||
UNLOCKEVENTS;
|
||||
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
case CA_PROTO_READ:
|
||||
@@ -473,8 +465,8 @@ const struct in_addr *pnet_addr
|
||||
pIOBlock = (miu) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!pIOBlock){
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -487,28 +479,28 @@ const struct in_addr *pnet_addr
|
||||
* convert the data buffer from net
|
||||
* format to host format
|
||||
*/
|
||||
if (piiu->curMsg.m_type <= (unsigned) LAST_BUFFER_TYPE) {
|
||||
if (piiu->curMsg.m_type <= (unsigned) LAST_BUFFER_TYPE) {
|
||||
# ifdef CONVERSION_REQUIRED
|
||||
(*cac_dbr_cvrt[piiu->curMsg.m_type])(
|
||||
piiu->pCurData,
|
||||
(void *) pIOBlock->usr_arg,
|
||||
FALSE,
|
||||
piiu->curMsg.m_count);
|
||||
(*cac_dbr_cvrt[piiu->curMsg.m_type])(
|
||||
piiu->pCurData,
|
||||
(void *) pIOBlock->usr_arg,
|
||||
FALSE,
|
||||
piiu->curMsg.m_count);
|
||||
# else
|
||||
if (piiu->curMsg.m_type == DBR_STRING &&
|
||||
piiu->curMsg.m_count == 1u) {
|
||||
strcpy ((char *)pIOBlock->usr_arg,
|
||||
piiu->pCurData);
|
||||
}
|
||||
else {
|
||||
memcpy(
|
||||
(char *)pIOBlock->usr_arg,
|
||||
piiu->pCurData,
|
||||
dbr_size_n (
|
||||
piiu->curMsg.m_type,
|
||||
piiu->curMsg.m_count)
|
||||
);
|
||||
}
|
||||
if (piiu->curMsg.m_type == DBR_STRING &&
|
||||
piiu->curMsg.m_count == 1u) {
|
||||
strcpy ((char *)pIOBlock->usr_arg,
|
||||
piiu->pCurData);
|
||||
}
|
||||
else {
|
||||
memcpy(
|
||||
(char *)pIOBlock->usr_arg,
|
||||
piiu->pCurData,
|
||||
dbr_size_n (
|
||||
piiu->curMsg.m_type,
|
||||
piiu->curMsg.m_count)
|
||||
);
|
||||
}
|
||||
# endif
|
||||
/*
|
||||
* decrement the outstanding IO count
|
||||
@@ -516,7 +508,6 @@ const struct in_addr *pnet_addr
|
||||
CLRPENDRECV;
|
||||
}
|
||||
}
|
||||
LOCK;
|
||||
ellDelete(&pend_read_list, &pIOBlock->node);
|
||||
caIOBlockFree(pIOBlock);
|
||||
UNLOCK;
|
||||
@@ -582,15 +573,14 @@ const struct in_addr *pnet_addr
|
||||
|
||||
case CA_PROTO_ERROR:
|
||||
{
|
||||
ELLLIST *pList = NULL;
|
||||
miu monix;
|
||||
char nameBuf[64];
|
||||
char context[255];
|
||||
caHdr *req = piiu->pCurData;
|
||||
int op;
|
||||
ELLLIST *pList = NULL;
|
||||
miu monix;
|
||||
char nameBuf[64];
|
||||
char context[255];
|
||||
caHdr *req = piiu->pCurData;
|
||||
int op;
|
||||
struct exception_handler_args args;
|
||||
|
||||
|
||||
/*
|
||||
* dont process the message if they have
|
||||
* disabled notification
|
||||
@@ -683,7 +673,7 @@ const struct in_addr *pnet_addr
|
||||
|
||||
args.chid = bucketLookupItemUnsignedId
|
||||
(pSlowBucket, &piiu->curMsg.m_cid);
|
||||
UNLOCK;
|
||||
|
||||
args.usr = (void *) ca_static->ca_exception_arg;
|
||||
args.type = ntohs (req->m_type);
|
||||
args.count = ntohs (req->m_count);
|
||||
@@ -691,9 +681,8 @@ const struct in_addr *pnet_addr
|
||||
args.op = op;
|
||||
args.ctx = context;
|
||||
|
||||
LOCKEVENTS;
|
||||
(*ca_static->ca_exception_func) (args);
|
||||
UNLOCKEVENTS;
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
case CA_PROTO_ACCESS_RIGHTS:
|
||||
@@ -727,27 +716,9 @@ const struct in_addr *pnet_addr
|
||||
break;
|
||||
}
|
||||
case CA_PROTO_CLAIM_CIU:
|
||||
{
|
||||
ciu chan;
|
||||
|
||||
LOCK;
|
||||
chan = (ciu) bucketLookupItemUnsignedId(
|
||||
pSlowBucket, &piiu->curMsg.m_cid);
|
||||
UNLOCK;
|
||||
if(!chan){
|
||||
/*
|
||||
* end up here if they delete the channel
|
||||
* prior to connecting
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
||||
if (CA_V44(CA_PROTOCOL_VERSION,piiu->minor_version_number)) {
|
||||
chan->id.sid = piiu->curMsg.m_available;
|
||||
}
|
||||
cac_reconnect_channel(chan);
|
||||
cac_reconnect_channel(piiu->curMsg.m_cid);
|
||||
break;
|
||||
}
|
||||
|
||||
case CA_PROTO_CLAIM_CIU_FAILED:
|
||||
case CA_PROTO_SERVER_DISCONN:
|
||||
verifyChanAndDisconnect(piiu, cs_conn);
|
||||
@@ -998,39 +969,54 @@ const struct in_addr *pnet_addr
|
||||
* If this fails then we will wait for the
|
||||
* next search response.
|
||||
*/
|
||||
chan->id.sid = piiu->curMsg.m_cid;
|
||||
UNLOCK
|
||||
chan->id.sid = piiu->curMsg.m_cid;
|
||||
|
||||
issue_claim_channel(chan);
|
||||
UNLOCK
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* cac_reconnect_channel()
|
||||
*
|
||||
* LOCK must _not_ be applied
|
||||
*/
|
||||
void cac_reconnect_channel(ciu chan)
|
||||
void cac_reconnect_channel(caResId cid)
|
||||
{
|
||||
IIU *piiu = (IIU *) chan->piiu;
|
||||
evid pevent;
|
||||
enum channel_state prev_cs;
|
||||
int v41;
|
||||
IIU *piiu;
|
||||
evid pevent;
|
||||
enum channel_state prev_cs;
|
||||
int v41;
|
||||
ciu chan;
|
||||
|
||||
LOCK;
|
||||
chan = (ciu) bucketLookupItemUnsignedId(pSlowBucket, &cid);
|
||||
/*
|
||||
* this test will fail if they delete the channel
|
||||
* prior to the reply from the claim message
|
||||
*/
|
||||
if (!chan) {
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
piiu = (IIU *) chan->piiu;
|
||||
|
||||
prev_cs = chan->state;
|
||||
if (prev_cs == cs_conn) {
|
||||
ca_printf("CAC: Ignored conn resp to conn chan CID=%u SID=%u?\n",
|
||||
chan->cid, chan->id.sid);
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
LOCK;
|
||||
|
||||
v41 = CA_V41(CA_PROTOCOL_VERSION, piiu->minor_version_number);
|
||||
|
||||
/* Update rmt chid fields from caHdr fields */
|
||||
chan->type = piiu->curMsg.m_type;
|
||||
chan->count = piiu->curMsg.m_count;
|
||||
if (CA_V44(CA_PROTOCOL_VERSION, piiu->minor_version_number)) {
|
||||
chan->id.sid = piiu->curMsg.m_available;
|
||||
}
|
||||
|
||||
/* Update rmt chid fields from caHdr fields */
|
||||
chan->type = piiu->curMsg.m_type;
|
||||
chan->count = piiu->curMsg.m_count;
|
||||
|
||||
/*
|
||||
* set state to cs_conn before caling
|
||||
@@ -1064,8 +1050,6 @@ void cac_reconnect_channel(ciu chan)
|
||||
ca_request_event(pevent);
|
||||
}
|
||||
|
||||
UNLOCK;
|
||||
|
||||
/*
|
||||
* if less than v4.1 then the server will never
|
||||
* send access rights and we know that there
|
||||
@@ -1080,14 +1064,14 @@ void cac_reconnect_channel(ciu chan)
|
||||
(*chan->pAccessRightsFunc)(args);
|
||||
}
|
||||
|
||||
if(chan->pConnFunc){
|
||||
if(chan->pConnFunc){
|
||||
struct connection_handler_args args;
|
||||
|
||||
args.chid = chan;
|
||||
args.op = CA_OP_CONN_UP;
|
||||
LOCKEVENTS;
|
||||
|
||||
(*chan->pConnFunc)(args);
|
||||
UNLOCKEVENTS;
|
||||
|
||||
}
|
||||
else if(prev_cs==cs_never_conn){
|
||||
/*
|
||||
@@ -1095,5 +1079,6 @@ void cac_reconnect_channel(ciu chan)
|
||||
*/
|
||||
CLRPENDRECV;
|
||||
}
|
||||
}
|
||||
UNLOCK;
|
||||
}
|
||||
|
||||
|
||||
@@ -384,8 +384,6 @@ int cac_os_depen_init(struct CA_STATIC *pcas)
|
||||
pcas->ca_tid = taskIdSelf();
|
||||
pcas->ca_client_lock = semMCreate(SEM_DELETE_SAFE);
|
||||
assert(pcas->ca_client_lock);
|
||||
pcas->ca_event_lock = semMCreate(SEM_DELETE_SAFE);
|
||||
assert(pcas->ca_event_lock);
|
||||
pcas->ca_putNotifyLock = semMCreate(SEM_DELETE_SAFE);
|
||||
assert(pcas->ca_putNotifyLock);
|
||||
pcas->ca_io_done_sem = semBCreate(SEM_Q_PRIORITY, SEM_EMPTY);
|
||||
@@ -569,7 +567,6 @@ LOCAL int cac_os_depen_exit_tid (struct CA_STATIC *pcas, int tid)
|
||||
* can use them.
|
||||
*/
|
||||
assert(semDelete(pcas->ca_client_lock)==OK);
|
||||
assert(semDelete(pcas->ca_event_lock)==OK);
|
||||
assert(semDelete(pcas->ca_putNotifyLock)==OK);
|
||||
assert(semDelete(pcas->ca_io_done_sem)==OK);
|
||||
assert(semDelete(pcas->ca_blockSem)==OK);
|
||||
@@ -577,7 +574,7 @@ LOCAL int cac_os_depen_exit_tid (struct CA_STATIC *pcas, int tid)
|
||||
ca_static = NULL;
|
||||
free ((char *)pcas);
|
||||
|
||||
return ECA_NORMAL;
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
|
||||
@@ -878,9 +875,9 @@ LOCAL void ca_extra_event_labor(void *pArg)
|
||||
args.status = ECA_NORMAL;
|
||||
}
|
||||
|
||||
LOCKEVENTS;
|
||||
semTake(pcas->ca_client_lock, WAIT_FOREVER);
|
||||
(*ppnb->caUserCallback) (args);
|
||||
UNLOCKEVENTS;
|
||||
semGive(pcas->ca_client_lock);
|
||||
|
||||
ppnb->busy = FALSE;
|
||||
}
|
||||
@@ -898,7 +895,6 @@ LOCAL void ca_extra_event_labor(void *pArg)
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -75,8 +75,8 @@
|
||||
|
||||
#include "iocinf.h"
|
||||
|
||||
#ifndef WIN32
|
||||
#error This source is specific to WIN32
|
||||
#ifndef _WIN32
|
||||
#error This source is specific to _WIN32
|
||||
#endif
|
||||
|
||||
long offset_time; /* time diff (sec) between 1970 and when windows started */
|
||||
@@ -306,7 +306,7 @@ int local_addr (SOCKET s, struct sockaddr_in *plcladdr)
|
||||
* LOCK should be applied here for (pList)
|
||||
* (this is also called from the server)
|
||||
*/
|
||||
void caDiscoverInterfaces(ELLLIST *pList, SOCKET socket, int port,
|
||||
void caDiscoverInterfaces(ELLLIST *pList, SOCKET socket, unsigned short port,
|
||||
struct in_addr matchAddr)
|
||||
{
|
||||
struct in_addr bcast_addr;
|
||||
|
||||
Reference in New Issue
Block a user