]> rtime.felk.cvut.cz Git - orte.git/blob - orte/liborte/objectUtils.c
43686aa83c0b9ecea7ea884f9217aa1e2823c521
[orte.git] / orte / liborte / objectUtils.c
1     /*
2  *  $Id: objectUtils.c,v 0.0.0.1         2003/09/10
3  *
4  *  DEBUG:  section 9                   Functions with objets
5  *
6  *  -------------------------------------------------------------------  
7  *                                ORTE                                 
8  *                      Open Real-Time Ethernet                       
9  *                                                                    
10  *                      Copyright (C) 2001-2006                       
11  *  Department of Control Engineering FEE CTU Prague, Czech Republic  
12  *                      http://dce.felk.cvut.cz                       
13  *                      http://www.ocera.org                          
14  *                                                                    
15  *  Author:              Petr Smolik    petr@smoliku.cz             
16  *  Advisor:             Pavel Pisa                                   
17  *  Project Responsible: Zdenek Hanzalek                              
18  *  --------------------------------------------------------------------
19  *
20  *  This program is free software; you can redistribute it and/or modify
21  *  it under the terms of the GNU General Public License as published by
22  *  the Free Software Foundation; either version 2 of the License, or
23  *  (at your option) any later version.
24  *  
25  *  This program is distributed in the hope that it will be useful,
26  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
27  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28  *  GNU General Public License for more details.
29  *  
30  */ 
31
32 #include "orte_all.h"
33
34 /*
35  * AppParamsInit - Initalization default values of an application
36  * @ap: pointer to an application 
37  *
38  */
39 void 
40 AppParamsInit(AppParams *ap) {
41   PROTOCOL_VERSION_1_0(ap->protocolVersion);
42   VENDOR_ID_UNKNOWN(ap->vendorId);
43   NTPTIME_BUILD(ap->expirationTime,180);
44   ap->metatrafficUnicastPort=PORT_INVALID;
45   ap->userdataUnicastPort=PORT_INVALID;
46   ap->unicastIPAddressCount=0;
47   ap->metatrafficMulticastIPAddressCount=0;
48   ap->managerKeyCount=0;
49   SEQUENCE_NUMBER_NONE(ap->vargAppsSequenceNumber);
50 }
51
52 /*
53  * PublParamsInit - Initalization default values of a publisher
54  * @p: pointer to a publisher
55  *
56  */
57 void 
58 PublParamsInit(ORTEPublProp *pp) {
59   pp->expectsAck=ORTE_TRUE;
60   NTPTIME_ZERO(pp->persistence);
61   pp->reliabilityOffered=0;
62   pp->sendQueueSize=1;
63   pp->strength=1;
64   strcpy((char *)pp->topic,"DefaultTopic");
65   strcpy((char *)pp->typeName,"");
66   pp->typeChecksum=0;
67   //additional params
68   NTPTIME_BUILD(pp->maxBlockTime,30);
69   pp->criticalQueueLevel=1;
70   NtpTimeAssembFromMs(pp->HBNornalRate,1,0);
71   NtpTimeAssembFromMs(pp->HBCQLRate,0,50);
72   pp->HBMaxRetries=10;
73 }
74
75 /*
76  * SubsParamsInit - Initalization default values of a subscription
77  * @s: pointer to a subscription
78  *
79  */
80 void 
81 SubsParamsInit(ORTESubsProp *sp) {
82   NTPTIME_ZERO(sp->minimumSeparation);
83   sp->recvQueueSize=1;
84   sp->reliabilityRequested=0;
85   strcpy((char *)sp->topic,"DefaultTopic");
86   strcpy((char *)sp->typeName,"");
87   sp->typeChecksum=0;
88 //  s->rcvMessageCallBack=NULL;
89 //  s->deadline=NTPTIME_ZERO;
90 }
91
92 /*
93  * UpdateORTEAppInfo - 
94  * @appParams: pointer to a source of data
95  * @appInfo: pointer to a destination of data
96  *
97  */
98 void
99 updateORTEAppInfo(AppParams *appParams,ORTEAppInfo *appInfo) {
100   appInfo->hostId=
101       appParams->hostId;
102   appInfo->appId=
103       appParams->appId;
104   appInfo->unicastIPAddressList=
105       appParams->unicastIPAddressList;
106   appInfo->unicastIPAddressCount=
107       appParams->unicastIPAddressCount;
108   appInfo->metatrafficMulticastIPAddressList=
109       appParams->metatrafficMulticastIPAddressList;
110   appInfo->metatrafficMulticastIPAddressCount=
111       appParams->metatrafficMulticastIPAddressCount;
112   appInfo->metatrafficUnicastPort=
113       appParams->metatrafficUnicastPort;
114   appInfo->userdataUnicastPort=
115       appParams->userdataUnicastPort;
116   appInfo->vendorId=
117       appParams->vendorId;
118   appInfo->protocolVersion=
119      appParams->protocolVersion;
120 }
121
122 /*
123  * generateEvent - Generate new and delete event up to an application
124  * @objectEntryOID: pointer to a OID structure
125  * @live: ORTE_TRUE if object is live
126  *
127  * Return: return ORTE_TRUE if object is acceptable by ORTE (new events)
128  */
129 Boolean
130 generateEvent(ORTEDomain *d,GUID_RTPS *guid,void *params,Boolean live) {
131   ObjectEntryOID  *objectEntryOID;
132   GUID_RTPS       guidapp;
133   Boolean         result=ORTE_TRUE;
134   
135   //generate event 
136   switch (guid->oid & 0x07) {
137     case OID_APPLICATION:
138         updateORTEAppInfo((AppParams*)params,&d->appInfo);
139         if (((guid->aid & 0x03)==MANAGER) && 
140             (d->domainEvents.onMgrNew) && live) 
141           result=d->domainEvents.onMgrNew(&d->appInfo,
142                                           d->domainEvents.onMgrNewParam);
143         if (((guid->aid & 0x03)==MANAGER) && 
144             (d->domainEvents.onMgrDelete) && (!live)) 
145           d->domainEvents.onMgrDelete(&d->appInfo,
146                                       d->domainEvents.onMgrDeleteParam);
147         if (((guid->aid & 0x03)==MANAGEDAPPLICATION) && 
148             (d->domainEvents.onAppRemoteNew) && live) 
149           result=d->domainEvents.onAppRemoteNew(&d->appInfo,
150                                           d->domainEvents.onAppRemoteNewParam);
151         if (((guid->aid & 0x03)==MANAGEDAPPLICATION) && 
152             (d->domainEvents.onAppDelete) && !live) 
153           d->domainEvents.onAppDelete(&d->appInfo,
154                                       d->domainEvents.onAppDeleteParam);
155       break;
156     case OID_PUBLICATION:
157       guidapp.hid=guid->hid;
158       guidapp.aid=guid->aid;
159       guidapp.oid=OID_APP;
160       objectEntryOID=objectEntryFind(d,&guidapp);
161       if (!objectEntryOID) return ORTE_FALSE;
162       updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);   
163       d->pubInfo.topic=(char*)((ORTEPublProp*)params)->topic;
164       d->pubInfo.type=(char*)((ORTEPublProp*)params)->typeName;
165       d->pubInfo.objectId=guid->oid;
166       if ((d->domainEvents.onPubRemoteNew) && live) 
167         result=d->domainEvents.onPubRemoteNew(&d->appInfo,&d->pubInfo,
168                                         d->domainEvents.onPubRemoteNewParam);
169       if ((d->domainEvents.onPubDelete) && !live) 
170         d->domainEvents.onPubDelete(&d->appInfo,&d->pubInfo,
171                                     d->domainEvents.onPubDeleteParam);
172       
173       break;
174     case OID_SUBSCRIPTION:
175       guidapp.hid=guid->hid;
176       guidapp.aid=guid->aid;
177       guidapp.oid=OID_APP;
178       objectEntryOID=objectEntryFind(d,&guidapp);
179       if (!objectEntryOID) return ORTE_FALSE;
180       updateORTEAppInfo((AppParams*)objectEntryOID->attributes,&d->appInfo);   
181       d->subInfo.topic=(char*)((ORTESubsProp*)params)->topic;
182       d->subInfo.type=(char*)((ORTESubsProp*)params)->typeName;
183       d->subInfo.objectId=guid->oid;
184       if ((d->domainEvents.onSubRemoteNew) && (live))
185         result=d->domainEvents.onSubRemoteNew(&d->appInfo,&d->subInfo,
186                                         d->domainEvents.onSubRemoteNewParam);
187       if ((d->domainEvents.onSubDelete) && (!live))
188         d->domainEvents.onSubDelete(&d->appInfo,&d->subInfo,
189                                     d->domainEvents.onSubDeleteParam);
190       
191       break;
192   }
193   return result;
194 }
195
196 /*
197  * GetTypeApp - Test if application is MOM or OAM
198  * @d: pointer to a domain
199  * @ap 
200  * @senderIPAddress:
201  *
202  * Return: return ORTE_TRUE if application MOM
203  */
204 Boolean
205 getTypeApp(ORTEDomain *d,AppParams *ap,IPAddress senderIPAddress) {
206   Boolean       result=ORTE_FALSE;
207   uint16_t      i,j,k;
208   
209   //test if the app is MOM
210   for (i=0;i<d->appParams->managerKeyCount;i++) {
211     for (j=0;j<ap->managerKeyCount;j++) {
212       if (ap->managerKeyList[j]!=StringToIPAddress("127.0.0.1")) {
213         if (ap->managerKeyList[j]==d->appParams->managerKeyList[i])
214           result=ORTE_TRUE;
215       } else {
216         if (senderIPAddress==StringToIPAddress("127.0.0.1"))
217           result=ORTE_TRUE;
218         for (k=0;k<d->domainProp.IFCount;k++) {
219           if (d->domainProp.IFProp[k].ipAddress==senderIPAddress)
220             result=ORTE_TRUE;
221         }
222       }
223     }
224   }
225   return result;
226 }
227
228 /*
229  * matchMulticastAddresses - Test if objects contain same a multicast ip address
230  * @o1: pointer to a object
231  * @o2: pointer to a object
232  *
233  * Return: return ORTE_TRUE if a multicast ip address was match
234  */
235 Boolean
236 matchMulticastAddresses(ObjectEntryOID *o1,ObjectEntryOID *o2) 
237 {
238   AppParams     *ap1,*ap2;
239   uint16_t      i,j;
240   
241   if ((o1->guid.oid!=OID_APP) || 
242       (o1->guid.oid!=OID_APP)) return ORTE_FALSE;
243
244   ap1=o1->attributes;
245   ap2=o2->attributes;
246   for (i=0;i<ap1->metatrafficMulticastIPAddressCount;i++) {
247     for (j=0;j<ap2->metatrafficMulticastIPAddressCount;j++) {
248       if (ap1->metatrafficMulticastIPAddressList[i]==
249           ap2->metatrafficMulticastIPAddressList[j])
250           return ORTE_TRUE;
251     }
252   }
253   return ORTE_FALSE;
254 }
255
256 /*
257  * appSelfParamChanged - Self parameters changed
258  * @d: pointer to an domain
259  * @lock: lock CSTWriters at the start of function
260  * @unlock: unlock CSTWriters at the end of function
261  * @alive:
262  *
263  */
264 void 
265 appSelfParamChanged(ORTEDomain *d,
266     Boolean lock,Boolean unlock,Boolean forWM,Boolean alive) {
267   CSChange     *csChange;
268      
269   if (lock) {
270     pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
271     if (forWM)
272       pthread_rwlock_wrlock(&d->writerManagers.lock);
273   }
274   csChange=(CSChange*)MALLOC(sizeof(CSChange));
275   parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
276   csChange->guid=d->guid;
277   csChange->alive=alive;
278   csChange->cdrCodec.buffer=NULL;
279   CSTWriterAddCSChange(d,&d->writerApplicationSelf,csChange);
280   if (forWM) {
281     csChange=(CSChange*)MALLOC(sizeof(CSChange));
282     parameterUpdateCSChange(csChange,d->appParams,ORTE_TRUE);
283     csChange->guid=d->guid;
284     csChange->alive=alive;
285     csChange->cdrCodec.buffer=NULL;
286     CSTWriterAddCSChange(d,&d->writerManagers,csChange);
287   }
288   if (unlock) {
289     pthread_rwlock_unlock(&d->writerApplicationSelf.lock);
290     if (forWM)
291       pthread_rwlock_unlock(&d->writerManagers.lock);
292   }
293 }
294
295 /*
296  * getAppO2SRemoteReader - returns pointer to virtual multicat object in case multicast application
297  * @d: pointer to an domain
298  * @objectEntryOID:
299  * @ap: pointer to an application 
300  *
301  */
302 ObjectEntryOID *
303 getAppO2SRemoteReader(ORTEDomain *d,ObjectEntryOID *objectEntryOID,
304     AppParams *ap) {
305   GUID_RTPS         guid;
306   AppParams         *map;
307   IPAddress         maddr;
308
309   maddr=ap->metatrafficMulticastIPAddressList[0];
310   if (ap->metatrafficMulticastIPAddressCount &&
311       IN_MULTICAST(maddr)) {
312     map=(AppParams*)MALLOC(sizeof(AppParams));
313     guid.hid=maddr;
314     guid.aid=AID_UNKNOWN;
315     guid.oid=OID_APP;
316     objectEntryOID=objectEntryFind(d,&guid);
317     if (!objectEntryOID) {
318       memcpy(map,ap,sizeof(AppParams));
319       objectEntryOID=objectEntryAdd(d,&guid,(void*)map);
320       Domain2PortMulticastMetatraffic(d->domain,
321                                       objectEntryOID->multicastPort);
322       debug(9,2) ("new multicast application 0x%x-0x%x-0x%x temporary created\n",
323                    GUID_PRINTF(guid));
324     }
325   }
326   return objectEntryOID;
327 }
328
329 /*
330  * getSubsO2SRemoteReader - returns pointer to virtual multicat object in case multicast subscription
331  * @d: pointer to an domain
332  * @objectEntryOID:
333  * @sp: pointer to a subscription
334  *
335  */
336 ObjectEntryOID *
337 getSubsO2SRemoteReader(ORTEDomain *d,ObjectEntryOID *objectEntryOID,
338     ORTESubsProp *sp) {
339   AppParams         *map;
340   GUID_RTPS         guid;
341
342   if (IN_MULTICAST(sp->multicast)) {
343     map=(AppParams*)MALLOC(sizeof(AppParams));
344     guid.hid=sp->multicast;
345     guid.aid=AID_UNKNOWN;
346     guid.oid=OID_APP;
347     objectEntryOID=objectEntryFind(d,&guid);
348     if (!objectEntryOID) {
349       AppParamsInit(map);
350       map->metatrafficMulticastIPAddressList[0]=sp->multicast;
351       map->metatrafficMulticastIPAddressCount=1;
352       objectEntryOID=objectEntryAdd(d,&guid,(void*)map);
353       Domain2PortMulticastUserdata(d->domain,
354                                    objectEntryOID->multicastPort);
355       debug(9,2) ("new subs. multicast application 0x%x-0x%x-0x%x temporary created\n",
356                    GUID_PRINTF(guid));
357     }
358   }
359   return objectEntryOID;
360 }