2 * $Id: RTPSCSTWriterTimer.c,v 0.0.0.1 2003/10/19
4 * DEBUG: section 52 CSTWriter timer functions
5 * AUTHOR: Petr Smolik petr.smolik@wo.cz
7 * ORTE - OCERA Real-Time Ethernet http://www.ocera.org/
8 * --------------------------------------------------------------------
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.
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.
24 /*****************************************************************************/
26 CSTWriterRegistrationTimer(ORTEDomain *d,void *vcstWriter) {
27 CSTWriter *cstWriter=(CSTWriter*)vcstWriter;
28 CSTRemoteReader *cstRemoteReader;
30 debug(52,10) ("CSTWriterRegistrationTimer: start\n");
32 debug(52,5) ("CSTWriterRegistrationTimer: OID: 0xx%x - retries = %d\n",
33 cstWriter->guid.oid,cstWriter->registrationCounter);
35 cstWriter->objectEntryOID->objectEntryAID,
36 &cstWriter->registrationTimer,
39 if (cstWriter->registrationCounter!=0) {
40 cstWriter->registrationCounter--;
41 gavl_cust_for_each(CSTRemoteReader,cstWriter,cstRemoteReader) {
42 CSTWriterRefreshAllCSChanges(d,cstRemoteReader);
45 cstWriter->objectEntryOID->objectEntryAID,
46 &cstWriter->registrationTimer,
48 "CSTWriterRegistrationTimer",
49 CSTWriterRegistrationTimer,
52 &cstWriter->params.registrationPeriod);
54 if (d->domainEvents.onRegFail) {
55 d->domainEvents.onRegFail(d->domainEvents.onRegFailParam);
59 debug(52,10) ("CSTWriterRegistrationTimer: finished\n");
64 /*****************************************************************************/
66 CSTWriterRefreshTimer(ORTEDomain *d,void *vcstWriter) {
67 CSTWriter *cstWriter=(CSTWriter*)vcstWriter;
68 CSTRemoteReader *cstRemoteReader;
70 debug(52,10) ("CSTWriterRefreshTimer: start\n");
72 gavl_cust_for_each(CSTRemoteReader,cstWriter,cstRemoteReader) {
73 CSTWriterRefreshAllCSChanges(d,cstRemoteReader);
76 cstWriter->objectEntryOID->objectEntryAID,
77 &cstWriter->refreshPeriodTimer,
80 cstWriter->objectEntryOID->objectEntryAID,
81 &cstWriter->refreshPeriodTimer,
83 "CSTWriterRefreshTimer",
84 CSTWriterRefreshTimer,
87 &cstWriter->params.refreshPeriod);
88 debug(52,10) ("CSTWriterRefreshTimer: finished\n");
92 /*****************************************************************************/
94 CSTWriterAnnounceTimer(ORTEDomain *d,void *vcstRemoteReader) {
95 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
97 debug(52,10) ("CSTWriterAnnounceTimer: start\n");
98 if ((cstRemoteReader->commStateHB==MAYSENDHB) &&
99 ((!cstRemoteReader->cstWriter->params.fullAcknowledge))) {// ||
100 // (cstRemoteReader->unacknowledgedCounter))) {
102 int len=RTPSHeartBeatCreate(
103 &d->taskSend.mb.cdrCodec,
104 &cstRemoteReader->cstWriter->firstSN,
105 &cstRemoteReader->cstWriter->lastSN,
107 cstRemoteReader->cstWriter->guid.oid,
110 //not enought space in sending buffer
111 d->taskSend.mb.needSend=ORTE_TRUE;
114 debug(52,3) ("sent: RTPS_HBF(0x%x) to 0x%x-0x%x\n",
115 cstRemoteReader->cstWriter->guid.oid,
116 cstRemoteReader->guid.hid,
117 cstRemoteReader->guid.aid);
120 cstRemoteReader->sobject->objectEntryAID,
121 &cstRemoteReader->repeatAnnounceTimer,
124 cstRemoteReader->sobject->objectEntryAID,
125 &cstRemoteReader->repeatAnnounceTimer,
126 1, //metatraffic timer
127 "CSTWriterAnnounceTimer",
128 CSTWriterAnnounceTimer,
129 &cstRemoteReader->cstWriter->lock,
131 &cstRemoteReader->cstWriter->params.repeatAnnounceTime);
132 debug(52,10) ("CSTWriterAnnounceTimer: finished\n");
136 /*****************************************************************************/
138 CSTWriterAnnounceIssueTimer(ORTEDomain *d,void *vcstRemoteReader) {
139 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
144 debug(52,10) ("CSTWriterAnnounceIssueTimer: start\n");
145 pp=(ORTEPublProp*)cstRemoteReader->cstWriter->objectEntryOID->attributes;
147 d->taskSend.mb.cdrCodecDirect=NULL;
148 len=RTPSHeartBeatCreate(
149 &d->taskSend.mb.cdrCodec,
150 &cstRemoteReader->cstWriter->firstSN,
151 &cstRemoteReader->cstWriter->lastSN,
153 cstRemoteReader->cstWriter->guid.oid,
156 //not enought space in sending buffer
157 d->taskSend.mb.needSend=ORTE_TRUE;
160 debug(52,3) ("sent: RTPS_HBF(0x%x) to 0x%x-0x%x\n",
161 cstRemoteReader->cstWriter->guid.oid,
162 cstRemoteReader->guid.hid,
163 cstRemoteReader->guid.aid);
165 if (cstRemoteReader->cstWriter->csChangesCounter>=pp->criticalQueueLevel) {
166 nextHB=pp->HBCQLRate;
168 nextHB=pp->HBNornalRate;
170 cstRemoteReader->HBRetriesCounter++;
172 cstRemoteReader->sobject->objectEntryAID,
173 &cstRemoteReader->repeatAnnounceTimer,
175 if (cstRemoteReader->HBRetriesCounter<pp->HBMaxRetries) {
177 cstRemoteReader->sobject->objectEntryAID,
178 &cstRemoteReader->repeatAnnounceTimer,
179 2, //metatraffic timer
180 "CSTWriterAnnounceIssueTimer",
181 CSTWriterAnnounceIssueTimer,
182 &cstRemoteReader->cstWriter->lock,
186 //destroy all csChangesForReader
187 CSChangeForReader *csChangeForReader;
188 while ((csChangeForReader=CSChangeForReader_first(cstRemoteReader))) {
189 CSTWriterDestroyCSChangeForReader(
190 csChangeForReader,ORTE_TRUE);
192 debug(52,3) ("CSTWriterAnnounceIssueTimer: HB RR(0x%x-0x%x) ritch MaxRetries\n",
193 cstRemoteReader->guid.hid,cstRemoteReader->guid.aid);
195 debug(52,10) ("CSTWriterAnnounceIssueTimer: finished\n");
199 /**********************************************************************************/
201 CSChangeForReaderUnderwayTimer(ORTEDomain *d,void *vcsChangeForReader) {
202 CSChangeForReader *csChangeForReader=(CSChangeForReader*)vcsChangeForReader;
203 csChangeForReader->commStateChFReader=UNACKNOWLEDGED;
207 /**********************************************************************************/
209 CSTWriterSendBestEffortTimer(ORTEDomain *d,void *vcstRemoteReader) {
210 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
211 ORTESubsProp *sp=(ORTESubsProp*)cstRemoteReader->pobject->attributes;
212 CSChangeForReader *csChangeForReader=NULL;
214 debug(52,10) ("CSTWriterSendBestEffortTimer: start\n");
215 d->taskSend.mb.cdrCodecDirect=NULL;
216 if (cstRemoteReader->commStateSend!=NOTHNIGTOSEND) {
217 gavl_cust_for_each(CSChangeForReader,cstRemoteReader,csChangeForReader) {
218 if (csChangeForReader->commStateChFReader==TOSEND) {
219 CSChange *csChange=csChangeForReader->csChange;
221 csChangeForReader->commStateChFReader=UNDERWAY;
222 cstRemoteReader->commStateSend=MUSTSENDDATA;
223 cstRemoteReader->lastSentIssueTime=getActualNtpTime();
224 d->taskSend.mb.cdrCodecDirect=&csChange->cdrCodec;
226 if (cstRemoteReader->sobject) {
227 debug(52,3) ("sent: RTPS_ISSUE_BEST(0x%x) to 0x%x-0x%x-0x%x\n",
228 cstRemoteReader->cstWriter->guid.oid,
229 GUID_PRINTF(cstRemoteReader->sobject->guid));
233 cstRemoteReader->sobject->objectEntryAID,
236 //it's not nessecary to NewState, there is setuped only new state & after is deleted
237 CSTWriterCSChangeForReaderNewState(csChangeForReader);
239 /* mark multicast messages like processed */
240 CSTWriterMulticast(csChangeForReader);
242 CSTWriterDestroyCSChangeForReader(
243 csChangeForReader,ORTE_TRUE);
246 cstRemoteReader->sobject->objectEntryAID,
247 &cstRemoteReader->delayResponceTimer,
250 //when is no csChange -> break processing
251 if (cstRemoteReader->cstWriter->csChangesCounter==0)
255 cstRemoteReader->sobject->objectEntryAID,
256 &cstRemoteReader->delayResponceTimer,
258 "CSTWriterSendBestEffortTimer",
259 CSTWriterSendBestEffortTimer,
260 &cstRemoteReader->cstWriter->lock,
262 &sp->minimumSeparation);
268 debug(52,10) ("CSTWriterSendBestEffortTimer: finished\n");
272 /**********************************************************************************/
274 CSTWriterSendStrictTimer(ORTEDomain *d,void *vcstRemoteReader) {
275 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
276 CSChangeForReader *csChangeForReader=NULL;
277 int len,data_offset,wptr_max;
279 Boolean firstTrace=ORTE_TRUE;
281 debug(52,10) ("CSTWriterSendStrictTimer: start\n");
282 if (cstRemoteReader->commStateSend!=NOTHNIGTOSEND) {
283 gavl_cust_for_each(CSChangeForReader,cstRemoteReader,csChangeForReader) {
284 csChange=csChangeForReader->csChange;
285 if (csChangeForReader->commStateChFReader==TOSEND) {
286 cstRemoteReader->commStateSend=MUSTSENDDATA;
288 wptr_max=d->taskSend.mb.cdrCodec.wptr_max;
289 d->taskSend.mb.cdrCodec.wptr_max=csChange->cdrCodec.wptr_max;
291 if ((firstTrace) && (cstRemoteReader->cstWriter->params.fullAcknowledge) &&
292 !d->taskSend.mb.containsInfoReply) {
293 AppParams *ap=cstRemoteReader->cstWriter->objectEntryOID->attributes;
294 firstTrace=ORTE_FALSE;
295 len=RTPSInfoREPLYCreate(&d->taskSend.mb.cdrCodec,
297 ap->userdataUnicastPort);
299 d->taskSend.mb.needSend=ORTE_TRUE;
300 d->taskSend.mb.cdrCodec.wptr_max=wptr_max;
303 d->taskSend.mb.containsInfoReply=ORTE_TRUE;
304 debug(52,3) ("sent: RTPS_InfoREPLY(0x%x) to 0x%x-0x%x\n",
305 cstRemoteReader->cstWriter->guid.oid,
306 cstRemoteReader->guid.hid,
307 cstRemoteReader->guid.aid);
310 data_offset=RTPS_HEADER_LENGTH+12;
311 if (CDR_buffer_puts(&d->taskSend.mb.cdrCodec,
312 csChange->cdrCodec.buffer+data_offset, //src
313 csChange->cdrCodec.wptr-data_offset)==CORBA_FALSE) {
314 d->taskSend.mb.needSend=ORTE_TRUE;
315 d->taskSend.mb.cdrCodec.wptr_max=wptr_max;
319 d->taskSend.mb.cdrCodec.wptr_max=wptr_max;
321 /* setup new state for csChangeForReader */
322 CSTWriterCSChangeForReaderNewState(csChangeForReader);
324 /* mark multicast messages like processed */
325 CSTWriterMulticast(csChangeForReader);
327 debug(52,3) ("sent: RTPS_ISSUE_STRICT(0x%x) to 0x%x-0x%x\n",
328 cstRemoteReader->cstWriter->guid.oid,
329 cstRemoteReader->guid.hid,
330 cstRemoteReader->guid.aid);
334 debug(52,10) ("CSTWriterSendStrictTimer: finished\n");
336 return CSTWriterAnnounceIssueTimer(d,cstRemoteReader);
339 /**********************************************************************************/
341 CSTWriterSendTimer(ORTEDomain *d,void *vcstRemoteReader) {
342 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
343 CSChangeForReader *csChangeForReader=NULL;
344 Boolean firstTrace=ORTE_TRUE,f_bit=ORTE_TRUE;
346 debug(52,10) ("CSTWriterSendTimer: start\n");
348 /* setup f_bit of object */
349 if (cstRemoteReader->cstWriter->params.fullAcknowledge)
352 if (cstRemoteReader->commStateSend!=NOTHNIGTOSEND) {
354 gavl_cust_for_each(CSChangeForReader,cstRemoteReader,csChangeForReader) {
356 if (csChangeForReader->commStateChFReader==TOSEND) {
357 cstRemoteReader->commStateSend=MUSTSENDDATA;
360 if ((firstTrace) && (cstRemoteReader->cstWriter->params.fullAcknowledge) &&
361 !d->taskSend.mb.containsInfoReply) {
362 AppParams *ap=cstRemoteReader->cstWriter->objectEntryOID->attributes;
363 firstTrace=ORTE_FALSE;
364 if (RTPSInfoREPLYCreate(&d->taskSend.mb.cdrCodec,
366 ap->metatrafficUnicastPort) < 0) {
367 d->taskSend.mb.needSend=ORTE_TRUE;
370 d->taskSend.mb.containsInfoReply=ORTE_TRUE;
371 debug(52,3) ("sent: RTPS_InfoREPLY from 0x%x-0x%x-0x%x to 0x%x-0x%x-0x%x\n",
372 GUID_PRINTF(cstRemoteReader->cstWriter->guid),
373 GUID_PRINTF(cstRemoteReader->guid));
377 if (SeqNumberCmp(csChangeForReader->csChange->gapSN,noneSN)==0) {
378 debug(52,3) ("sent: RTPS_VAR from 0x%x-0x%x-0x%x to 0x%x-0x%x-0x%x\n",
379 GUID_PRINTF(cstRemoteReader->cstWriter->guid),
380 GUID_PRINTF(cstRemoteReader->guid));
382 if (RTPSVarCreate(&d->taskSend.mb.cdrCodec,
384 cstRemoteReader->cstWriter->guid.oid,
385 csChangeForReader->csChange) < 0) {
386 d->taskSend.mb.needSend=ORTE_TRUE;
392 debug(52,3) ("sent: RTPS_GAP from 0x%x-0x%x-0x%x to 0x%x-0x%x-0x%x\n",
393 GUID_PRINTF(cstRemoteReader->cstWriter->guid),
394 GUID_PRINTF(cstRemoteReader->guid));
396 if (RTPSGapCreate(&d->taskSend.mb.cdrCodec,
398 cstRemoteReader->cstWriter->guid.oid,
399 csChangeForReader->csChange) < 0) {
400 d->taskSend.mb.needSend=ORTE_TRUE;
405 /* setup new state for csChangeForReader */
406 CSTWriterCSChangeForReaderNewState(csChangeForReader);
408 /* mark multicast messages like processed */
409 CSTWriterMulticast(csChangeForReader);
412 } /* gavl_cust_for_each */
414 cstRemoteReader->commStateHB=MUSTSENDHB;
418 if (cstRemoteReader->commStateHB==MUSTSENDHB) {
420 if (RTPSHeartBeatCreate(
421 &d->taskSend.mb.cdrCodec,
422 &cstRemoteReader->cstWriter->firstSN,
423 &cstRemoteReader->cstWriter->lastSN,
425 cstRemoteReader->cstWriter->guid.oid,
427 d->taskSend.mb.needSend=ORTE_TRUE;
430 //schedule new time for Announce timer
432 cstRemoteReader->sobject->objectEntryAID,
433 &cstRemoteReader->repeatAnnounceTimer,
436 cstRemoteReader->sobject->objectEntryAID,
437 &cstRemoteReader->repeatAnnounceTimer,
438 1, //metatraffic timer
439 "CSTWriterAnnounceTimer",
440 CSTWriterAnnounceTimer,
441 &cstRemoteReader->cstWriter->lock,
443 &cstRemoteReader->cstWriter->params.repeatAnnounceTime);
446 debug(52,3) ("sent: RTPS_HB from 0x%x-0x%x-0x%x to 0x%x-0x%x-0x%x\n",
447 GUID_PRINTF(cstRemoteReader->cstWriter->guid),
448 GUID_PRINTF(cstRemoteReader->guid));
450 cstRemoteReader->commStateHB=MAYSENDHB;
453 debug(52,10) ("CSTWriterSendTimer: finished\n");