Don't send SHUTDOWN chunk when the association is in a front state
and the applications calls shutdown(..., SHUT_WR) or shutdown(..., SHUT_RDWR). MFC after: 1 week.
This commit is contained in:
parent
dd76e27f7a
commit
8ca16419bb
@ -3640,13 +3640,11 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from)
|
||||
* macro here since le_next will get freed as part of the
|
||||
* sctp_free_assoc() call.
|
||||
*/
|
||||
if (so) {
|
||||
#ifdef IPSEC
|
||||
if (ip_pcb->inp_sp != NULL) {
|
||||
ipsec_delete_pcbpolicy(ip_pcb);
|
||||
#endif /* IPSEC */
|
||||
|
||||
/* Unlocks not needed since the socket is gone now */
|
||||
}
|
||||
#endif
|
||||
if (ip_pcb->inp_options) {
|
||||
(void)sctp_m_free(ip_pcb->inp_options);
|
||||
ip_pcb->inp_options = 0;
|
||||
|
@ -1007,16 +1007,15 @@ sctp_shutdown(struct socket *so)
|
||||
} else {
|
||||
netp = stcb->asoc.primary_destination;
|
||||
}
|
||||
if (TAILQ_EMPTY(&asoc->send_queue) &&
|
||||
if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) &&
|
||||
TAILQ_EMPTY(&asoc->send_queue) &&
|
||||
TAILQ_EMPTY(&asoc->sent_queue) &&
|
||||
(asoc->stream_queue_cnt == 0)) {
|
||||
if (asoc->locked_on_sending) {
|
||||
goto abort_anyway;
|
||||
}
|
||||
/* there is nothing queued to send, so I'm done... */
|
||||
if (SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) {
|
||||
SCTP_STAT_DECR_GAUGE32(sctps_currestab);
|
||||
}
|
||||
SCTP_STAT_DECR_GAUGE32(sctps_currestab);
|
||||
SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT);
|
||||
SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING);
|
||||
sctp_stop_timers_for_shutdown(stcb);
|
||||
|
Loading…
Reference in New Issue
Block a user