sctp: make ecn flag per netns and endpoint
authorXin Long <lucien.xin@gmail.com>
Mon, 26 Aug 2019 08:30:02 +0000 (16:30 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 28 Aug 2019 03:54:14 +0000 (20:54 -0700)
This patch is to add ecn flag for both netns_sctp and sctp_endpoint,
net->sctp.ecn_enable is set 1 by default, and ep->ecn_enable will
be initialized with net->sctp.ecn_enable.

asoc->peer.ecn_capable will be set during negotiation only when
ep->ecn_enable is set on both sides.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/netns/sctp.h
include/net/sctp/structs.h
net/sctp/endpointola.c
net/sctp/protocol.c
net/sctp/sm_make_chunk.c

index 0db7fb3..bdc0f27 100644 (file)
@@ -128,6 +128,9 @@ struct netns_sctp {
        /* Flag to indicate if stream interleave is enabled */
        int intl_enable;
 
+       /* Flag to indicate if ecn is enabled */
+       int ecn_enable;
+
        /*
         * Policy to control SCTP IPv4 address scoping
         * 0   - Disable IPv4 address scoping
index daac1ef..503fbc3 100644 (file)
@@ -1322,7 +1322,8 @@ struct sctp_endpoint {
        /* SCTP-AUTH: endpoint shared keys */
        struct list_head endpoint_shared_keys;
        __u16 active_key_id;
-       __u8  auth_enable:1,
+       __u8  ecn_enable:1,
+             auth_enable:1,
              intl_enable:1,
              prsctp_enable:1,
              asconf_enable:1,
index 75a407d..ea53049 100644 (file)
@@ -106,6 +106,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
         */
        ep->prsctp_enable = net->sctp.prsctp_enable;
        ep->reconf_enable = net->sctp.reconf_enable;
+       ep->ecn_enable = net->sctp.ecn_enable;
 
        /* Remember who we are attached to.  */
        ep->base.sk = sk;
index 2d47adc..b48ffe8 100644 (file)
@@ -1254,6 +1254,9 @@ static int __net_init sctp_defaults_init(struct net *net)
        /* Disable AUTH by default. */
        net->sctp.auth_enable = 0;
 
+       /* Enable ECN by default. */
+       net->sctp.ecn_enable = 1;
+
        /* Set SCOPE policy to enabled */
        net->sctp.scope_policy = SCTP_SCOPE_POLICY_ENABLE;
 
index 338278f..e41ed2e 100644 (file)
@@ -244,7 +244,9 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
 
        chunksize = sizeof(init) + addrs_len;
        chunksize += SCTP_PAD4(SCTP_SAT_LEN(num_types));
-       chunksize += sizeof(ecap_param);
+
+       if (asoc->ep->ecn_enable)
+               chunksize += sizeof(ecap_param);
 
        if (asoc->ep->prsctp_enable)
                chunksize += sizeof(prsctp_param);
@@ -335,7 +337,8 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
        sctp_addto_chunk(retval, sizeof(sat), &sat);
        sctp_addto_chunk(retval, num_types * sizeof(__u16), &types);
 
-       sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param);
+       if (asoc->ep->ecn_enable)
+               sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param);
 
        /* Add the supported extensions parameter.  Be nice and add this
         * fist before addiding the parameters for the extensions themselves
@@ -2597,8 +2600,13 @@ do_addr_param:
                break;
 
        case SCTP_PARAM_ECN_CAPABLE:
-               asoc->peer.ecn_capable = 1;
-               break;
+               if (asoc->ep->ecn_enable) {
+                       asoc->peer.ecn_capable = 1;
+                       break;
+               }
+               /* Fall Through */
+               goto fall_through;
+
 
        case SCTP_PARAM_ADAPTATION_LAYER_IND:
                asoc->peer.adaptation_ind = ntohl(param.aind->adaptation_ind);