]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/liborte/ORTEDomain.c
changed name to Open Real-time Ethernet, some source header arranging
[orte.git] / orte / liborte / ORTEDomain.c
index ea8c75bac6e003a621a6502c1a11f3feb02a67b8..c30d029491079f446b6c76415bd5072be4dc9a22 100644 (file)
@@ -2,9 +2,19 @@
  *  $Id: ORTEDomain.c,v 0.0.0.1         2003/08/21
  *
  *  DEBUG:  section 30                  Domain functions
- *  AUTHOR: Petr Smolik                 petr.smolik@wo.cz
  *
- *  ORTE - OCERA Real-Time Ethernet     http://www.ocera.org/
+ *  -------------------------------------------------------------------  
+ *                                ORTE                                 
+ *                      Open Real-Time Ethernet                       
+ *                                                                    
+ *                      Copyright (C) 2001-2006                       
+ *  Department of Control Engineering FEE CTU Prague, Czech Republic  
+ *                      http://dce.felk.cvut.cz                       
+ *                      http://www.ocera.org                          
+ *                                                                    
+ *  Author:             Petr Smolik    petr.smolik@wo.cz             
+ *  Advisor:            Pavel Pisa                                   
+ *  Project Responsible: Zdenek Hanzalek                              
  *  --------------------------------------------------------------------
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -292,6 +302,33 @@ ORTEDomainCreate(int domain, ORTEDomainProp *prop,
   /* UnicastMetatraffic */
   Domain2Port(d->domain,port);
   if (manager) {
+    if (d->domainProp.multicast.enabled) {
+      char sIPAddress[MAX_STRING_IPADDRESS_LENGTH];
+      struct ip_mreq mreq;
+      int reuse=1,loop=0;
+    
+      //reuseaddr
+      sock_setsockopt(&d->taskRecvUnicastMetatraffic.sock, SOL_SOCKET, 
+                   SO_REUSEADDR, (char*)&reuse, sizeof(reuse));
+      debug(30,2) ("ORTEDomainCreate: set value SO_REUSEADDR: %u\n",
+                   reuse);
+
+      //multicast loop
+      sock_setsockopt(&d->taskRecvUnicastMetatraffic.sock, IPPROTO_IP, 
+                   IP_MULTICAST_LOOP, (char*)&loop, 
+                   sizeof(loop));
+      debug(30,2) ("ORTEDomainCreate: set value IP_MULTICAST_LOOP: %u\n",
+                 loop);
+      
+      //joint to multicast group
+      mreq.imr_multiaddr.s_addr=htonl(d->domainProp.multicast.ipAddress);
+      mreq.imr_interface.s_addr=htonl(INADDR_ANY);
+      if(sock_setsockopt(&d->taskRecvUnicastMetatraffic.sock,IPPROTO_IP,
+         IP_ADD_MEMBERSHIP,(void *) &mreq, sizeof(mreq))>=0) {
+        debug(30,2) ("ORTEDomainCreate: joint to mgroup %s\n",
+                      IPAddressToString(d->domainProp.multicast.ipAddress,sIPAddress));
+      }
+    }
     sock_bind(&d->taskRecvUnicastMetatraffic.sock,port); 
   } else {
     /* give me receiving port (metatraffic) */
@@ -303,6 +340,8 @@ ORTEDomainCreate(int domain, ORTEDomainProp *prop,
   /************************************************************************/
   /* MulticastMetatraffic */
   if (d->domainProp.multicast.enabled && !manager) {
+    char sIPAddress[MAX_STRING_IPADDRESS_LENGTH];
+    struct ip_mreq mreq;
     Port mport;
     int reuse=1;
     
@@ -318,7 +357,16 @@ ORTEDomainCreate(int domain, ORTEDomainProp *prop,
                    sizeof(d->domainProp.multicast.loopBackEnabled));
     debug(30,2) ("ORTEDomainCreate: set value IP_MULTICAST_LOOP: %u\n",
                  d->domainProp.multicast.loopBackEnabled);
-
+    
+    //joint to multicast group
+    mreq.imr_multiaddr.s_addr=htonl(d->domainProp.multicast.ipAddress);
+    mreq.imr_interface.s_addr=htonl(INADDR_ANY);
+    if(sock_setsockopt(&d->taskRecvMulticastMetatraffic.sock,IPPROTO_IP,
+        IP_ADD_MEMBERSHIP,(void *) &mreq, sizeof(mreq))>=0) {
+      debug(30,2) ("ORTEDomainCreate: joint to mgroup %s\n",
+                    IPAddressToString(d->domainProp.multicast.ipAddress,sIPAddress));
+    }
+    
     /* receiving multicast port (metatraffic) */
     Domain2PortMulticastMetatraffic(d->domain,mport);
     sock_bind(&d->taskRecvMulticastMetatraffic.sock,(uint16_t)mport); 
@@ -688,34 +736,6 @@ ORTEDomainDestroy(ORTEDomain *d,Boolean manager) {
   ORTEDomainSendThreadStop(&d->taskSend);
   debug(30,3) ("ORTEDomainDestroy: threads stoped\n");
   
-  //Sockets
-  sock_cleanup(&d->taskRecvUnicastMetatraffic.sock);
-  sock_cleanup(&d->taskRecvMulticastMetatraffic.sock);
-  sock_cleanup(&d->taskRecvUnicastUserdata.sock);
-  sock_cleanup(&d->taskRecvMulticastUserdata.sock);
-  sock_cleanup(&d->taskSend.sock);
-
-  //Signals
-  pthread_cond_destroy(&d->objectEntry.htimSendCond);
-  pthread_mutex_destroy(&d->objectEntry.htimSendMutex);
-
-  //rwLocks
-  pthread_rwlock_destroy(&d->objectEntry.objRootLock);
-  pthread_rwlock_destroy(&d->objectEntry.htimRootLock);
-  pthread_rwlock_destroy(&d->publications.lock);
-  pthread_rwlock_destroy(&d->subscriptions.lock);
-  pthread_rwlock_destroy(&d->psEntry.publicationsLock);
-  pthread_rwlock_destroy(&d->psEntry.subscriptionsLock);
-
-  //TypeRegister
-  ORTETypeRegisterDestroyAll(d);
-  pthread_rwlock_destroy(&d->typeEntry.lock);
-  
-  //Pattern
-  ORTEDomainAppSubscriptionPatternDestroy(d);
-  pthread_rwlock_unlock(&d->typeEntry.lock);    
-  pthread_rwlock_destroy(&d->patternEntry.lock);
-  
   //CSTReaders and CSTWriters
   CSTWriterDelete(d,&d->writerApplicationSelf);
   CSTReaderDelete(d,&d->readerManagers);
@@ -741,13 +761,46 @@ ORTEDomainDestroy(ORTEDomain *d,Boolean manager) {
     
   //objects in objectsEntry
   objectEntryDeleteAll(d,&d->objectEntry);
+  debug(30,3) ("ORTEDomainDestroy: deleted all objects\n");
+
+  //Sockets
+  sock_cleanup(&d->taskRecvUnicastMetatraffic.sock);
+  sock_cleanup(&d->taskRecvMulticastMetatraffic.sock);
+  sock_cleanup(&d->taskRecvUnicastUserdata.sock);
+  sock_cleanup(&d->taskRecvMulticastUserdata.sock);
+  sock_cleanup(&d->taskSend.sock);
+
+
+  //Signals
+  pthread_cond_destroy(&d->objectEntry.htimSendCond);
+  pthread_mutex_destroy(&d->objectEntry.htimSendMutex);
+
+  //rwLocks
+  pthread_rwlock_destroy(&d->objectEntry.objRootLock);
+  pthread_rwlock_destroy(&d->objectEntry.htimRootLock);
+  pthread_rwlock_destroy(&d->publications.lock);
+  pthread_rwlock_destroy(&d->subscriptions.lock);
+  pthread_rwlock_destroy(&d->psEntry.publicationsLock);
+  pthread_rwlock_destroy(&d->psEntry.subscriptionsLock);
+
+  //TypeRegister
+  ORTETypeRegisterDestroyAll(d);
+  
+  //Pattern
+  ORTEDomainAppSubscriptionPatternDestroy(d);
+  pthread_rwlock_destroy(&d->patternEntry.lock);
   
+  //Release buffers  
   CDR_codec_release_buffer(&d->taskRecvUnicastMetatraffic.mb.cdrCodec);
   CDR_codec_release_buffer(&d->taskRecvMulticastMetatraffic.mb.cdrCodec);
   CDR_codec_release_buffer(&d->taskRecvUnicastUserdata.mb.cdrCodec);
   CDR_codec_release_buffer(&d->taskRecvMulticastUserdata.mb.cdrCodec);
   CDR_codec_release_buffer(&d->taskSend.mb.cdrCodec);
+  
+  //Free domain instance
   FREE(d);
+  
   debug(30,10) ("ORTEDomainDestroy: finished\n");
+  
   return ORTE_TRUE;
 }