00001 00030 #ifndef SELECTIVE_REPEAT_H 00031 #define SELECTIVE_REPEAT_H 00032 00033 #include <itpp/protocol/packet.h> 00034 #include <itpp/protocol/front_drop_queue.h> 00035 #include <itpp/base/vec.h> 00036 #include <itpp/base/array.h> 00037 00038 00039 namespace itpp { 00040 00042 00043 00047 class Selective_Repeat_ARQ_Sender { 00048 public: 00050 Selective_Repeat_ARQ_Sender(); 00051 00053 Selective_Repeat_ARQ_Sender(const int Seq_no_size, const int Buffer_size_factor, const int Link_packet_size, const Ttype Time_out); 00054 00056 ~Selective_Repeat_ARQ_Sender(); 00057 00059 void set_parameters(const int Seq_no_size, // # bits in sequence no. 00060 const int Buffer_size_factor, // Link-packet buffer size = 2^(Seq_no_size)*Buffer_size_factor. 00061 const int Link_packet_size, // Size of the link packets in bytes. 00062 const Ttype Time_out); // Idle time before retransmission. 00063 00064 // -- Slots -- // 00065 Slot<Selective_Repeat_ARQ_Sender, Packet*> packet_input; 00066 Slot<Selective_Repeat_ARQ_Sender, Array<Packet*> > ack_input; 00067 Slot<Selective_Repeat_ARQ_Sender, void*> query_nof_ready_packets; 00068 Slot<Selective_Repeat_ARQ_Sender, int> packet_output_request; 00069 00070 // -- Signals -- // 00071 Signal<Array<Packet*> > packet_output; 00072 Signal<int> nof_ready_packets; 00073 Signal<int> buffer_overflow; 00074 00076 int buffer_size(); 00078 int link_packets_buffered(); 00080 int nof_ready_link_packets(); 00082 int link_packets_queued_waiting_for_transmission(); 00084 Ttype link_packets_max_queuing_time(); 00086 void get_link_packets(const int K, Array<Packet*> &pa); 00087 00088 private: 00089 void handle_ack_input(Array<Packet*> packet_array); // Take care of incomming ack/nacks. 00090 void handle_packet_input(Packet *P); // Take care of incomming packets. 00091 void handle_packet_output_request(int K); // Take care of incomming packet requests. 00092 void handle_query_nof_ready_packets(void*); // Take care of incomming query for number of packets ready to transmit. 00093 void retransmit(int Sequence_number); // Take care of incomming query for number of packets ready to transmit. 00094 void remove(const int Sequence_number); 00095 void push_packet_on_tx_buffer(Packet *packet); 00096 int buffered_non_outstanding(); 00097 int free_sequence_numbers(); 00098 int sequence_number_2_buffer_index(const int Sequence_number); 00099 void schedule_output(const int Buffer_index, const int Sequence_number, const bool Retransmission); 00100 void cancel_output(const int Sequence_number); 00101 void fill_output(); 00102 int feasable_blocks(); 00103 bool parameters_ok; 00104 Front_Drop_Queue ip_pkt_queue; 00105 Array<Link_Packet*> input_buffer; 00106 int input_buffer_size; 00107 int input_next; 00108 int input_free_space; 00109 int seq_no_size; 00110 int seq_no; 00111 int seq_no_max; 00112 int tx_next; 00113 int tx_last; 00114 int outstanding; 00115 int id; 00116 Ttype time_out; 00117 Array<ATimer<Selective_Repeat_ARQ_Sender, int> > timer; 00118 ivec output_indexes; 00119 ivec retransmission_indexes; 00120 int rd_pos; 00121 int rt_pos; 00122 int scheduled_total; 00123 int scheduled_retransmissions; 00124 int no_retransmit; 00125 int link_packet_size; 00126 }; 00127 00128 00132 class Selective_Repeat_ARQ_Receiver { 00133 public: 00135 Selective_Repeat_ARQ_Receiver(); 00136 00138 Selective_Repeat_ARQ_Receiver(const int Seq_no_size); 00139 00141 ~Selective_Repeat_ARQ_Receiver(); 00142 00143 // -- Slots -- // 00144 Slot<Selective_Repeat_ARQ_Receiver, Array<Packet*> > packet_input; 00145 00146 // -- Signals -- // 00147 Signal<Array<Packet*> > ack_output; 00148 Signal<Packet*> packet_output; 00149 00151 void set_parameters(const int Seq_no_size); // # bits in sequence no. 00152 00153 private: 00154 bool greater_modulo_L(const int a, const int b); 00155 void handle_packet_input(Array<Packet*>); // Take care of incomming packets. 00156 int seq_no_size; 00157 int seq_no_max; 00158 Array<Link_Packet*> rx_buffer; 00159 int Rnext; 00160 int id; 00161 bool parameters_ok; 00162 }; 00163 00165 00166 } // namespace itpp 00167 00168 #endif // #ifndef SELECTIVE_REPEAT_H 00169
Generated on Sat Apr 19 10:41:14 2008 for IT++ by Doxygen 1.5.5