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