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 CSTWriterRefreshTimer(ORTEDomain *d,void *vcstWriter) {
27 CSTWriter *cstWriter=(CSTWriter*)vcstWriter;
28 CSTRemoteReader *cstRemoteReader;
30 debug(52,10) ("CSTWriterRefreshTimer: start\n");
32 gavl_cust_for_each(CSTRemoteReader,cstWriter,cstRemoteReader) {
33 CSTWriterRefreshAllCSChanges(d,cstRemoteReader);
36 cstWriter->objectEntryOID->objectEntryAID,
37 &cstWriter->refreshPeriodTimer,
40 cstWriter->objectEntryOID->objectEntryAID,
41 &cstWriter->refreshPeriodTimer,
43 "CSTWriterRefreshTimer",
44 CSTWriterRefreshTimer,
47 &cstWriter->params.refreshPeriod);
48 debug(52,10) ("CSTWriterRefreshTimer: finished\n");
52 /*****************************************************************************/
54 CSTWriterAnnounceTimer(ORTEDomain *d,void *vcstRemoteReader) {
55 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
57 debug(52,10) ("CSTWriterAnnounceTimer: start\n");
58 if ((cstRemoteReader->commStateHB==MAYSENDHB) &&
59 ((!cstRemoteReader->cstWriter->params.fullAcknowledge))) {// ||
60 // (cstRemoteReader->unacknowledgedCounter))) {
62 int len=RTPSHeardBeatCreate(
63 d->mbSend.cdrStream.bufferPtr,
64 getMaxMessageLength(d),
65 &cstRemoteReader->cstWriter->firstSN,
66 &cstRemoteReader->cstWriter->lastSN,
67 cstRemoteReader->cstWriter->guid.oid,
71 //not enought space in sending buffer
72 d->mbSend.needSend=ORTE_TRUE;
75 d->mbSend.cdrStream.bufferPtr+=len;
76 d->mbSend.cdrStream.length+=len;
77 debug(52,3) ("sent: RTPS_HBF(0x%x) to 0x%x-0x%x\n",
78 cstRemoteReader->cstWriter->guid.oid,
79 cstRemoteReader->guid.hid,
80 cstRemoteReader->guid.aid);
83 cstRemoteReader->objectEntryOID->objectEntryAID,
84 &cstRemoteReader->repeatAnnounceTimer,
87 cstRemoteReader->objectEntryOID->objectEntryAID,
88 &cstRemoteReader->repeatAnnounceTimer,
89 1, //metatraffic timer
90 "CSTWriterAnnounceTimer",
91 CSTWriterAnnounceTimer,
92 &cstRemoteReader->cstWriter->lock,
94 &cstRemoteReader->cstWriter->params.repeatAnnounceTime);
95 debug(52,10) ("CSTWriterAnnounceTimer: finished\n");
99 /*****************************************************************************/
101 CSTWriterAnnounceIssueTimer(ORTEDomain *d,void *vcstRemoteReader) {
102 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
106 debug(52,10) ("CSTWriterAnnounceIssueTimer: start\n");
107 pp=(ORTEPublProp*)cstRemoteReader->cstWriter->objectEntryOID->attributes;
109 d->mbSend.cdrStreamDirect=NULL;
110 int len=RTPSHeardBeatCreate(
111 d->mbSend.cdrStream.bufferPtr,
112 getMaxMessageLength(d),
113 &cstRemoteReader->cstWriter->firstSN,
114 &cstRemoteReader->cstWriter->lastSN,
115 cstRemoteReader->cstWriter->guid.oid,
119 //not enought space in sending buffer
120 d->mbSend.needSend=ORTE_TRUE;
123 d->mbSend.cdrStream.bufferPtr+=len;
124 d->mbSend.cdrStream.length+=len;
125 debug(52,3) ("sent: RTPS_HBF(0x%x) to 0x%x-0x%x\n",
126 cstRemoteReader->cstWriter->guid.oid,
127 cstRemoteReader->guid.hid,
128 cstRemoteReader->guid.aid);
130 if (cstRemoteReader->cstWriter->csChangesCounter>=pp->criticalQueueLevel) {
131 nextHB=pp->HBCQLRate;
133 nextHB=pp->HBNornalRate;
135 cstRemoteReader->HBRetriesCounter++;
137 cstRemoteReader->objectEntryOID->objectEntryAID,
138 &cstRemoteReader->repeatAnnounceTimer,
140 if (cstRemoteReader->HBRetriesCounter<pp->HBMaxRetries) {
142 cstRemoteReader->objectEntryOID->objectEntryAID,
143 &cstRemoteReader->repeatAnnounceTimer,
144 2, //metatraffic timer
145 "CSTWriterAnnounceIssueTimer",
146 CSTWriterAnnounceIssueTimer,
147 &cstRemoteReader->cstWriter->lock,
151 //destroy all csChangesForReader
152 CSChangeForReader *csChangeForReader;
153 while ((csChangeForReader=CSChangeForReader_first(cstRemoteReader))) {
154 CSTWriterDestroyCSChangeForReader(cstRemoteReader,
155 csChangeForReader,ORTE_TRUE);
157 debug(52,3) ("CSTWriterAnnounceIssueTimer: HB RR(0x%x-0x%x) ritch MaxRetries\n",
158 cstRemoteReader->guid.hid,cstRemoteReader->guid.aid);
160 debug(52,10) ("CSTWriterAnnounceIssueTimer: finished\n");
164 /**********************************************************************************/
166 CSChangeForReaderUnderwayTimer(ORTEDomain *d,void *vcsChangeForReader) {
167 CSChangeForReader *csChangeForReader=(CSChangeForReader*)vcsChangeForReader;
168 csChangeForReader->commStateChFReader=UNACKNOWLEDGED;
172 /**********************************************************************************/
174 CSTWriterSendBestEffortTimer(ORTEDomain *d,void *vcstRemoteReader) {
175 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
176 ORTESubsProp *sp=(ORTESubsProp*)cstRemoteReader->objectEntryOID->attributes;
177 CSChangeForReader *csChangeForReader=NULL;
179 debug(52,10) ("CSTWriterSendBestEffortTimer: start\n");
180 d->mbSend.cdrStreamDirect=NULL;
181 if (cstRemoteReader->commStateSend!=NOTHNIGTOSEND) {
182 gavl_cust_for_each(CSChangeForReader,cstRemoteReader,csChangeForReader) {
183 if (csChangeForReader->commStateChFReader==TOSEND) {
184 CSChange *csChange=csChangeForReader->csChange;
185 csChangeForReader->commStateChFReader=UNDERWAY;
186 cstRemoteReader->commStateSend=MUSTSENDDATA;
187 cstRemoteReader->lastSentIssueTime=getActualNtpTime();
188 d->mbSend.cdrStreamDirect=&csChange->cdrStream;
189 debug(52,3) ("sent: RTPS_ISSUE_BEST(0x%x) to 0x%x-0x%x\n",
190 cstRemoteReader->cstWriter->guid.oid,
191 cstRemoteReader->guid.hid,
192 cstRemoteReader->guid.aid);
194 cstRemoteReader->objectEntryOID->objectEntryAID,
196 CSTWriterDestroyCSChangeForReader(cstRemoteReader,
197 csChangeForReader,ORTE_TRUE);
199 cstRemoteReader->objectEntryOID->objectEntryAID,
200 &cstRemoteReader->delayResponceTimer,
202 //when is no csChange -> break processing
203 if (cstRemoteReader->cstWriter->csChangesCounter==0)
206 cstRemoteReader->objectEntryOID->objectEntryAID,
207 &cstRemoteReader->delayResponceTimer,
209 "CSTWriterSendBestEffortTimer",
210 CSTWriterSendBestEffortTimer,
211 &cstRemoteReader->cstWriter->lock,
213 &sp->minimumSeparation);
218 cstRemoteReader->commStateSend=NOTHNIGTOSEND;
219 debug(52,10) ("CSTWriterSendBestEffortTimer: finished\n");
223 /**********************************************************************************/
225 CSTWriterSendStrictTimer(ORTEDomain *d,void *vcstRemoteReader) {
226 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
227 CSChangeForReader *csChangeForReader=NULL;
228 unsigned int max_msg_len;
231 Boolean firstTrace=ORTE_TRUE;
233 debug(52,10) ("CSTWriterSendStrictTimer: start\n");
234 max_msg_len=getMaxMessageLength(d);
235 if (cstRemoteReader->commStateSend!=NOTHNIGTOSEND) {
236 gavl_cust_for_each(CSChangeForReader,cstRemoteReader,csChangeForReader) {
237 csChange=csChangeForReader->csChange;
238 if (csChangeForReader->commStateChFReader==TOSEND) {
239 cstRemoteReader->commStateSend=MUSTSENDDATA;
240 if ((firstTrace) && (cstRemoteReader->cstWriter->params.fullAcknowledge) &&
241 !d->mbSend.containsInfoReply) {
242 firstTrace=ORTE_FALSE;
243 len=RTPSInfoREPLYCreate(d->mbSend.cdrStream.bufferPtr,max_msg_len,
245 ((AppParams*)cstRemoteReader->cstWriter->objectEntryOID->attributes)->userdataUnicastPort);
247 d->mbSend.needSend=ORTE_TRUE;
250 d->mbSend.containsInfoReply=ORTE_TRUE;
251 d->mbSend.cdrStream.bufferPtr+=len;
252 d->mbSend.cdrStream.length+=len;
254 debug(52,3) ("sent: RTPS_InfoREPLY(0x%x) to 0x%x-0x%x\n",
255 cstRemoteReader->cstWriter->guid.oid,
256 cstRemoteReader->guid.hid,
257 cstRemoteReader->guid.aid);
259 len=20+cstRemoteReader->cstWriter->typeRegister->getMaxSize;
260 if (max_msg_len<len) {
261 d->mbSend.needSend=ORTE_TRUE;
264 memcpy(d->mbSend.cdrStream.bufferPtr, //dest
265 csChange->cdrStream.bufferPtr-len, //src
267 d->mbSend.cdrStream.bufferPtr+=len;
268 d->mbSend.cdrStream.length+=len;
270 debug(52,3) ("sent: RTPS_ISSUE_STRICT(0x%x) to 0x%x-0x%x\n",
271 cstRemoteReader->cstWriter->guid.oid,
272 cstRemoteReader->guid.hid,
273 cstRemoteReader->guid.aid);
277 cstRemoteReader->commStateSend=NOTHNIGTOSEND;
278 debug(52,10) ("CSTWriterSendStrictTimer: finished\n");
280 return CSTWriterAnnounceIssueTimer(d,cstRemoteReader);
283 /**********************************************************************************/
285 CSTWriterSendTimer(ORTEDomain *d,void *vcstRemoteReader) {
286 CSTRemoteReader *cstRemoteReader=(CSTRemoteReader*)vcstRemoteReader;
287 CSChangeForReader *csChangeForReader=NULL;
288 unsigned int max_msg_len;
290 Boolean firstTrace=ORTE_TRUE,f_bit=ORTE_TRUE;
292 debug(52,10) ("CSTWriterSendTimer: start\n");
293 max_msg_len=getMaxMessageLength(d);
294 if (cstRemoteReader->commStateSend!=NOTHNIGTOSEND) {
295 gavl_cust_for_each(CSChangeForReader,cstRemoteReader,csChangeForReader) {
296 if (csChangeForReader->commStateChFReader==TOSEND) {
297 cstRemoteReader->commStateSend=MUSTSENDDATA;
298 if ((firstTrace) && (cstRemoteReader->cstWriter->params.fullAcknowledge) &&
299 !d->mbSend.containsInfoReply) {
301 firstTrace=ORTE_FALSE;
302 len=RTPSInfoREPLYCreate(d->mbSend.cdrStream.bufferPtr,max_msg_len,
304 ((AppParams*)cstRemoteReader->cstWriter->objectEntryOID->attributes)->metatrafficUnicastPort);
306 d->mbSend.needSend=ORTE_TRUE;
309 d->mbSend.containsInfoReply=ORTE_TRUE;
310 d->mbSend.cdrStream.bufferPtr+=len;
311 d->mbSend.cdrStream.length+=len;
313 debug(52,3) ("sent: RTPS_InfoREPLY(0x%x) to 0x%x-0x%x\n",
314 cstRemoteReader->cstWriter->guid.oid,
315 cstRemoteReader->guid.hid,
316 cstRemoteReader->guid.aid);
318 if (max_msg_len<32) {
319 d->mbSend.needSend=ORTE_TRUE;
324 if (SeqNumberCmp(csChangeForReader->csChange->gapSN,noneSN)==0) {
325 debug(52,3) ("sent: RTPS_VAR(0x%x) to 0x%x-0x%x\n",
326 cstRemoteReader->cstWriter->guid.oid,
327 cstRemoteReader->guid.hid,
328 cstRemoteReader->guid.aid);
330 d->mbSend.cdrStream.bufferPtr[0]=(u_int8_t)VAR;
331 d->mbSend.cdrStream.bufferPtr[1]=ORTE_MY_MBO;
332 if (csChangeForReader->csChange->alive)
333 d->mbSend.cdrStream.bufferPtr[1]|=4;
334 *((ObjectId*)(d->mbSend.cdrStream.bufferPtr+4))=OID_UNKNOWN;
335 conv_u32((u_int32_t*)(d->mbSend.cdrStream.bufferPtr+4),0);
336 *((ObjectId*)(d->mbSend.cdrStream.bufferPtr+8))=
337 cstRemoteReader->cstWriter->guid.oid;
338 conv_u32((u_int32_t*)(d->mbSend.cdrStream.bufferPtr+8),0);
339 if (csChangeForReader->csChange->guid.oid==OID_APP) {
340 d->mbSend.cdrStream.bufferPtr[1]|=8;
341 *((HostId*)(d->mbSend.cdrStream.bufferPtr+12))=
342 csChangeForReader->csChange->guid.hid;
343 conv_u32((u_int32_t*)(d->mbSend.cdrStream.bufferPtr+12),0);
344 *((AppId*)(d->mbSend.cdrStream.bufferPtr+16))=
345 csChangeForReader->csChange->guid.aid;
346 conv_u32((u_int32_t*)(d->mbSend.cdrStream.bufferPtr+16),0);
351 *((ObjectId*)(d->mbSend.cdrStream.bufferPtr+20+off))=
352 csChangeForReader->csChange->guid.oid;
353 conv_u32((u_int32_t*)(d->mbSend.cdrStream.bufferPtr+20+off),0);
354 *((SequenceNumber*)(d->mbSend.cdrStream.bufferPtr+24+off))=
355 csChangeForReader->csChange->sn;
356 if (!CSChangeAttributes_is_empty(csChangeForReader->csChange)) {
358 plen=parameterCodeStreamFromCSChange(csChangeForReader->csChange,
359 d->mbSend.cdrStream.bufferPtr+32+off,max_msg_len-len);
361 d->mbSend.needSend=ORTE_TRUE;
364 d->mbSend.cdrStream.bufferPtr[1]|=2;
368 debug(52,3) ("sent: RTPS_GAP(0x%x) to 0x%x-0x%x\n",
369 cstRemoteReader->cstWriter->guid.oid,
370 cstRemoteReader->guid.hid,
371 cstRemoteReader->guid.aid);
373 d->mbSend.cdrStream.bufferPtr[0]=(u_int8_t)GAP;
374 d->mbSend.cdrStream.bufferPtr[1]=ORTE_MY_MBO;
375 *((ObjectId*)(d->mbSend.cdrStream.bufferPtr+4))=OID_UNKNOWN;
376 conv_u32((u_int32_t*)(d->mbSend.cdrStream.bufferPtr+4),0);
377 *((ObjectId*)(d->mbSend.cdrStream.bufferPtr+8))=
378 cstRemoteReader->cstWriter->guid.oid;
379 conv_u32((u_int32_t*)(d->mbSend.cdrStream.bufferPtr+8),0);
380 *((SequenceNumber*)(d->mbSend.cdrStream.bufferPtr+12))=
381 csChangeForReader->csChange->sn;
382 conv_sn((SequenceNumber*)(d->mbSend.cdrStream.bufferPtr+12),ORTE_MY_MBO);
383 SeqNumberAdd(*((SequenceNumber*)(d->mbSend.cdrStream.bufferPtr+20)),
384 csChangeForReader->csChange->sn,
385 csChangeForReader->csChange->gapSN);
386 conv_sn((SequenceNumber*)(d->mbSend.cdrStream.bufferPtr+20),ORTE_MY_MBO);
387 *((u_int32_t*)(d->mbSend.cdrStream.bufferPtr+28))=0; //NumBits
389 *((ParameterLength*)(d->mbSend.cdrStream.bufferPtr+2))=len-4;
390 d->mbSend.cdrStream.bufferPtr+=len;
391 d->mbSend.cdrStream.length+=len;
393 //setup new state for csChangeForReader
394 if (NtpTimeCmp(zNtpTime,
395 cstRemoteReader->cstWriter->params.waitWhileDataUnderwayTime)==0) {
396 csChangeForReader->commStateChFReader=UNACKNOWLEDGED;
398 csChangeForReader->commStateChFReader=UNDERWAY;
400 cstRemoteReader->objectEntryOID->objectEntryAID,
401 &csChangeForReader->waitWhileDataUnderwayTimer,
404 cstRemoteReader->objectEntryOID->objectEntryAID,
405 &csChangeForReader->waitWhileDataUnderwayTimer,
407 "CSChangeForReaderUnderwayTimer",
408 CSChangeForReaderUnderwayTimer,
409 &cstRemoteReader->cstWriter->lock,
411 &cstRemoteReader->cstWriter->params.waitWhileDataUnderwayTime);
417 len=RTPSHeardBeatCreate(
418 d->mbSend.cdrStream.bufferPtr,max_msg_len,
419 &cstRemoteReader->cstWriter->firstSN,
420 &cstRemoteReader->cstWriter->lastSN,
421 cstRemoteReader->cstWriter->guid.oid,
425 d->mbSend.needSend=ORTE_TRUE;
428 //schedule new time for Announce timer
430 cstRemoteReader->objectEntryOID->objectEntryAID,
431 &cstRemoteReader->repeatAnnounceTimer,
434 cstRemoteReader->objectEntryOID->objectEntryAID,
435 &cstRemoteReader->repeatAnnounceTimer,
436 1, //metatraffic timer
437 "CSTWriterAnnounceTimer",
438 CSTWriterAnnounceTimer,
439 &cstRemoteReader->cstWriter->lock,
441 &cstRemoteReader->cstWriter->params.repeatAnnounceTime);
443 debug(52,3) ("sent: RTPS_HB(0x%x) to 0x%x-0x%x\n",
444 cstRemoteReader->cstWriter->guid.oid,
445 cstRemoteReader->guid.hid,
446 cstRemoteReader->guid.aid);
447 if (cstRemoteReader->commStateHB==MUSTSENDHB) {
448 cstRemoteReader->commStateHB=MAYSENDHB;
450 cstRemoteReader->commStateSend=NOTHNIGTOSEND;
451 d->mbSend.cdrStream.bufferPtr+=len;
452 d->mbSend.cdrStream.length+=len;
453 debug(52,10) ("CSTWriterSendTimer: finished\n");