EventHelix.com: CASE Tools; Real-time and Embedded System Design; Object Oriented Design EventStudio 2.0: System Engineering CASE ToolEventStudio 2.5
Sequence diagram based system design and modeling
Home   What's New   EventStudio 2.5   Real-time Mantra   Thought Projects   Contact Us
Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

Retransmission_Buffer.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #ifndef RETRANSMISSION_BUFFER_H
00010 #define RETRANSMISSION_BUFFER_H
00011 
00012 #include "Datagram.h"
00013 #include "Protocol_Layer.h"
00014 
00015 int Modulo_Increment(int& i);
00016 int Modulo_Difference(int seq_1, int seq_2);
00017 int Modulo_Add(int seq_1, int seq_2);
00018 
00029 
00030 class Retransmission_Buffer
00031 {
00032     enum { WINDOW_SIZE = 512 };
00033 
00034     Datagram *m_p_Pending_Packets[WINDOW_SIZE];
00035     int m_last_Transmitted_Sequence_Number;
00036     int m_last_Acknowledged_Sequence_Number;
00037     Protocol_Layer *m_p_Layer;
00038 
00039     void Restart_Await_Ack_Timer();
00040     void Stop_Await_Ack_Timer();
00041 
00042 public:
00043 
00051 
00052     Retransmission_Buffer(Protocol_Layer *p_Layer) : m_p_Layer(p_Layer)
00053     {
00054     }
00055 
00066 
00067     void Add_Packet(const Datagram *p_Packet)
00068     {
00069     
00070        m_last_Transmitted_Sequence_Number = p_Packet->Get_Transmit_Sequence_Number();
00071        
00072        // Make a copy of the packet for the retransmission buffer
00073        m_p_Pending_Packets[m_last_Transmitted_Sequence_Number] = new Datagram(p_Packet);
00074 
00075        // Restart the ack timer. Timer is started if its not running
00076        Restart_Await_Ack_Timer();       
00077     }
00078     
00090 
00091     void Handle_Received_Ack_Notification(int new_Acknowledged_Sequence_Number)
00092     {
00093         // Delete the buffers allocted to retransmission buffers 
00094         // for all allocated packets.
00095         for (int i=m_last_Acknowledged_Sequence_Number; i != new_Acknowledged_Sequence_Number; 
00096                                                      Modulo_Increment(i))
00097         {
00098            delete m_p_Pending_Packets[i];
00099            m_p_Pending_Packets[i] = NULL; 
00100         }
00101         
00102         // Save the new sequence number as the last acknowledged seq num
00103         m_last_Acknowledged_Sequence_Number = new_Acknowledged_Sequence_Number;
00104         
00105         // If all packets have been acknowledged, stop timer
00106         if (m_last_Transmitted_Sequence_Number == m_last_Acknowledged_Sequence_Number)
00107         {
00108            Stop_Await_Ack_Timer();
00109         } 
00110     }
00111     
00119 
00120     int Get_Window_Room() const
00121     {
00122        // Return the room in window by determining the current count of messages
00123        // awaiting acknowledgement
00124        return (WINDOW_SIZE - 
00125            Modulo_Difference(m_last_Transmitted_Sequence_Number, m_last_Acknowledged_Sequence_Number));
00126     }
00127 
00137     void Handle_Await_Ack_Timeout()
00138     {       
00139         Datagram *p_Packet;
00140 
00141         // Initiate retransmission of all unacknowledged packets by 
00142         // looping from the last unacknowledged sequence number to 
00143         // the sequence number of the last transmitted message
00144         for (int i=Modulo_Add(m_last_Acknowledged_Sequence_Number, 1); 
00145              i != m_last_Transmitted_Sequence_Number; Modulo_Increment(i))
00146         { 
00147 
00148            // Get the packet corresponding to the sequence number i
00149            p_Packet = m_p_Pending_Packets[i];
00150 
00151            // Pass on the message for transmission on the serial port
00152            (m_p_Layer->Get_Lower_Layer())->Transmit(p_Packet);                
00153         }
00154         
00155         // Now restart the timer
00156         Restart_Await_Ack_Timer();
00157     }
00158 };
00159 #endif

Generated on Sun Feb 13 21:30:17 2005 for Object Oriented Design Examples by doxygen 1.3.4
 Home   What's New   EventStudio 2.5   Real-time Mantra   Thought Projects   Contact Us
Copyright © 2000-2005 EventHelix.com Inc. All Rights Reserved.