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

sctp: add reconf_enable in asoc ep and netns

This patch is to add reconf_enable field in all of asoc ep and netns
to indicate if they support stream reset.

When initializing, asoc reconf_enable get the default value from ep
reconf_enable which is from netns netns reconf_enable by default.

It is also to add reconf_capable in asoc peer part to know if peer
supports reconf_enable, the value is set if ext params have reconf
chunk support when processing init chunk, just as rfc6525 section
5.1.1 demands.
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7a090b04
...@@ -118,6 +118,9 @@ struct netns_sctp { ...@@ -118,6 +118,9 @@ struct netns_sctp {
/* Flag to indicate if PR-SCTP is enabled. */ /* Flag to indicate if PR-SCTP is enabled. */
int prsctp_enable; int prsctp_enable;
/* Flag to indicate if PR-CONFIG is enabled. */
int reconf_enable;
/* Flag to idicate if SCTP-AUTH is enabled */ /* Flag to idicate if SCTP-AUTH is enabled */
int auth_enable; int auth_enable;
......
...@@ -1255,7 +1255,8 @@ struct sctp_endpoint { ...@@ -1255,7 +1255,8 @@ struct sctp_endpoint {
struct list_head endpoint_shared_keys; struct list_head endpoint_shared_keys;
__u16 active_key_id; __u16 active_key_id;
__u8 auth_enable:1, __u8 auth_enable:1,
prsctp_enable:1; prsctp_enable:1,
reconf_enable:1;
}; };
/* Recover the outter endpoint structure. */ /* Recover the outter endpoint structure. */
...@@ -1508,6 +1509,7 @@ struct sctp_association { ...@@ -1508,6 +1509,7 @@ struct sctp_association {
hostname_address:1, /* Peer understands DNS addresses? */ hostname_address:1, /* Peer understands DNS addresses? */
asconf_capable:1, /* Does peer support ADDIP? */ asconf_capable:1, /* Does peer support ADDIP? */
prsctp_capable:1, /* Can peer do PR-SCTP? */ prsctp_capable:1, /* Can peer do PR-SCTP? */
reconf_capable:1, /* Can peer do RE-CONFIG? */
auth_capable:1; /* Is peer doing SCTP-AUTH? */ auth_capable:1; /* Is peer doing SCTP-AUTH? */
/* sack_needed : This flag indicates if the next received /* sack_needed : This flag indicates if the next received
...@@ -1867,7 +1869,8 @@ struct sctp_association { ...@@ -1867,7 +1869,8 @@ struct sctp_association {
__u8 need_ecne:1, /* Need to send an ECNE Chunk? */ __u8 need_ecne:1, /* Need to send an ECNE Chunk? */
temp:1, /* Is it a temporary association? */ temp:1, /* Is it a temporary association? */
prsctp_enable:1; prsctp_enable:1,
reconf_enable:1;
__u32 strreset_outseq; /* Update after receiving response */ __u32 strreset_outseq; /* Update after receiving response */
__u32 strreset_inseq; /* Update after receiving request */ __u32 strreset_inseq; /* Update after receiving request */
......
...@@ -270,6 +270,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a ...@@ -270,6 +270,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
asoc->active_key_id = ep->active_key_id; asoc->active_key_id = ep->active_key_id;
asoc->prsctp_enable = ep->prsctp_enable; asoc->prsctp_enable = ep->prsctp_enable;
asoc->reconf_enable = ep->reconf_enable;
/* Save the hmacs and chunks list into this association */ /* Save the hmacs and chunks list into this association */
if (ep->auth_hmacs_list) if (ep->auth_hmacs_list)
......
...@@ -164,6 +164,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, ...@@ -164,6 +164,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
ep->auth_hmacs_list = auth_hmacs; ep->auth_hmacs_list = auth_hmacs;
ep->auth_chunk_list = auth_chunks; ep->auth_chunk_list = auth_chunks;
ep->prsctp_enable = net->sctp.prsctp_enable; ep->prsctp_enable = net->sctp.prsctp_enable;
ep->reconf_enable = net->sctp.reconf_enable;
return ep; return ep;
......
...@@ -1258,6 +1258,9 @@ static int __net_init sctp_defaults_init(struct net *net) ...@@ -1258,6 +1258,9 @@ static int __net_init sctp_defaults_init(struct net *net)
/* Enable PR-SCTP by default. */ /* Enable PR-SCTP by default. */
net->sctp.prsctp_enable = 1; net->sctp.prsctp_enable = 1;
/* Disable RECONF by default. */
net->sctp.reconf_enable = 0;
/* Disable AUTH by default. */ /* Disable AUTH by default. */
net->sctp.auth_enable = 0; net->sctp.auth_enable = 0;
......
...@@ -270,6 +270,11 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, ...@@ -270,6 +270,11 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
num_ext += 2; num_ext += 2;
} }
if (asoc->reconf_enable) {
extensions[num_ext] = SCTP_CID_RECONF;
num_ext += 1;
}
if (sp->adaptation_ind) if (sp->adaptation_ind)
chunksize += sizeof(aiparam); chunksize += sizeof(aiparam);
...@@ -434,6 +439,11 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, ...@@ -434,6 +439,11 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
num_ext += 2; num_ext += 2;
} }
if (asoc->peer.reconf_capable) {
extensions[num_ext] = SCTP_CID_RECONF;
num_ext += 1;
}
if (sp->adaptation_ind) if (sp->adaptation_ind)
chunksize += sizeof(aiparam); chunksize += sizeof(aiparam);
...@@ -2012,6 +2022,11 @@ static void sctp_process_ext_param(struct sctp_association *asoc, ...@@ -2012,6 +2022,11 @@ static void sctp_process_ext_param(struct sctp_association *asoc,
for (i = 0; i < num_ext; i++) { for (i = 0; i < num_ext; i++) {
switch (param.ext->chunks[i]) { switch (param.ext->chunks[i]) {
case SCTP_CID_RECONF:
if (asoc->reconf_enable &&
!asoc->peer.reconf_capable)
asoc->peer.reconf_capable = 1;
break;
case SCTP_CID_FWD_TSN: case SCTP_CID_FWD_TSN:
if (asoc->prsctp_enable && !asoc->peer.prsctp_capable) if (asoc->prsctp_enable && !asoc->peer.prsctp_capable)
asoc->peer.prsctp_capable = 1; asoc->peer.prsctp_capable = 1;
......
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