74
74
#include " caProto.h"
75
75
#include " udpiiu.h"
76
76
#include " repeaterClient.h"
77
+ #include " addrList.h"
77
78
78
79
79
80
/*
@@ -92,7 +93,7 @@ static int makeSocket ( unsigned short port, bool reuseAddr, SOCKET * pSock )
92
93
SOCKET sock = epicsSocketCreate ( AF_INET, SOCK_DGRAM, 0 );
93
94
94
95
if ( sock == INVALID_SOCKET ) {
95
- *pSock = sock;
96
+ *pSock = sock;
96
97
return SOCKERRNO;
97
98
}
98
99
@@ -517,6 +518,60 @@ void ca_repeater ()
517
518
return ;
518
519
}
519
520
521
+ #ifdef IP_ADD_MEMBERSHIP
522
+ /*
523
+ * join UDP socket to any multicast groups
524
+ */
525
+ {
526
+ ELLLIST casBeaconAddrList = ELLLIST_INIT;
527
+ ELLLIST dummy = ELLLIST_INIT;
528
+
529
+ /*
530
+ * collect user specified beacon address list;
531
+ * check BEACON_ADDR_LIST list first; if no result, take CA_ADDR_LIST
532
+ */
533
+ if (!addAddrToChannelAccessAddressList (&casBeaconAddrList,&EPICS_CAS_BEACON_ADDR_LIST,port,0 )) {
534
+ addAddrToChannelAccessAddressList (&casBeaconAddrList,&EPICS_CA_ADDR_LIST,port,0 );
535
+ }
536
+
537
+ /* First clean up */
538
+ removeDuplicateAddresses (&casBeaconAddrList, &dummy , 0 );
539
+
540
+ osiSockAddrNode *pNode;
541
+ for (pNode = (osiSockAddrNode*)ellFirst (&casBeaconAddrList);
542
+ pNode;
543
+ pNode = (osiSockAddrNode*)ellNext (&pNode->node ))
544
+ {
545
+
546
+ if (pNode->addr .ia .sin_family ==AF_INET) {
547
+ epicsUInt32 top = ntohl (pNode->addr .ia .sin_addr .s_addr )>>24 ;
548
+ if (top>=224 && top<=239 ) {
549
+
550
+ /* This is a multi-cast address */
551
+ struct ip_mreq mreq;
552
+
553
+ memset (&mreq, 0 , sizeof (mreq));
554
+ mreq.imr_multiaddr = pNode->addr .ia .sin_addr ;
555
+ mreq.imr_interface .s_addr = INADDR_ANY;
556
+
557
+ if (setsockopt (sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
558
+ (char *) &mreq, sizeof (mreq)) != 0 ) {
559
+ struct sockaddr_in temp;
560
+ char name[40 ];
561
+ char sockErrBuf[64 ];
562
+ temp.sin_family = AF_INET;
563
+ temp.sin_addr = mreq.imr_multiaddr ;
564
+ temp.sin_port = htons ( port );
565
+ epicsSocketConvertErrnoToString (sockErrBuf, sizeof ( sockErrBuf ) );
566
+ ipAddrToDottedIP (&temp, name, sizeof (name));
567
+ errlogPrintf (" caR: Socket mcast join to %s failed: %s\n " , name, sockErrBuf );
568
+ }
569
+ }
570
+ }
571
+ }
572
+ }
573
+ #endif
574
+
520
575
debugPrintf ( ( " CA Repeater: Attached and initialized\n " ) );
521
576
522
577
while ( true ) {
0 commit comments