diff options
Diffstat (limited to 'net/sctp/sm_statefuns.c')
| -rw-r--r-- | net/sctp/sm_statefuns.c | 35 | 
1 files changed, 27 insertions, 8 deletions
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index c9ae3404b1bb..713a669d2058 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c @@ -3824,6 +3824,29 @@ enum sctp_disposition sctp_sf_do_asconf(struct net *net,  	return SCTP_DISPOSITION_CONSUME;  } +static enum sctp_disposition sctp_send_next_asconf( +					struct net *net, +					const struct sctp_endpoint *ep, +					struct sctp_association *asoc, +					const union sctp_subtype type, +					struct sctp_cmd_seq *commands) +{ +	struct sctp_chunk *asconf; +	struct list_head *entry; + +	if (list_empty(&asoc->addip_chunk_list)) +		return SCTP_DISPOSITION_CONSUME; + +	entry = asoc->addip_chunk_list.next; +	asconf = list_entry(entry, struct sctp_chunk, list); + +	list_del_init(entry); +	sctp_chunk_hold(asconf); +	asoc->addip_last_asconf = asconf; + +	return sctp_sf_do_prm_asconf(net, ep, asoc, type, asconf, commands); +} +  /*   * ADDIP Section 4.3 General rules for address manipulation   * When building TLV parameters for the ASCONF Chunk that will add or @@ -3915,14 +3938,10 @@ enum sctp_disposition sctp_sf_do_asconf_ack(struct net *net,  				SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));  		if (!sctp_process_asconf_ack((struct sctp_association *)asoc, -					     asconf_ack)) { -			/* Successfully processed ASCONF_ACK.  We can -			 * release the next asconf if we have one. -			 */ -			sctp_add_cmd_sf(commands, SCTP_CMD_SEND_NEXT_ASCONF, -					SCTP_NULL()); -			return SCTP_DISPOSITION_CONSUME; -		} +					     asconf_ack)) +			return sctp_send_next_asconf(net, ep, +					(struct sctp_association *)asoc, +							type, commands);  		abort = sctp_make_abort(asoc, asconf_ack,  					sizeof(struct sctp_errhdr));  | 
