|
|
@@ -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));
|