2 * $Id: objectUtils.c,v 0.0.0.1 2003/09/10
4 * DEBUG: section 9 Functions with objets
6 * -------------------------------------------------------------------
8 * Open Real-Time Ethernet
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
15 * Author: Petr Smolik petr@smoliku.cz
17 * Project Responsible: Zdenek Hanzalek
18 * --------------------------------------------------------------------
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.
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.
35 * AppParamsInit - Initalization default values of an application
36 * @ap: pointer to an application
40 AppParamsInit(AppParams *ap)
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);
54 * PublParamsInit - Initalization default values of a publisher
55 * @p: pointer to a publisher
59 PublParamsInit(ORTEPublProp *pp)
61 pp->expectsAck = ORTE_TRUE;
62 NTPTIME_ZERO(pp->persistence);
63 pp->reliabilityOffered = 0;
64 pp->sendQueueSize = 1;
66 strcpy((char *)pp->topic, "DefaultTopic");
67 strcpy((char *)pp->typeName, "");
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;
78 * SubsParamsInit - Initalization default values of a subscription
79 * @s: pointer to a subscription
83 SubsParamsInit(ORTESubsProp *sp)
85 NTPTIME_ZERO(sp->minimumSeparation);
86 sp->recvQueueSize = 1;
87 sp->reliabilityRequested = 0;
88 strcpy((char *)sp->topic, "DefaultTopic");
89 strcpy((char *)sp->typeName, "");
91 // s->rcvMessageCallBack=NULL;
92 // s->deadline=NTPTIME_ZERO;
97 * @appParams: pointer to a source of data
98 * @appInfo: pointer to a destination of data
102 updateORTEAppInfo(AppParams *appParams, ORTEAppInfo *appInfo)
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;
122 appInfo->protocolVersion =
123 appParams->protocolVersion;
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
131 * Return: return ORTE_TRUE if object is acceptable by ORTE (new events)
134 generateEvent(ORTEDomain *d, GUID_RTPS *guid, void *params, Boolean live)
136 ObjectEntryOID *objectEntryOID;
138 Boolean result = ORTE_TRUE;
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);
161 case OID_PUBLICATION:
162 guidapp.hid = guid->hid;
163 guidapp.aid = guid->aid;
164 guidapp.oid = OID_APP;
165 objectEntryOID = objectEntryFind(d, &guidapp);
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);
180 case OID_SUBSCRIPTION:
181 guidapp.hid = guid->hid;
182 guidapp.aid = guid->aid;
183 guidapp.oid = OID_APP;
184 objectEntryOID = objectEntryFind(d, &guidapp);
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);
204 * GetTypeApp - Test if application is MOM or OAM
205 * @d: pointer to a domain
209 * Return: return ORTE_TRUE if application MOM
212 getTypeApp(ORTEDomain *d, AppParams *ap, IPAddress senderIPAddress)
214 Boolean result = ORTE_FALSE;
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])
224 if (senderIPAddress == StringToIPAddress("127.0.0.1"))
226 for (k = 0; k < d->domainProp.IFCount; k++) {
227 if (d->domainProp.IFProp[k].ipAddress == senderIPAddress)
237 * matchMulticastAddresses - Test if objects contain same a multicast ip address
238 * @o1: pointer to a object
239 * @o2: pointer to a object
241 * Return: return ORTE_TRUE if a multicast ip address was match
244 matchMulticastAddresses(ObjectEntryOID *o1, ObjectEntryOID *o2)
246 AppParams *ap1, *ap2;
249 if (o1->guid.oid != OID_APP)
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])
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
273 appSelfParamChanged(ORTEDomain *d,
274 Boolean lock, Boolean unlock, Boolean forWM, Boolean alive)
279 pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
281 pthread_rwlock_wrlock(&d->writerManagers.lock);
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);
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);
298 pthread_rwlock_unlock(&d->writerApplicationSelf.lock);
300 pthread_rwlock_unlock(&d->writerManagers.lock);
305 * getAppO2SRemoteReader - returns pointer to virtual multicat object in case multicast application
306 * @d: pointer to an domain
308 * @ap: pointer to an application
312 getAppO2SRemoteReader(ORTEDomain *d, ObjectEntryOID *objectEntryOID,
319 maddr = ap->metatrafficMulticastIPAddressList[0];
320 if (ap->metatrafficMulticastIPAddressCount &&
321 IN_MULTICAST(maddr)) {
322 map = (AppParams *)MALLOC(sizeof(AppParams));
324 guid.aid = AID_UNKNOWN;
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",
336 return objectEntryOID;
340 * getSubsO2SRemoteReader - returns pointer to virtual multicat object in case multicast subscription
341 * @d: pointer to an domain
343 * @sp: pointer to a subscription
347 getSubsO2SRemoteReader(ORTEDomain *d, ObjectEntryOID *objectEntryOID,
353 if (IN_MULTICAST(sp->multicast)) {
354 map = (AppParams *)MALLOC(sizeof(AppParams));
355 guid.hid = sp->multicast;
356 guid.aid = AID_UNKNOWN;
358 objectEntryOID = objectEntryFind(d, &guid);
359 if (!objectEntryOID) {
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",
370 return objectEntryOID;