diff options
author | Stephen Hemminger <shemminger@osdl.org> | 2005-06-23 15:19:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-23 15:19:55 -0400 |
commit | 317a76f9a44b437d6301718f4e5d08bd93f98da7 (patch) | |
tree | caeba9839dee264f59b035b81c3d13d6c61b638e /net/ipv4/tcp_diag.c | |
parent | a8ad86f2dc46356f87be1327dabc18bdbda32f50 (diff) |
[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>
Diffstat (limited to 'net/ipv4/tcp_diag.c')
-rw-r--r-- | net/ipv4/tcp_diag.c | 20 |
1 files changed, 2 insertions, 18 deletions
diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c index 634befc07921..867acc0f79d8 100644 --- a/net/ipv4/tcp_diag.c +++ b/net/ipv4/tcp_diag.c | |||
@@ -42,7 +42,6 @@ struct tcpdiag_entry | |||
42 | 42 | ||
43 | static struct sock *tcpnl; | 43 | static struct sock *tcpnl; |
44 | 44 | ||
45 | |||
46 | #define TCPDIAG_PUT(skb, attrtype, attrlen) \ | 45 | #define TCPDIAG_PUT(skb, attrtype, attrlen) \ |
47 | ({ int rtalen = RTA_LENGTH(attrlen); \ | 46 | ({ int rtalen = RTA_LENGTH(attrlen); \ |
48 | struct rtattr *rta; \ | 47 | struct rtattr *rta; \ |
@@ -61,7 +60,6 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk, | |||
61 | struct nlmsghdr *nlh; | 60 | struct nlmsghdr *nlh; |
62 | struct tcp_info *info = NULL; | 61 | struct tcp_info *info = NULL; |
63 | struct tcpdiag_meminfo *minfo = NULL; | 62 | struct tcpdiag_meminfo *minfo = NULL; |
64 | struct tcpvegas_info *vinfo = NULL; | ||
65 | unsigned char *b = skb->tail; | 63 | unsigned char *b = skb->tail; |
66 | 64 | ||
67 | nlh = NLMSG_PUT(skb, pid, seq, TCPDIAG_GETSOCK, sizeof(*r)); | 65 | nlh = NLMSG_PUT(skb, pid, seq, TCPDIAG_GETSOCK, sizeof(*r)); |
@@ -73,9 +71,6 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk, | |||
73 | if (ext & (1<<(TCPDIAG_INFO-1))) | 71 | if (ext & (1<<(TCPDIAG_INFO-1))) |
74 | info = TCPDIAG_PUT(skb, TCPDIAG_INFO, sizeof(*info)); | 72 | info = TCPDIAG_PUT(skb, TCPDIAG_INFO, sizeof(*info)); |
75 | 73 | ||
76 | if ((tcp_is_westwood(tp) || tcp_is_vegas(tp)) | ||
77 | && (ext & (1<<(TCPDIAG_VEGASINFO-1)))) | ||
78 | vinfo = TCPDIAG_PUT(skb, TCPDIAG_VEGASINFO, sizeof(*vinfo)); | ||
79 | } | 74 | } |
80 | r->tcpdiag_family = sk->sk_family; | 75 | r->tcpdiag_family = sk->sk_family; |
81 | r->tcpdiag_state = sk->sk_state; | 76 | r->tcpdiag_state = sk->sk_state; |
@@ -166,19 +161,8 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk, | |||
166 | if (info) | 161 | if (info) |
167 | tcp_get_info(sk, info); | 162 | tcp_get_info(sk, info); |
168 | 163 | ||
169 | if (vinfo) { | 164 | if (sk->sk_state < TCP_TIME_WAIT && tp->ca_ops->get_info) |
170 | if (tcp_is_vegas(tp)) { | 165 | tp->ca_ops->get_info(tp, ext, skb); |
171 | vinfo->tcpv_enabled = tp->vegas.doing_vegas_now; | ||
172 | vinfo->tcpv_rttcnt = tp->vegas.cntRTT; | ||
173 | vinfo->tcpv_rtt = jiffies_to_usecs(tp->vegas.baseRTT); | ||
174 | vinfo->tcpv_minrtt = jiffies_to_usecs(tp->vegas.minRTT); | ||
175 | } else { | ||
176 | vinfo->tcpv_enabled = 0; | ||
177 | vinfo->tcpv_rttcnt = 0; | ||
178 | vinfo->tcpv_rtt = jiffies_to_usecs(tp->westwood.rtt); | ||
179 | vinfo->tcpv_minrtt = jiffies_to_usecs(tp->westwood.rtt_min); | ||
180 | } | ||
181 | } | ||
182 | 166 | ||
183 | nlh->nlmsg_len = skb->tail - b; | 167 | nlh->nlmsg_len = skb->tail - b; |
184 | return skb->len; | 168 | return skb->len; |