]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/liborte/objectUtils.c
Reformat the sources with orte/uncrustify script
[orte.git] / orte / liborte / objectUtils.c
index 8d8dc96064017acaba03b0c4db6e4bbf6ada752b..9d25e20e99d8a8b07c317f6f4c63589449e4dce7 100644 (file)
@@ -1,41 +1,52 @@
-    /*
+/*
  *  $Id: objectUtils.c,v 0.0.0.1         2003/09/10
  *
  *  DEBUG:  section 9                   Functions with objets
- *  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@smoliku.cz
+ *  Advisor:             Pavel Pisa
+ *  Project Responsible: Zdenek Hanzalek
  *  --------------------------------------------------------------------
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
  *  (at your option) any later version.
- *  
+ *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
- *  
- */ 
+ *
+ */
 
-#include "orte.h"
+#include "orte_all.h"
 
 /*
  * AppParamsInit - Initalization default values of an application
- * @ap: pointer to an application 
+ * @ap: pointer to an application
  *
  */
-void 
-AppParamsInit(AppParams *ap) {
+void
+AppParamsInit(AppParams *ap)
+{
   PROTOCOL_VERSION_1_0(ap->protocolVersion);
   VENDOR_ID_UNKNOWN(ap->vendorId);
-  NTPTIME_BUILD(ap->expirationTime,180);
-  ap->metatrafficUnicastPort=PORT_INVALID;
-  ap->userdataUnicastPort=PORT_INVALID;
-  ap->unicastIPAddressCount=0;
-  ap->metatrafficMulticastIPAddressCount=0;
-  ap->managerKeyCount=0;
+  NTPTIME_BUILD(ap->expirationTime, 180);
+  ap->metatrafficUnicastPort = PORT_INVALID;
+  ap->userdataUnicastPort = PORT_INVALID;
+  ap->unicastIPAddressCount = 0;
+  ap->metatrafficMulticastIPAddressCount = 0;
+  ap->managerKeyCount = 0;
   SEQUENCE_NUMBER_NONE(ap->vargAppsSequenceNumber);
 }
 
@@ -44,22 +55,23 @@ AppParamsInit(AppParams *ap) {
  * @p: pointer to a publisher
  *
  */
-void 
-PublParamsInit(ORTEPublProp *pp) {
-  pp->expectsAck=ORTE_TRUE;
+void
+PublParamsInit(ORTEPublProp *pp)
+{
+  pp->expectsAck = ORTE_TRUE;
   NTPTIME_ZERO(pp->persistence);
-  pp->reliabilityOffered=0;
-  pp->sendQueueSize=1;
-  pp->strength=1;
-  strcpy(pp->topic,"DefaultTopic");
-  strcpy(pp->typeName,"");
-  pp->typeChecksum=0;
+  pp->reliabilityOffered = 0;
+  pp->sendQueueSize = 1;
+  pp->strength = 1;
+  strcpy((char *)pp->topic, "DefaultTopic");
+  strcpy((char *)pp->typeName, "");
+  pp->typeChecksum = 0;
   //additional params
-  NTPTIME_BUILD(pp->maxBlockTime,30);
-  pp->criticalQueueLevel=1;
-  NtpTimeAssembFromMs(pp->HBNornalRate,1,0);
-  NtpTimeAssembFromMs(pp->HBCQLRate,0,50);
-  pp->HBMaxRetries=10;
+  NTPTIME_BUILD(pp->maxBlockTime, 30);
+  pp->criticalQueueLevel = 1;
+  NtpTimeAssembFromMs(pp->HBNornalRate, 1, 0);
+  NtpTimeAssembFromMs(pp->HBCQLRate, 0, 50);
+  pp->HBMaxRetries = 10;
 }
 
 /*
@@ -67,46 +79,48 @@ PublParamsInit(ORTEPublProp *pp) {
  * @s: pointer to a subscription
  *
  */
-void 
-SubsParamsInit(ORTESubsProp *sp) {
+void
+SubsParamsInit(ORTESubsProp *sp)
+{
   NTPTIME_ZERO(sp->minimumSeparation);
-  sp->recvQueueSize=1;
-  sp->reliabilityRequested=0;
-  strcpy(sp->topic,"DefaultTopic");
-  strcpy(sp->typeName,"");
-  sp->typeChecksum=0;
+  sp->recvQueueSize = 1;
+  sp->reliabilityRequested = 0;
+  strcpy((char *)sp->topic, "DefaultTopic");
+  strcpy((char *)sp->typeName, "");
+  sp->typeChecksum = 0;
 //  s->rcvMessageCallBack=NULL;
 //  s->deadline=NTPTIME_ZERO;
 }
 
 /*
- * UpdateORTEAppInfo - 
+ * UpdateORTEAppInfo -
  * @appParams: pointer to a source of data
  * @appInfo: pointer to a destination of data
  *
  */
 void
-updateORTEAppInfo(AppParams *appParams,ORTEAppInfo *appInfo) {
-  appInfo->hostId=
-      appParams->hostId;
-  appInfo->appId=
-      appParams->appId;
-  appInfo->unicastIPAddressList=
-      appParams->unicastIPAddressList;
-  appInfo->unicastIPAddressCount=
-      appParams->unicastIPAddressCount;
-  appInfo->metatrafficMulticastIPAddressList=
-      appParams->metatrafficMulticastIPAddressList;
-  appInfo->metatrafficMulticastIPAddressCount=
-      appParams->metatrafficMulticastIPAddressCount;
-  appInfo->metatrafficUnicastPort=
-      appParams->metatrafficUnicastPort;
-  appInfo->userdataUnicastPort=
-      appParams->userdataUnicastPort;
-  appInfo->vendorId=
-      appParams->vendorId;
-  appInfo->protocolVersion=
-     appParams->protocolVersion;
+updateORTEAppInfo(AppParams *appParams, ORTEAppInfo *appInfo)
+{
+  appInfo->hostId =
+    appParams->hostId;
+  appInfo->appId =
+    appParams->appId;
+  appInfo->unicastIPAddressList =
+    appParams->unicastIPAddressList;
+  appInfo->unicastIPAddressCount =
+    appParams->unicastIPAddressCount;
+  appInfo->metatrafficMulticastIPAddressList =
+    appParams->metatrafficMulticastIPAddressList;
+  appInfo->metatrafficMulticastIPAddressCount =
+    appParams->metatrafficMulticastIPAddressCount;
+  appInfo->metatrafficUnicastPort =
+    appParams->metatrafficUnicastPort;
+  appInfo->userdataUnicastPort =
+    appParams->userdataUnicastPort;
+  appInfo->vendorId =
+    appParams->vendorId;
+  appInfo->protocolVersion =
+    appParams->protocolVersion;
 }
 
 /*
@@ -117,67 +131,70 @@ updateORTEAppInfo(AppParams *appParams,ORTEAppInfo *appInfo) {
  * Return: return ORTE_TRUE if object is acceptable by ORTE (new events)
  */
 Boolean
-generateEvent(ORTEDomain *d,GUID_RTPS *guid,void *params,Boolean live) {
+generateEvent(ORTEDomain *d, GUID_RTPS *guid, void *params, Boolean live)
+{
   ObjectEntryOID  *objectEntryOID;
   GUID_RTPS       guidapp;
-  Boolean         result=ORTE_TRUE;
-  
-  //generate event 
+  Boolean         result = ORTE_TRUE;
+
+  //generate event
   switch (guid->oid & 0x07) {
     case OID_APPLICATION:
-        updateORTEAppInfo((AppParams*)params,&d->appInfo);
-        if (((guid->aid & 0x03)==MANAGER) && 
-            (d->domainEvents.onMgrNew) && live) 
-          result=d->domainEvents.onMgrNew(&d->appInfo,
-                                          d->domainEvents.onMgrNewParam);
-        if (((guid->aid & 0x03)==MANAGER) && 
-            (d->domainEvents.onMgrDelete) && (!live)) 
-          d->domainEvents.onMgrDelete(&d->appInfo,
-                                      d->domainEvents.onMgrDeleteParam);
-        if (((guid->aid & 0x03)==MANAGEDAPPLICATION) && 
-            (d->domainEvents.onAppRemoteNew) && live) 
-          result=d->domainEvents.onAppRemoteNew(&d->appInfo,
-                                          d->domainEvents.onAppRemoteNewParam);
-        if (((guid->aid & 0x03)==MANAGEDAPPLICATION) && 
-            (d->domainEvents.onAppDelete) && !live) 
-          d->domainEvents.onAppDelete(&d->appInfo,
-                                      d->domainEvents.onAppDeleteParam);
+      updateORTEAppInfo((AppParams *)params, &d->appInfo);
+      if (((guid->aid & 0x03) == MANAGER) &&
+         (d->domainEvents.onMgrNew) && live)
+       result = d->domainEvents.onMgrNew(&d->appInfo,
+                                         d->domainEvents.onMgrNewParam);
+      if (((guid->aid & 0x03) == MANAGER) &&
+         (d->domainEvents.onMgrDelete) && (!live))
+       d->domainEvents.onMgrDelete(&d->appInfo,
+                                   d->domainEvents.onMgrDeleteParam);
+      if (((guid->aid & 0x03) == MANAGEDAPPLICATION) &&
+         (d->domainEvents.onAppRemoteNew) && live)
+       result = d->domainEvents.onAppRemoteNew(&d->appInfo,
+                                               d->domainEvents.onAppRemoteNewParam);
+      if (((guid->aid & 0x03) == MANAGEDAPPLICATION) &&
+         (d->domainEvents.onAppDelete) && !live)
+       d->domainEvents.onAppDelete(&d->appInfo,
+                                   d->domainEvents.onAppDeleteParam);
       break;
     case OID_PUBLICATION:
-      guidapp.hid=guid->hid;
-      guidapp.aid=guid->aid;
-      guidapp.oid=OID_APP;
-      objectEntryOID=objectEntryFind(d,&guidapp);
-      if (!objectEntryOID) return ORTE_FALSE;
-      updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);   
-      d->pubInfo.topic=((ORTEPublProp*)params)->topic;
-      d->pubInfo.type=((ORTEPublProp*)params)->typeName;
-      d->pubInfo.objectId=guid->oid;
-      if ((d->domainEvents.onPubRemoteNew) && live) 
-        result=d->domainEvents.onPubRemoteNew(&d->appInfo,&d->pubInfo,
-                                        d->domainEvents.onPubRemoteNewParam);
-      if ((d->domainEvents.onPubDelete) && !live) 
-        d->domainEvents.onPubDelete(&d->appInfo,&d->pubInfo,
-                                    d->domainEvents.onPubDeleteParam);
-      
+      guidapp.hid = guid->hid;
+      guidapp.aid = guid->aid;
+      guidapp.oid = OID_APP;
+      objectEntryOID = objectEntryFind(d, &guidapp);
+      if (!objectEntryOID)
+       return ORTE_FALSE;
+      updateORTEAppInfo((AppParams *)objectEntryOID->attributes, &d->appInfo);
+      d->pubInfo.topic = (char *)((ORTEPublProp *)params)->topic;
+      d->pubInfo.type = (char *)((ORTEPublProp *)params)->typeName;
+      d->pubInfo.objectId = guid->oid;
+      if ((d->domainEvents.onPubRemoteNew) && live)
+       result = d->domainEvents.onPubRemoteNew(&d->appInfo, &d->pubInfo,
+                                               d->domainEvents.onPubRemoteNewParam);
+      if ((d->domainEvents.onPubDelete) && !live)
+       d->domainEvents.onPubDelete(&d->appInfo, &d->pubInfo,
+                                   d->domainEvents.onPubDeleteParam);
+
       break;
     case OID_SUBSCRIPTION:
-      guidapp.hid=guid->hid;
-      guidapp.aid=guid->aid;
-      guidapp.oid=OID_APP;
-      objectEntryOID=objectEntryFind(d,&guidapp);
-      if (!objectEntryOID) return ORTE_FALSE;
-      updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);   
-      d->subInfo.topic=((ORTESubsProp*)params)->topic;
-      d->subInfo.type=((ORTESubsProp*)params)->typeName;
-      d->subInfo.objectId=guid->oid;
+      guidapp.hid = guid->hid;
+      guidapp.aid = guid->aid;
+      guidapp.oid = OID_APP;
+      objectEntryOID = objectEntryFind(d, &guidapp);
+      if (!objectEntryOID)
+       return ORTE_FALSE;
+      updateORTEAppInfo((AppParams *)objectEntryOID->attributes, &d->appInfo);
+      d->subInfo.topic = (char *)((ORTESubsProp *)params)->topic;
+      d->subInfo.type = (char *)((ORTESubsProp *)params)->typeName;
+      d->subInfo.objectId = guid->oid;
       if ((d->domainEvents.onSubRemoteNew) && (live))
-        result=d->domainEvents.onSubRemoteNew(&d->appInfo,&d->subInfo,
-                                        d->domainEvents.onSubRemoteNewParam);
+       result = d->domainEvents.onSubRemoteNew(&d->appInfo, &d->subInfo,
+                                               d->domainEvents.onSubRemoteNewParam);
       if ((d->domainEvents.onSubDelete) && (!live))
-        d->domainEvents.onSubDelete(&d->appInfo,&d->subInfo,
-                                    d->domainEvents.onSubDeleteParam);
-      
+       d->domainEvents.onSubDelete(&d->appInfo, &d->subInfo,
+                                   d->domainEvents.onSubDeleteParam);
+
       break;
   }
   return result;
@@ -186,35 +203,64 @@ generateEvent(ORTEDomain *d,GUID_RTPS *guid,void *params,Boolean live) {
 /*
  * GetTypeApp - Test if application is MOM or OAM
  * @d: pointer to a domain
- * @ap 
+ * @ap
  * @senderIPAddress:
  *
  * Return: return ORTE_TRUE if application MOM
  */
 Boolean
-getTypeApp(ORTEDomain *d,AppParams *ap,IPAddress senderIPAddress) {
-  Boolean       result=ORTE_FALSE;
-  uint16_t      i,j,k;
-  
+getTypeApp(ORTEDomain *d, AppParams *ap, IPAddress senderIPAddress)
+{
+  Boolean       result = ORTE_FALSE;
+  uint16_t      i, j, k;
+
   //test if the app is MOM
-  for (i=0;i<d->appParams->managerKeyCount;i++) {
-    for (j=0;j<ap->managerKeyCount;j++) {
-      if (ap->managerKeyList[j]!=StringToIPAddress("127.0.0.1")) {
-        if (ap->managerKeyList[j]==d->appParams->managerKeyList[i])
-          result=ORTE_TRUE;
+  for (i = 0; i < d->appParams->managerKeyCount; i++) {
+    for (j = 0; j < ap->managerKeyCount; j++) {
+      if (ap->managerKeyList[j] != StringToIPAddress("127.0.0.1")) {
+       if (ap->managerKeyList[j] == d->appParams->managerKeyList[i])
+         result = ORTE_TRUE;
       } else {
-        if (senderIPAddress==StringToIPAddress("127.0.0.1"))
-          result=ORTE_TRUE;
-        for (k=0;k<d->domainProp.IFCount;k++) {
-          if (d->domainProp.IFProp[k].ipAddress==senderIPAddress)
-            result=ORTE_TRUE;
-        }
+       if (senderIPAddress == StringToIPAddress("127.0.0.1"))
+         result = ORTE_TRUE;
+       for (k = 0; k < d->domainProp.IFCount; k++) {
+         if (d->domainProp.IFProp[k].ipAddress == senderIPAddress)
+           result = ORTE_TRUE;
+       }
       }
     }
   }
   return result;
 }
 
+/*
+ * matchMulticastAddresses - Test if objects contain same a multicast ip address
+ * @o1: pointer to a object
+ * @o2: pointer to a object
+ *
+ * Return: return ORTE_TRUE if a multicast ip address was match
+ */
+Boolean
+matchMulticastAddresses(ObjectEntryOID *o1, ObjectEntryOID *o2)
+{
+  AppParams     *ap1, *ap2;
+  uint16_t      i, j;
+
+  if (o1->guid.oid != OID_APP)
+    return ORTE_FALSE;
+
+  ap1 = o1->attributes;
+  ap2 = o2->attributes;
+  for (i = 0; i < ap1->metatrafficMulticastIPAddressCount; i++) {
+    for (j = 0; j < ap2->metatrafficMulticastIPAddressCount; j++) {
+      if (ap1->metatrafficMulticastIPAddressList[i] ==
+         ap2->metatrafficMulticastIPAddressList[j])
+       return ORTE_TRUE;
+    }
+  }
+  return ORTE_FALSE;
+}
+
 /*
  * appSelfParamChanged - Self parameters changed
  * @d: pointer to an domain
@@ -223,29 +269,30 @@ getTypeApp(ORTEDomain *d,AppParams *ap,IPAddress senderIPAddress) {
  * @alive:
  *
  */
-void 
+void
 appSelfParamChanged(ORTEDomain *d,
-    Boolean lock,Boolean unlock,Boolean forWM,Boolean alive) {
+                   Boolean lock, Boolean unlock, Boolean forWM, Boolean alive)
+{
   CSChange     *csChange;
-     
+
   if (lock) {
     pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
     if (forWM)
       pthread_rwlock_wrlock(&d->writerManagers.lock);
   }
-  csChange=(CSChange*)MALLOC(sizeof(CSChange));
-  parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
-  csChange->guid=d->guid;
-  csChange->alive=alive;
-  csChange->cdrStream.buffer=NULL;
-  CSTWriterAddCSChange(d,&d->writerApplicationSelf,csChange);
+  csChange = (CSChange *)MALLOC(sizeof(CSChange));
+  parameterUpdateCSChange(csChange, d->appParams, ORTE_TRUE);
+  csChange->guid = d->guid;
+  csChange->alive = alive;
+  csChange->cdrCodec.buffer = NULL;
+  CSTWriterAddCSChange(d, &d->writerApplicationSelf, csChange);
   if (forWM) {
-    csChange=(CSChange*)MALLOC(sizeof(CSChange));
-    parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
-    csChange->guid=d->guid;
-    csChange->alive=alive;
-    csChange->cdrStream.buffer=NULL;
-    CSTWriterAddCSChange(d,&d->writerManagers,csChange);
+    csChange = (CSChange *)MALLOC(sizeof(CSChange));
+    parameterUpdateCSChange(csChange, d->appParams, ORTE_TRUE);
+    csChange->guid = d->guid;
+    csChange->alive = alive;
+    csChange->cdrCodec.buffer = NULL;
+    CSTWriterAddCSChange(d, &d->writerManagers, csChange);
   }
   if (unlock) {
     pthread_rwlock_unlock(&d->writerApplicationSelf.lock);
@@ -253,3 +300,72 @@ appSelfParamChanged(ORTEDomain *d,
       pthread_rwlock_unlock(&d->writerManagers.lock);
   }
 }
+
+/*
+ * getAppO2SRemoteReader - returns pointer to virtual multicat object in case multicast application
+ * @d: pointer to an domain
+ * @objectEntryOID:
+ * @ap: pointer to an application
+ *
+ */
+ObjectEntryOID *
+getAppO2SRemoteReader(ORTEDomain *d, ObjectEntryOID *objectEntryOID,
+                     AppParams *ap)
+{
+  GUID_RTPS         guid;
+  AppParams         *map;
+  IPAddress         maddr;
+
+  maddr = ap->metatrafficMulticastIPAddressList[0];
+  if (ap->metatrafficMulticastIPAddressCount &&
+      IN_MULTICAST(maddr)) {
+    map = (AppParams *)MALLOC(sizeof(AppParams));
+    guid.hid = maddr;
+    guid.aid = AID_UNKNOWN;
+    guid.oid = OID_APP;
+    objectEntryOID = objectEntryFind(d, &guid);
+    if (!objectEntryOID) {
+      memcpy(map, ap, sizeof(AppParams));
+      objectEntryOID = objectEntryAdd(d, &guid, (void *)map);
+      Domain2PortMulticastMetatraffic(d->domain,
+                                     objectEntryOID->multicastPort);
+      debug(9, 2) ("new multicast application 0x%x-0x%x-0x%x temporary created\n",
+                  GUID_PRINTF(guid));
+    }
+  }
+  return objectEntryOID;
+}
+
+/*
+ * getSubsO2SRemoteReader - returns pointer to virtual multicat object in case multicast subscription
+ * @d: pointer to an domain
+ * @objectEntryOID:
+ * @sp: pointer to a subscription
+ *
+ */
+ObjectEntryOID *
+getSubsO2SRemoteReader(ORTEDomain *d, ObjectEntryOID *objectEntryOID,
+                      ORTESubsProp *sp)
+{
+  AppParams         *map;
+  GUID_RTPS         guid;
+
+  if (IN_MULTICAST(sp->multicast)) {
+    map = (AppParams *)MALLOC(sizeof(AppParams));
+    guid.hid = sp->multicast;
+    guid.aid = AID_UNKNOWN;
+    guid.oid = OID_APP;
+    objectEntryOID = objectEntryFind(d, &guid);
+    if (!objectEntryOID) {
+      AppParamsInit(map);
+      map->metatrafficMulticastIPAddressList[0] = sp->multicast;
+      map->metatrafficMulticastIPAddressCount = 1;
+      objectEntryOID = objectEntryAdd(d, &guid, (void *)map);
+      Domain2PortMulticastUserdata(d->domain,
+                                  objectEntryOID->multicastPort);
+      debug(9, 2) ("new subs. multicast application 0x%x-0x%x-0x%x temporary created\n",
+                  GUID_PRINTF(guid));
+    }
+  }
+  return objectEntryOID;
+}