]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/liborte/RTPSAck.c
updated email address - petr@smoliku.cz
[orte.git] / orte / liborte / RTPSAck.c
index 868273356cabd3aad3c6f71d2ac0377d0ea6b79e..aae5de6a7cc2105de236c12a60325943fde6ac0a 100644 (file)
@@ -2,9 +2,19 @@
  *  $Id: RTPSAck.c,v 0.0.0.1            2003/10/07 
  *
  *  DEBUG:  section 47                  RTPS message ACK
- *  AUTHOR: Petr Smolik                 petr.smolik@wo.cz
  *
- *  ORTE - OCERA Real-Time Ethernet     http://www.ocera.org/
+ *  -------------------------------------------------------------------  
+ *                                ORTE                                 
+ *                      Open Real-Time Ethernet                       
+ *                                                                    
+ *                      Copyright (C) 2001-2006                       
+ *  Department of Control Engineering FEE CTU Prague, Czech Republic  
+ *                      http://dce.felk.cvut.cz                       
+ *                      http://www.ocera.org                          
+ *                                                                    
+ *  Author:             Petr Smolik    petr@smoliku.cz             
+ *  Advisor:            Pavel Pisa                                   
+ *  Project Responsible: Zdenek Hanzalek                              
  *  --------------------------------------------------------------------
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -78,7 +88,7 @@ RTPSAck(ORTEDomain *d,CDR_Codec *cdrCodec,MessageInterpret *mi,IPAddress senderI
   CSChangeForReader  *csChangeForReader;
   StateMachineSend   stateMachineSendNew;
   ObjectId          roid,woid;
-  SequenceNumber     sn;   
+  SequenceNumber     sn,isn;   
   char               queue=1;
   CDR_Endianness     data_endian;
   CORBA_octet       flags;
@@ -88,7 +98,7 @@ RTPSAck(ORTEDomain *d,CDR_Codec *cdrCodec,MessageInterpret *mi,IPAddress senderI
   cdrCodec->rptr-=3;
 
   /* flags */
-  CDR_get_octet(cdrCodec,&flags);
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&flags);
   f_bit=flags & 2;
 
   /* move reading possition to begin of submessage */
@@ -99,16 +109,16 @@ RTPSAck(ORTEDomain *d,CDR_Codec *cdrCodec,MessageInterpret *mi,IPAddress senderI
   cdrCodec->data_endian=FLAG_BIG_ENDIAN;
 
   /* readerObjectId */
-  CDR_get_ulong(cdrCodec,&roid);
+  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&roid);
   
   /* writerObjectId */
-  CDR_get_ulong(cdrCodec,&woid);
+  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&woid);
 
   cdrCodec->data_endian=data_endian;
 
   /* SeqNumber */
-  CDR_get_ulong(cdrCodec,&sn.high);
-  CDR_get_ulong(cdrCodec,&sn.low);
+  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&sn.high);
+  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&sn.low);
 
   readerGUID.hid=mi->sourceHostId;
   readerGUID.aid=mi->sourceAppId;
@@ -192,7 +202,12 @@ RTPSAck(ORTEDomain *d,CDR_Codec *cdrCodec,MessageInterpret *mi,IPAddress senderI
   stateMachineSendNew=NOTHNIGTOSEND;
   csChangeForReader=CSChangeForReader_first(cstRemoteReader);
   while(csChangeForReader) {
-    if (SeqNumberCmp(csChangeForReader->csChange->sn,sn)<0)   {   //ACK
+    isn=csChangeForReader->csChange->sn;
+    if (SeqNumberCmp(csChangeForReader->csChange->gapSN,noneSN)>0) {
+      SeqNumberAdd(isn,csChangeForReader->csChange->sn,csChangeForReader->csChange->gapSN);
+      SeqNumberDec(isn,isn);
+    }
+    if (SeqNumberCmp(isn,sn)<0)   {   //ACK
       if (csChangeForReader->commStateChFReader!=ACKNOWLEDGED) {
         CSChangeForReader *csChangeForReaderDestroyed;
         csChangeForReaderDestroyed=csChangeForReader;