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) {
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);
53 * PublParamsInit - Initalization default values of a publisher
54 * @p: pointer to a publisher
58 PublParamsInit(ORTEPublProp *pp) {
59 pp->expectsAck=ORTE_TRUE;
60 NTPTIME_ZERO(pp->persistence);
61 pp->reliabilityOffered=0;
64 strcpy((char *)pp->topic,"DefaultTopic");
65 strcpy((char *)pp->typeName,"");
68 NTPTIME_BUILD(pp->maxBlockTime,30);
69 pp->criticalQueueLevel=1;
70 NtpTimeAssembFromMs(pp->HBNornalRate,1,0);
71 NtpTimeAssembFromMs(pp->HBCQLRate,0,50);
76 * SubsParamsInit - Initalization default values of a subscription
77 * @s: pointer to a subscription
81 SubsParamsInit(ORTESubsProp *sp) {
82 NTPTIME_ZERO(sp->minimumSeparation);
84 sp->reliabilityRequested=0;
85 strcpy((char *)sp->topic,"DefaultTopic");
86 strcpy((char *)sp->typeName,"");
88 // s->rcvMessageCallBack=NULL;
89 // s->deadline=NTPTIME_ZERO;
94 * @appParams: pointer to a source of data
95 * @appInfo: pointer to a destination of data
99 updateORTEAppInfo(AppParams *appParams,ORTEAppInfo *appInfo) {
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;
118 appInfo->protocolVersion=
119 appParams->protocolVersion;
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
127 * Return: return ORTE_TRUE if object is acceptable by ORTE (new events)
130 generateEvent(ORTEDomain *d,GUID_RTPS *guid,void *params,Boolean live) {
131 ObjectEntryOID *objectEntryOID;
133 Boolean result=ORTE_TRUE;
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);
156 case OID_PUBLICATION:
157 guidapp.hid=guid->hid;
158 guidapp.aid=guid->aid;
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);
174 case OID_SUBSCRIPTION:
175 guidapp.hid=guid->hid;
176 guidapp.aid=guid->aid;
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);
197 * GetTypeApp - Test if application is MOM or OAM
198 * @d: pointer to a domain
202 * Return: return ORTE_TRUE if application MOM
205 getTypeApp(ORTEDomain *d,AppParams *ap,IPAddress senderIPAddress) {
206 Boolean result=ORTE_FALSE;
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])
216 if (senderIPAddress==StringToIPAddress("127.0.0.1"))
218 for (k=0;k<d->domainProp.IFCount;k++) {
219 if (d->domainProp.IFProp[k].ipAddress==senderIPAddress)
229 * matchMulticastAddresses - Test if objects contain same a multicast ip address
230 * @o1: pointer to a object
231 * @o2: pointer to a object
233 * Return: return ORTE_TRUE if a multicast ip address was match
236 matchMulticastAddresses(ObjectEntryOID *o1,ObjectEntryOID *o2)
241 if ((o1->guid.oid!=OID_APP) ||
242 (o1->guid.oid!=OID_APP)) return ORTE_FALSE;
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])
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
265 appSelfParamChanged(ORTEDomain *d,
266 Boolean lock,Boolean unlock,Boolean forWM,Boolean alive) {
270 pthread_rwlock_wrlock(&d->writerApplicationSelf.lock);
272 pthread_rwlock_wrlock(&d->writerManagers.lock);
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);
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);
289 pthread_rwlock_unlock(&d->writerApplicationSelf.lock);
291 pthread_rwlock_unlock(&d->writerManagers.lock);
296 * getAppO2SRemoteReader - returns pointer to virtual multicat object in case multicast application
297 * @d: pointer to an domain
299 * @ap: pointer to an application
303 getAppO2SRemoteReader(ORTEDomain *d,ObjectEntryOID *objectEntryOID,
309 maddr=ap->metatrafficMulticastIPAddressList[0];
310 if (ap->metatrafficMulticastIPAddressCount &&
311 IN_MULTICAST(maddr)) {
312 map=(AppParams*)MALLOC(sizeof(AppParams));
314 guid.aid=AID_UNKNOWN;
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",
326 return objectEntryOID;
330 * getSubsO2SRemoteReader - returns pointer to virtual multicat object in case multicast subscription
331 * @d: pointer to an domain
333 * @sp: pointer to a subscription
337 getSubsO2SRemoteReader(ORTEDomain *d,ObjectEntryOID *objectEntryOID,
342 if (IN_MULTICAST(sp->multicast)) {
343 map=(AppParams*)MALLOC(sizeof(AppParams));
344 guid.hid=sp->multicast;
345 guid.aid=AID_UNKNOWN;
347 objectEntryOID=objectEntryFind(d,&guid);
348 if (!objectEntryOID) {
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",
359 return objectEntryOID;