Commit 566178f8 authored by Zhu Yanjun's avatar Zhu Yanjun Committed by David S. Miller

net: sctp: dynamically enable or disable pf state

As we all know, the value of pf_retrans >= max_retrans_path can
disable pf state. The variables of pf_retrans and max_retrans_path
can be changed by the userspace application.

Sometimes the user expects to disable pf state while the 2
variables are changed to enable pf state. So it is necessary to
introduce a new variable to disable pf state.

According to the suggestions from Vlad Yasevich, extra1 and extra2
are removed. The initialization of pf_enable is added.
Acked-by: default avatarVlad Yasevich <vyasevich@gmail.com>
Signed-off-by: default avatarZhu Yanjun <zyjzyj2000@gmail.com>
Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6857a02a
...@@ -1723,6 +1723,25 @@ addip_enable - BOOLEAN ...@@ -1723,6 +1723,25 @@ addip_enable - BOOLEAN
Default: 0 Default: 0
pf_enable - INTEGER
Enable or disable pf (pf is short for potentially failed) state. A value
of pf_retrans > path_max_retrans also disables pf state. That is, one of
both pf_enable and pf_retrans > path_max_retrans can disable pf state.
Since pf_retrans and path_max_retrans can be changed by userspace
application, sometimes user expects to disable pf state by the value of
pf_retrans > path_max_retrans, but occasionally the value of pf_retrans
or path_max_retrans is changed by the user application, this pf state is
enabled. As such, it is necessary to add this to dynamically enable
and disable pf state. See:
https://datatracker.ietf.org/doc/draft-ietf-tsvwg-sctp-failover for
details.
1: Enable pf.
0: Disable pf.
Default: 1
addip_noauth_enable - BOOLEAN addip_noauth_enable - BOOLEAN
Dynamic Address Reconfiguration (ADD-IP) requires the use of Dynamic Address Reconfiguration (ADD-IP) requires the use of
authentication to protect the operations of adding or removing new authentication to protect the operations of adding or removing new
...@@ -1799,7 +1818,9 @@ pf_retrans - INTEGER ...@@ -1799,7 +1818,9 @@ pf_retrans - INTEGER
having to reduce path_max_retrans to a very low value. See: having to reduce path_max_retrans to a very low value. See:
http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt
for details. Note also that a value of pf_retrans > path_max_retrans for details. Note also that a value of pf_retrans > path_max_retrans
disables this feature disables this feature. Since both pf_retrans and path_max_retrans can
be changed by userspace application, a variable pf_enable is used to
disable pf state.
Default: 0 Default: 0
......
...@@ -88,6 +88,13 @@ struct netns_sctp { ...@@ -88,6 +88,13 @@ struct netns_sctp {
*/ */
int pf_retrans; int pf_retrans;
/*
* Disable Potentially-Failed feature, the feature is enabled by default
* pf_enable - 0 : disable pf
* - >0 : enable pf
*/
int pf_enable;
/* /*
* Policy for preforming sctp/socket accounting * Policy for preforming sctp/socket accounting
* 0 - do socket level accounting, all assocs share sk_sndbuf * 0 - do socket level accounting, all assocs share sk_sndbuf
......
...@@ -1223,6 +1223,9 @@ static int __net_init sctp_defaults_init(struct net *net) ...@@ -1223,6 +1223,9 @@ static int __net_init sctp_defaults_init(struct net *net)
/* Max.Burst - 4 */ /* Max.Burst - 4 */
net->sctp.max_burst = SCTP_DEFAULT_MAX_BURST; net->sctp.max_burst = SCTP_DEFAULT_MAX_BURST;
/* Enable pf state by default */
net->sctp.pf_enable = 1;
/* 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
......
...@@ -477,6 +477,8 @@ static void sctp_do_8_2_transport_strike(sctp_cmd_seq_t *commands, ...@@ -477,6 +477,8 @@ static void sctp_do_8_2_transport_strike(sctp_cmd_seq_t *commands,
struct sctp_transport *transport, struct sctp_transport *transport,
int is_hb) int is_hb)
{ {
struct net *net = sock_net(asoc->base.sk);
/* The check for association's overall error counter exceeding the /* The check for association's overall error counter exceeding the
* threshold is done in the state function. * threshold is done in the state function.
*/ */
...@@ -503,7 +505,8 @@ static void sctp_do_8_2_transport_strike(sctp_cmd_seq_t *commands, ...@@ -503,7 +505,8 @@ static void sctp_do_8_2_transport_strike(sctp_cmd_seq_t *commands,
* is SCTP_ACTIVE, then mark this transport as Partially Failed, * is SCTP_ACTIVE, then mark this transport as Partially Failed,
* see SCTP Quick Failover Draft, section 5.1 * see SCTP Quick Failover Draft, section 5.1
*/ */
if ((transport->state == SCTP_ACTIVE) && if (net->sctp.pf_enable &&
(transport->state == SCTP_ACTIVE) &&
(asoc->pf_retrans < transport->pathmaxrxt) && (asoc->pf_retrans < transport->pathmaxrxt) &&
(transport->error_count > asoc->pf_retrans)) { (transport->error_count > asoc->pf_retrans)) {
......
...@@ -308,6 +308,13 @@ static struct ctl_table sctp_net_table[] = { ...@@ -308,6 +308,13 @@ static struct ctl_table sctp_net_table[] = {
.extra1 = &max_autoclose_min, .extra1 = &max_autoclose_min,
.extra2 = &max_autoclose_max, .extra2 = &max_autoclose_max,
}, },
{
.procname = "pf_enable",
.data = &init_net.sctp.pf_enable,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
{ /* sentinel */ } { /* sentinel */ }
}; };
......
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