From: raj@tardy.cup.hp.com (Rick Jones)
To: <netdev@vger.kernel.org>
Subject: [RFC net-next] Include selection of congestion control algorithm in that which is inherited across an accept() call
Date: Tue, 29 Nov 2011 16:31:12 -0800 (PST) [thread overview]
Message-ID: <20111130003112.C04FE29005FE@tardy> (raw)
From: Rick Jones <rick.jones2@hp.com>
Include congestion control algorithm in what is inherited across an
accept() call.
Signed-off-by: Rick Jones <rick.jones2@hp.com>
---
Before patch, with cubic as the default:
raj@raj-ubuntu-guest:~$ ./tcp_congestion_test reno
Will be requesting 'reno' as the congestion control algorithm
active socket has 'reno' for congestion control
passive socket has 'reno' for congestion control
after listen() passive socket has 'reno' for congestion control
after connect() active has 'reno' for congestion control
after accept() accepted has 'cubic' for congestion control
After patch, still with cubic as the default:
raj@raj-ubuntu-guest:~$ ./tcp_congestion_test reno
Will be requesting 'reno' as the congestion control algorithm
active socket has 'reno' for congestion control
passive socket has 'reno' for congestion control
after listen() passive socket has 'reno' for congestion control
after connect() active has 'reno' for congestion control
after accept() accepted has 'reno' for congestion control
IPv6 portion compiled only.
include/linux/ipv6.h | 3 +++
include/net/inet_sock.h | 3 +++
net/ipv4/tcp_ipv4.c | 3 +++
net/ipv4/tcp_minisocks.c | 2 +-
net/ipv6/tcp_ipv6.c | 3 +++
5 files changed, 13 insertions(+), 1 deletions(-)
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index 0c99776..1d0dde3 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -265,11 +265,14 @@ static inline int inet6_iif(const struct sk_buff *skb)
return IP6CB(skb)->iif;
}
+struct tcp_congestion_ops;
+
struct inet6_request_sock {
struct in6_addr loc_addr;
struct in6_addr rmt_addr;
struct sk_buff *pktopts;
int iif;
+ const struct tcp_congestion_ops *cong_ops;
};
struct tcp6_request_sock {
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
index f941964..9ec68a3 100644
--- a/include/net/inet_sock.h
+++ b/include/net/inet_sock.h
@@ -69,6 +69,8 @@ struct ip_options_data {
char data[40];
};
+struct tcp_congestion_ops;
+
struct inet_request_sock {
struct request_sock req;
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
@@ -89,6 +91,7 @@ struct inet_request_sock {
no_srccheck: 1;
kmemcheck_bitfield_end(flags);
struct ip_options_rcu *opt;
+ const struct tcp_congestion_ops *cong_ops;
};
static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index a9db4b1..79c02e2 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1254,6 +1254,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
const u8 *hash_location;
struct request_sock *req;
struct inet_request_sock *ireq;
+ struct inet_connection_sock *icsk = inet_csk(sk);
struct tcp_sock *tp = tcp_sk(sk);
struct dst_entry *dst = NULL;
__be32 saddr = ip_hdr(skb)->saddr;
@@ -1341,6 +1342,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
ireq->rmt_addr = saddr;
ireq->no_srccheck = inet_sk(sk)->transparent;
ireq->opt = tcp_v4_save_options(sk, skb);
+ ireq->cong_ops = (icsk->icsk_ca_ops) ? icsk->icsk_ca_ops :
+ &tcp_init_congestion_ops;
if (security_inet_conn_request(sk, skb, req))
goto drop_and_free;
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
index 945efff..be338d7 100644
--- a/net/ipv4/tcp_minisocks.c
+++ b/net/ipv4/tcp_minisocks.c
@@ -495,7 +495,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
newtp->frto_counter = 0;
newtp->frto_highmark = 0;
- newicsk->icsk_ca_ops = &tcp_init_congestion_ops;
+ newicsk->icsk_ca_ops = ireq->cong_ops;
tcp_set_ca_state(newsk, TCP_CA_Open);
tcp_init_xmit_timers(newsk);
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 9d74eee..c689779 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1164,6 +1164,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
const u8 *hash_location;
struct request_sock *req;
struct inet6_request_sock *treq;
+ struct inet_connection_sock *icsk = inet_csk(sk);
struct ipv6_pinfo *np = inet6_sk(sk);
struct tcp_sock *tp = tcp_sk(sk);
__u32 isn = TCP_SKB_CB(skb)->when;
@@ -1254,6 +1255,8 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
TCP_ECN_create_request(req, tcp_hdr(skb));
treq->iif = sk->sk_bound_dev_if;
+ treq->cong_ops = (icsk->icsk_ca_ops) ? icsk->icsk_ca_ops :
+ &tcp_init_congestion_ops;
/* So that link locals have meaning */
if (!sk->sk_bound_dev_if &&
next reply other threads:[~2011-11-30 0:31 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-30 0:31 Rick Jones [this message]
2011-11-30 5:21 ` [RFC net-next] Include selection of congestion control algorithm in that which is inherited across an accept() call Eric Dumazet
2011-11-30 5:40 ` Eric Dumazet
2011-11-30 11:02 ` [PATCH net-next] tcp: inherit listener congestion control for passive cnx Eric Dumazet
2011-11-30 17:33 ` Rick Jones
2011-11-30 21:28 ` Rick Jones
2011-11-30 21:56 ` David Miller
2011-11-30 17:21 ` [RFC net-next] Include selection of congestion control algorithm in that which is inherited across an accept() call Rick Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20111130003112.C04FE29005FE@tardy \
--to=raj@tardy.cup.hp.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).