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

sctp: add asconf_enable in struct sctp_endpoint

This patch is to make addip/asconf flag per endpoint,
and its value is initialized by the per netns flag,
net->sctp.addip_enable.

It also replaces the checks of net->sctp.addip_enable
with ep->asconf_enable in some places.
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent af809709
...@@ -1325,6 +1325,7 @@ struct sctp_endpoint { ...@@ -1325,6 +1325,7 @@ struct sctp_endpoint {
__u8 auth_enable:1, __u8 auth_enable:1,
intl_enable:1, intl_enable:1,
prsctp_enable:1, prsctp_enable:1,
asconf_enable:1,
reconf_enable:1; reconf_enable:1;
__u8 strreset_enable; __u8 strreset_enable;
......
...@@ -52,6 +52,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, ...@@ -52,6 +52,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
if (!ep->digest) if (!ep->digest)
return NULL; return NULL;
ep->asconf_enable = net->sctp.addip_enable;
ep->auth_enable = net->sctp.auth_enable; ep->auth_enable = net->sctp.auth_enable;
if (ep->auth_enable) { if (ep->auth_enable) {
/* Allocate space for HMACS and CHUNKS authentication /* Allocate space for HMACS and CHUNKS authentication
...@@ -86,7 +87,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, ...@@ -86,7 +87,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
/* If the Add-IP functionality is enabled, we must /* If the Add-IP functionality is enabled, we must
* authenticate, ASCONF and ASCONF-ACK chunks * authenticate, ASCONF and ASCONF-ACK chunks
*/ */
if (net->sctp.addip_enable) { if (ep->asconf_enable) {
auth_chunks->chunks[0] = SCTP_CID_ASCONF; auth_chunks->chunks[0] = SCTP_CID_ASCONF;
auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK; auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK;
auth_chunks->param_hdr.length = auth_chunks->param_hdr.length =
......
...@@ -207,7 +207,6 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, ...@@ -207,7 +207,6 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
const struct sctp_bind_addr *bp, const struct sctp_bind_addr *bp,
gfp_t gfp, int vparam_len) gfp_t gfp, int vparam_len)
{ {
struct net *net = sock_net(asoc->base.sk);
struct sctp_supported_ext_param ext_param; struct sctp_supported_ext_param ext_param;
struct sctp_adaptation_ind_param aiparam; struct sctp_adaptation_ind_param aiparam;
struct sctp_paramhdr *auth_chunks = NULL; struct sctp_paramhdr *auth_chunks = NULL;
...@@ -255,7 +254,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, ...@@ -255,7 +254,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
* the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and * the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and
* INIT-ACK parameters. * INIT-ACK parameters.
*/ */
if (net->sctp.addip_enable) { if (asoc->ep->asconf_enable) {
extensions[num_ext] = SCTP_CID_ASCONF; extensions[num_ext] = SCTP_CID_ASCONF;
extensions[num_ext+1] = SCTP_CID_ASCONF_ACK; extensions[num_ext+1] = SCTP_CID_ASCONF_ACK;
num_ext += 2; num_ext += 2;
...@@ -1964,7 +1963,9 @@ static int sctp_process_hn_param(const struct sctp_association *asoc, ...@@ -1964,7 +1963,9 @@ static int sctp_process_hn_param(const struct sctp_association *asoc,
return 0; return 0;
} }
static int sctp_verify_ext_param(struct net *net, union sctp_params param) static int sctp_verify_ext_param(struct net *net,
const struct sctp_endpoint *ep,
union sctp_params param)
{ {
__u16 num_ext = ntohs(param.p->length) - sizeof(struct sctp_paramhdr); __u16 num_ext = ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
int have_asconf = 0; int have_asconf = 0;
...@@ -1991,7 +1992,7 @@ static int sctp_verify_ext_param(struct net *net, union sctp_params param) ...@@ -1991,7 +1992,7 @@ static int sctp_verify_ext_param(struct net *net, union sctp_params param)
if (net->sctp.addip_noauth) if (net->sctp.addip_noauth)
return 1; return 1;
if (net->sctp.addip_enable && !have_auth && have_asconf) if (ep->asconf_enable && !have_auth && have_asconf)
return 0; return 0;
return 1; return 1;
...@@ -2001,7 +2002,6 @@ static void sctp_process_ext_param(struct sctp_association *asoc, ...@@ -2001,7 +2002,6 @@ static void sctp_process_ext_param(struct sctp_association *asoc,
union sctp_params param) union sctp_params param)
{ {
__u16 num_ext = ntohs(param.p->length) - sizeof(struct sctp_paramhdr); __u16 num_ext = ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
struct net *net = sock_net(asoc->base.sk);
int i; int i;
for (i = 0; i < num_ext; i++) { for (i = 0; i < num_ext; i++) {
...@@ -2023,7 +2023,7 @@ static void sctp_process_ext_param(struct sctp_association *asoc, ...@@ -2023,7 +2023,7 @@ static void sctp_process_ext_param(struct sctp_association *asoc,
break; break;
case SCTP_CID_ASCONF: case SCTP_CID_ASCONF:
case SCTP_CID_ASCONF_ACK: case SCTP_CID_ASCONF_ACK:
if (net->sctp.addip_enable) if (asoc->ep->asconf_enable)
asoc->peer.asconf_capable = 1; asoc->peer.asconf_capable = 1;
break; break;
case SCTP_CID_I_DATA: case SCTP_CID_I_DATA:
...@@ -2145,12 +2145,12 @@ static enum sctp_ierror sctp_verify_param(struct net *net, ...@@ -2145,12 +2145,12 @@ static enum sctp_ierror sctp_verify_param(struct net *net,
break; break;
case SCTP_PARAM_SUPPORTED_EXT: case SCTP_PARAM_SUPPORTED_EXT:
if (!sctp_verify_ext_param(net, param)) if (!sctp_verify_ext_param(net, ep, param))
return SCTP_IERROR_ABORT; return SCTP_IERROR_ABORT;
break; break;
case SCTP_PARAM_SET_PRIMARY: case SCTP_PARAM_SET_PRIMARY:
if (net->sctp.addip_enable) if (ep->asconf_enable)
break; break;
goto fallthrough; goto fallthrough;
...@@ -2605,7 +2605,7 @@ static int sctp_process_param(struct sctp_association *asoc, ...@@ -2605,7 +2605,7 @@ static int sctp_process_param(struct sctp_association *asoc,
break; break;
case SCTP_PARAM_SET_PRIMARY: case SCTP_PARAM_SET_PRIMARY:
if (!net->sctp.addip_enable) if (!ep->asconf_enable)
goto fall_through; goto fall_through;
addr_param = param.v + sizeof(struct sctp_addip_param); addr_param = param.v + sizeof(struct sctp_addip_param);
......
...@@ -524,7 +524,6 @@ static int sctp_send_asconf_add_ip(struct sock *sk, ...@@ -524,7 +524,6 @@ static int sctp_send_asconf_add_ip(struct sock *sk,
struct sockaddr *addrs, struct sockaddr *addrs,
int addrcnt) int addrcnt)
{ {
struct net *net = sock_net(sk);
struct sctp_sock *sp; struct sctp_sock *sp;
struct sctp_endpoint *ep; struct sctp_endpoint *ep;
struct sctp_association *asoc; struct sctp_association *asoc;
...@@ -539,12 +538,12 @@ static int sctp_send_asconf_add_ip(struct sock *sk, ...@@ -539,12 +538,12 @@ static int sctp_send_asconf_add_ip(struct sock *sk,
int i; int i;
int retval = 0; int retval = 0;
if (!net->sctp.addip_enable)
return retval;
sp = sctp_sk(sk); sp = sctp_sk(sk);
ep = sp->ep; ep = sp->ep;
if (!ep->asconf_enable)
return retval;
pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n", pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
__func__, sk, addrs, addrcnt); __func__, sk, addrs, addrcnt);
...@@ -727,7 +726,6 @@ static int sctp_send_asconf_del_ip(struct sock *sk, ...@@ -727,7 +726,6 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
struct sockaddr *addrs, struct sockaddr *addrs,
int addrcnt) int addrcnt)
{ {
struct net *net = sock_net(sk);
struct sctp_sock *sp; struct sctp_sock *sp;
struct sctp_endpoint *ep; struct sctp_endpoint *ep;
struct sctp_association *asoc; struct sctp_association *asoc;
...@@ -743,12 +741,12 @@ static int sctp_send_asconf_del_ip(struct sock *sk, ...@@ -743,12 +741,12 @@ static int sctp_send_asconf_del_ip(struct sock *sk,
int stored = 0; int stored = 0;
chunk = NULL; chunk = NULL;
if (!net->sctp.addip_enable)
return retval;
sp = sctp_sk(sk); sp = sctp_sk(sk);
ep = sp->ep; ep = sp->ep;
if (!ep->asconf_enable)
return retval;
pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n", pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
__func__, sk, addrs, addrcnt); __func__, sk, addrs, addrcnt);
...@@ -3330,7 +3328,6 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned ...@@ -3330,7 +3328,6 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned
static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval, static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval,
unsigned int optlen) unsigned int optlen)
{ {
struct net *net = sock_net(sk);
struct sctp_sock *sp; struct sctp_sock *sp;
struct sctp_association *asoc = NULL; struct sctp_association *asoc = NULL;
struct sctp_setpeerprim prim; struct sctp_setpeerprim prim;
...@@ -3340,7 +3337,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva ...@@ -3340,7 +3337,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva
sp = sctp_sk(sk); sp = sctp_sk(sk);
if (!net->sctp.addip_enable) if (!sp->ep->asconf_enable)
return -EPERM; return -EPERM;
if (optlen != sizeof(struct sctp_setpeerprim)) if (optlen != sizeof(struct sctp_setpeerprim))
......
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