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