On Tue, 2016-02-02 at 20:23 +0100, Bendik Rønning Opstad wrote: > RDB is a mechanism that enables a TCP sender to bundle redundant > (already sent) data with TCP packets containing new data. By bundling > (retransmitting) already sent data with each TCP packet containing new > data, the connection will be more resistant to sporadic packet loss > which reduces the application layer latency significantly in congested > scenarios. > > The main functionality added: > > o Loss detection of hidden loss events: When bundling redundant data > with each packet, packet loss can be hidden from the TCP engine due > to lack of dupACKs. This is because the loss is "repaired" by the > redundant data in the packet coming after the lost packet. Based on > incoming ACKs, such hidden loss events are detected, and CWR state > is entered. > > o When packets are scheduled for transmission, RDB replaces the SKB to > be sent with a modified SKB containing the redundant data of > previously sent data segments from the TCP output queue.
Really this looks very complicated. Why not simply append the new skb content to prior one ? skb_still_in_host_queue(sk, prior_skb) would also tell you if the skb is really available (ie its clone not sitting/waiting in a qdisc on the host) Note : select_size() always allocate skb with SKB_WITH_OVERHEAD(2048 - MAX_TCP_HEADER) available bytes in skb->data. Also note that tcp_collapse_retrans() is very similar to your needs. You might simply expand it.
