diff options
Diffstat (limited to 'net/sctp/sm_make_chunk.c')
| -rw-r--r-- | net/sctp/sm_make_chunk.c | 34 | 
1 files changed, 21 insertions, 13 deletions
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 36bd8a6e82df..e41ed2e0ae7d 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -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; @@ -245,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); @@ -255,7 +256,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; @@ -336,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 @@ -1964,7 +1966,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 +1995,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 +2005,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 +2026,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 +2148,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; @@ -2597,15 +2600,20 @@ 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);  		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);  |