[TCP]: Add pluggable congestion control algorithm infrastructure.
Allow TCP to have multiple pluggable congestion control algorithms. Algorithms are defined by a set of operations and can be built in or modules. The legacy "new RENO" algorithm is used as a starting point and fallback. Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
a8ad86f2dc
commit
317a76f9a4
@@ -333,21 +333,14 @@ enum
|
||||
NET_TCP_FRTO=92,
|
||||
NET_TCP_LOW_LATENCY=93,
|
||||
NET_IPV4_IPFRAG_SECRET_INTERVAL=94,
|
||||
NET_TCP_WESTWOOD=95,
|
||||
NET_IPV4_IGMP_MAX_MSF=96,
|
||||
NET_TCP_NO_METRICS_SAVE=97,
|
||||
NET_TCP_VEGAS=98,
|
||||
NET_TCP_VEGAS_ALPHA=99,
|
||||
NET_TCP_VEGAS_BETA=100,
|
||||
NET_TCP_VEGAS_GAMMA=101,
|
||||
NET_TCP_BIC=102,
|
||||
NET_TCP_BIC_FAST_CONVERGENCE=103,
|
||||
NET_TCP_BIC_LOW_WINDOW=104,
|
||||
NET_TCP_DEFAULT_WIN_SCALE=105,
|
||||
NET_TCP_MODERATE_RCVBUF=106,
|
||||
NET_TCP_TSO_WIN_DIVISOR=107,
|
||||
NET_TCP_BIC_BETA=108,
|
||||
NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR=109,
|
||||
NET_TCP_CONG_CONTROL=110,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
||||
@@ -203,13 +203,6 @@ struct tcp_sack_block {
|
||||
__u32 end_seq;
|
||||
};
|
||||
|
||||
enum tcp_congestion_algo {
|
||||
TCP_RENO=0,
|
||||
TCP_VEGAS,
|
||||
TCP_WESTWOOD,
|
||||
TCP_BIC,
|
||||
};
|
||||
|
||||
struct tcp_options_received {
|
||||
/* PAWS/RTTM data */
|
||||
long ts_recent_stamp;/* Time we stored ts_recent (for aging) */
|
||||
@@ -305,7 +298,7 @@ struct tcp_sock {
|
||||
__u8 reordering; /* Packet reordering metric. */
|
||||
__u8 frto_counter; /* Number of new acks after RTO */
|
||||
|
||||
__u8 adv_cong; /* Using Vegas, Westwood, or BIC */
|
||||
__u8 unused;
|
||||
__u8 defer_accept; /* User waits for some data after accept() */
|
||||
|
||||
/* RTT measurement */
|
||||
@@ -401,37 +394,10 @@ struct tcp_sock {
|
||||
__u32 time;
|
||||
} rcvq_space;
|
||||
|
||||
/* TCP Westwood structure */
|
||||
struct {
|
||||
__u32 bw_ns_est; /* first bandwidth estimation..not too smoothed 8) */
|
||||
__u32 bw_est; /* bandwidth estimate */
|
||||
__u32 rtt_win_sx; /* here starts a new evaluation... */
|
||||
__u32 bk;
|
||||
__u32 snd_una; /* used for evaluating the number of acked bytes */
|
||||
__u32 cumul_ack;
|
||||
__u32 accounted;
|
||||
__u32 rtt;
|
||||
__u32 rtt_min; /* minimum observed RTT */
|
||||
} westwood;
|
||||
|
||||
/* Vegas variables */
|
||||
struct {
|
||||
__u32 beg_snd_nxt; /* right edge during last RTT */
|
||||
__u32 beg_snd_una; /* left edge during last RTT */
|
||||
__u32 beg_snd_cwnd; /* saves the size of the cwnd */
|
||||
__u8 doing_vegas_now;/* if true, do vegas for this RTT */
|
||||
__u16 cntRTT; /* # of RTTs measured within last RTT */
|
||||
__u32 minRTT; /* min of RTTs measured within last RTT (in usec) */
|
||||
__u32 baseRTT; /* the min of all Vegas RTT measurements seen (in usec) */
|
||||
} vegas;
|
||||
|
||||
/* BI TCP Parameters */
|
||||
struct {
|
||||
__u32 cnt; /* increase cwnd by 1 after this number of ACKs */
|
||||
__u32 last_max_cwnd; /* last maximium snd_cwnd */
|
||||
__u32 last_cwnd; /* the last snd_cwnd */
|
||||
__u32 last_stamp; /* time when updated last_cwnd */
|
||||
} bictcp;
|
||||
/* Pluggable TCP congestion control hook */
|
||||
struct tcp_congestion_ops *ca_ops;
|
||||
u32 ca_priv[16];
|
||||
#define TCP_CA_PRIV_SIZE (16*sizeof(u32))
|
||||
};
|
||||
|
||||
static inline struct tcp_sock *tcp_sk(const struct sock *sk)
|
||||
@@ -439,6 +405,11 @@ static inline struct tcp_sock *tcp_sk(const struct sock *sk)
|
||||
return (struct tcp_sock *)sk;
|
||||
}
|
||||
|
||||
static inline void *tcp_ca(const struct tcp_sock *tp)
|
||||
{
|
||||
return (void *) tp->ca_priv;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_TCP_H */
|
||||
|
||||
Reference in New Issue
Block a user