Commit d1e462a7 authored by Xin Long's avatar Xin Long Committed by David S. Miller

sctp: add probe_interval in sysctl and sock/asoc/transport

PLPMTUD can be enabled by doing 'sysctl -w net.sctp.probe_interval=n'.
'n' is the interval for PLPMTUD probe timer in milliseconds, and it
can't be less than 5000 if it's not 0.

All asoc/transport's PLPMTUD in a new socket will be enabled by default.
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 745a3211
...@@ -2834,6 +2834,14 @@ encap_port - INTEGER ...@@ -2834,6 +2834,14 @@ encap_port - INTEGER
Default: 0 Default: 0
plpmtud_probe_interval - INTEGER
The time interval (in milliseconds) for sending PLPMTUD probe chunks.
These chunks are sent at the specified interval with a variable size
to probe the mtu of a given path between 2 endpoints. PLPMTUD will
be disabled when 0 is set, and other values for it must be >= 5000.
Default: 0
``/proc/sys/net/core/*`` ``/proc/sys/net/core/*``
======================== ========================
......
...@@ -84,6 +84,9 @@ struct netns_sctp { ...@@ -84,6 +84,9 @@ struct netns_sctp {
/* HB.interval - 30 seconds */ /* HB.interval - 30 seconds */
unsigned int hb_interval; unsigned int hb_interval;
/* The interval for PLPMTUD probe timer */
unsigned int probe_interval;
/* Association.Max.Retrans - 10 attempts /* Association.Max.Retrans - 10 attempts
* Path.Max.Retrans - 5 attempts (per destination address) * Path.Max.Retrans - 5 attempts (per destination address)
* Max.Init.Retransmits - 8 attempts * Max.Init.Retransmits - 8 attempts
......
...@@ -424,4 +424,6 @@ enum { ...@@ -424,4 +424,6 @@ enum {
*/ */
#define SCTP_AUTH_RANDOM_LENGTH 32 #define SCTP_AUTH_RANDOM_LENGTH 32
#define SCTP_PROBE_TIMER_MIN 5000
#endif /* __sctp_constants_h__ */ #endif /* __sctp_constants_h__ */
...@@ -177,6 +177,7 @@ struct sctp_sock { ...@@ -177,6 +177,7 @@ struct sctp_sock {
* will be inherited by all new associations. * will be inherited by all new associations.
*/ */
__u32 hbinterval; __u32 hbinterval;
__u32 probe_interval;
__be16 udp_port; __be16 udp_port;
__be16 encap_port; __be16 encap_port;
...@@ -858,6 +859,7 @@ struct sctp_transport { ...@@ -858,6 +859,7 @@ struct sctp_transport {
* the destination address every heartbeat interval. * the destination address every heartbeat interval.
*/ */
unsigned long hbinterval; unsigned long hbinterval;
unsigned long probe_interval;
/* SACK delay timeout */ /* SACK delay timeout */
unsigned long sackdelay; unsigned long sackdelay;
...@@ -1795,6 +1797,7 @@ struct sctp_association { ...@@ -1795,6 +1797,7 @@ struct sctp_association {
* will be inherited by all new transports. * will be inherited by all new transports.
*/ */
unsigned long hbinterval; unsigned long hbinterval;
unsigned long probe_interval;
__be16 encap_port; __be16 encap_port;
......
...@@ -98,6 +98,7 @@ static struct sctp_association *sctp_association_init( ...@@ -98,6 +98,7 @@ static struct sctp_association *sctp_association_init(
* sock configured value. * sock configured value.
*/ */
asoc->hbinterval = msecs_to_jiffies(sp->hbinterval); asoc->hbinterval = msecs_to_jiffies(sp->hbinterval);
asoc->probe_interval = msecs_to_jiffies(sp->probe_interval);
asoc->encap_port = sp->encap_port; asoc->encap_port = sp->encap_port;
...@@ -625,6 +626,7 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, ...@@ -625,6 +626,7 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
* association configured value. * association configured value.
*/ */
peer->hbinterval = asoc->hbinterval; peer->hbinterval = asoc->hbinterval;
peer->probe_interval = asoc->probe_interval;
peer->encap_port = asoc->encap_port; peer->encap_port = asoc->encap_port;
......
...@@ -4989,6 +4989,7 @@ static int sctp_init_sock(struct sock *sk) ...@@ -4989,6 +4989,7 @@ static int sctp_init_sock(struct sock *sk)
atomic_set(&sp->pd_mode, 0); atomic_set(&sp->pd_mode, 0);
skb_queue_head_init(&sp->pd_lobby); skb_queue_head_init(&sp->pd_lobby);
sp->frag_interleave = 0; sp->frag_interleave = 0;
sp->probe_interval = net->sctp.probe_interval;
/* Create a per socket endpoint structure. Even if we /* Create a per socket endpoint structure. Even if we
* change the data structure relationships, this may still * change the data structure relationships, this may still
......
...@@ -55,6 +55,8 @@ static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write, ...@@ -55,6 +55,8 @@ static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write,
void *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
static int proc_sctp_do_auth(struct ctl_table *ctl, int write, static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
void *buffer, size_t *lenp, loff_t *ppos); void *buffer, size_t *lenp, loff_t *ppos);
static int proc_sctp_do_probe_interval(struct ctl_table *ctl, int write,
void *buffer, size_t *lenp, loff_t *ppos);
static struct ctl_table sctp_table[] = { static struct ctl_table sctp_table[] = {
{ {
...@@ -293,6 +295,13 @@ static struct ctl_table sctp_net_table[] = { ...@@ -293,6 +295,13 @@ static struct ctl_table sctp_net_table[] = {
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec,
}, },
{
.procname = "plpmtud_probe_interval",
.data = &init_net.sctp.probe_interval,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_sctp_do_probe_interval,
},
{ {
.procname = "udp_port", .procname = "udp_port",
.data = &init_net.sctp.udp_port, .data = &init_net.sctp.udp_port,
...@@ -539,6 +548,32 @@ static int proc_sctp_do_udp_port(struct ctl_table *ctl, int write, ...@@ -539,6 +548,32 @@ static int proc_sctp_do_udp_port(struct ctl_table *ctl, int write,
return ret; return ret;
} }
static int proc_sctp_do_probe_interval(struct ctl_table *ctl, int write,
void *buffer, size_t *lenp, loff_t *ppos)
{
struct net *net = current->nsproxy->net_ns;
struct ctl_table tbl;
int ret, new_value;
memset(&tbl, 0, sizeof(struct ctl_table));
tbl.maxlen = sizeof(unsigned int);
if (write)
tbl.data = &new_value;
else
tbl.data = &net->sctp.probe_interval;
ret = proc_dointvec(&tbl, write, buffer, lenp, ppos);
if (write && ret == 0) {
if (new_value && new_value < SCTP_PROBE_TIMER_MIN)
return -EINVAL;
net->sctp.probe_interval = new_value;
}
return ret;
}
int sctp_sysctl_net_register(struct net *net) int sctp_sysctl_net_register(struct net *net)
{ {
struct ctl_table *table; struct ctl_table *table;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment