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
00073 m_p_Pending_Packets[m_last_Transmitted_Sequence_Number] = new Datagram(p_Packet);
00074
00075
00076 Restart_Await_Ack_Timer();
00077 }
00078
00090
00091 void Handle_Received_Ack_Notification(int new_Acknowledged_Sequence_Number)
00092 {
00093
00094
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
00103 m_last_Acknowledged_Sequence_Number = new_Acknowledged_Sequence_Number;
00104
00105
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
00123
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
00142
00143
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
00149 p_Packet = m_p_Pending_Packets[i];
00150
00151
00152 (m_p_Layer->Get_Lower_Layer())->Transmit(p_Packet);
00153 }
00154
00155
00156 Restart_Await_Ack_Timer();
00157 }
00158 };
00159 #endif