IT++ Logo

selective_repeat.h

Go to the documentation of this file.
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 
SourceForge Logo

Generated on Sat Apr 19 11:01:27 2008 for IT++ by Doxygen 1.5.5