[RFC] Implementing an additional TCP congestion control algorithm (TCP-PR)

Richard Sailer Richard.Willi.Sailer at Student.Uni-Augsburg.DE
Sun Aug 16 10:41:14 EDT 2015


Hi,

> If reordering causes TCP to believe packets are lost, there will
> probably be other issues as well, like sending of useless retransmits. I would
> rather try to detect this kind of reordering and ignore dupacks and rely only
> on timeouts to detect loss. 
Well this is exactly how TCP-PR works :).
But maybe this misunderstanding is my fault for writing a much to long
and detailed mail. I will try to write shorter mails in future.

== About: Doing this inside Congestion control (CC) ==

Well I think sending retransmit is part of CC.
Strictly CC is "everything done to adapt the amount of data sent to the
transmission capacity of the network". But I'm not entirely sure if
saying retransmission is part of this is 100% correct.

Well in the end practically it doesn't matter how one classifies the
"not sending of retransmits" it has to be implemented.

And from an implementation point of view I think you are right.
None of the existing CC modules interferes with reacting on DUPACKs
or sending retransmits.
Also looking at the function pointer interface for modules
/tcp_congestion_ops/ :

struct tcp_congestion_ops {
	struct list_head	list;
	u32 key;
	u32 flags;

	/* initialize private data (optional) */
	void (*init)(struct sock *sk);
	/* cleanup private data  (optional) */
	void (*release)(struct sock *sk);

	/* return slow start threshold (required) */
	u32 (*ssthresh)(struct sock *sk);
	/* do new cwnd calculation (required) */
	void (*cong_avoid)(struct sock *sk, u32 ack, u32 acked);
	/* call before changing ca_state (optional) */
	void (*set_state)(struct sock *sk, u8 new_state);
	/* call when cwnd event occurs (optional) */
	void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev);
	/* call when ack arrives (optional) */
	void (*in_ack_event)(struct sock *sk, u32 flags);
	/* new value of cwnd after loss (optional) */
	u32  (*undo_cwnd)(struct sock *sk);
	/* hook for packet ack accounting (optional) */
	void (*pkts_acked)(struct sock *sk, u32 num_acked, s32 rtt_us);
	/* get info for inet_diag (optional) */
	size_t (*get_info)(struct sock *sk, u32 ext, int *attr,
			   union tcp_cc_info *info);

	char 		name[TCP_CA_NAME_MAX];
	struct module 	*owner;
};

doesn't look that promising.
Well there is (*cwnd_event) which be meaningfull in
"not reducing cwnd after a retransmission has been sent"
and perhaps even for "not stopping the timer".
But I'm not sure if sending retransmit packets can be prevented
from here.
Currently it looks like I will have to make some further parts
of tcp_input.c and tcp_output.c available for CC modules.
But I have to look deeper into this the next few days to know and do
this for sure.
If you're interested I will tell you, when i know more.


-- Richi

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
Url : http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20150816/6ff5ea49/attachment.bin 


More information about the Kernelnewbies mailing list