mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 23:32:14 +00:00
[TCP]: Allow choosing TCP congestion control via sockopt.
Allow using setsockopt to set TCP congestion control to use on a per socket basis. Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
51b0bdedb8
commit
5f8ef48d24
6 changed files with 79 additions and 6 deletions
|
@ -1927,6 +1927,25 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
|||
return tp->af_specific->setsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
|
||||
/* This is a string value all the others are int's */
|
||||
if (optname == TCP_CONGESTION) {
|
||||
char name[TCP_CA_NAME_MAX];
|
||||
|
||||
if (optlen < 1)
|
||||
return -EINVAL;
|
||||
|
||||
val = strncpy_from_user(name, optval,
|
||||
min(TCP_CA_NAME_MAX-1, optlen));
|
||||
if (val < 0)
|
||||
return -EFAULT;
|
||||
name[val] = 0;
|
||||
|
||||
lock_sock(sk);
|
||||
err = tcp_set_congestion_control(tp, name);
|
||||
release_sock(sk);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (optlen < sizeof(int))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -2211,6 +2230,16 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
|||
case TCP_QUICKACK:
|
||||
val = !tp->ack.pingpong;
|
||||
break;
|
||||
|
||||
case TCP_CONGESTION:
|
||||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
len = min_t(unsigned int, len, TCP_CA_NAME_MAX);
|
||||
if (put_user(len, optlen))
|
||||
return -EFAULT;
|
||||
if (copy_to_user(optval, tp->ca_ops->name, len))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
default:
|
||||
return -ENOPROTOOPT;
|
||||
};
|
||||
|
@ -2224,7 +2253,7 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
|||
|
||||
|
||||
extern void __skb_cb_too_small_for_tcp(int, int);
|
||||
extern void tcpdiag_init(void);
|
||||
extern struct tcp_congestion_ops tcp_reno;
|
||||
|
||||
static __initdata unsigned long thash_entries;
|
||||
static int __init set_thash_entries(char *str)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue