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