Author: tuexen
Date: Tue Aug 21 13:25:32 2018
New Revision: 338134
URL: https://svnweb.freebsd.org/changeset/base/338134

Log:
  Refactor the SHUTDOWN_PENDING state handling.
  
  This is not a functional change but a preperation for the upcoming
  DTrace support. It is necessary to change the state in one
  logical operation, even if it involves clearing the sub state
  SHUTDOWN_PENDING.
  
  MFC after:            1 month

Modified:
  head/sys/netinet/sctp_constants.h
  head/sys/netinet/sctp_indata.c
  head/sys/netinet/sctp_input.c
  head/sys/netinet/sctp_output.c
  head/sys/netinet/sctp_pcb.c
  head/sys/netinet/sctp_timer.c
  head/sys/netinet/sctp_usrreq.c
  head/sys/netinet/sctputil.c
  head/sys/netinet/sctputil.h

Modified: head/sys/netinet/sctp_constants.h
==============================================================================
--- head/sys/netinet/sctp_constants.h   Tue Aug 21 11:22:49 2018        
(r338133)
+++ head/sys/netinet/sctp_constants.h   Tue Aug 21 13:25:32 2018        
(r338134)
@@ -473,11 +473,11 @@ __FBSDID("$FreeBSD$");
 #define SCTP_GET_STATE(_stcb) \
        ((_stcb)->asoc.state & SCTP_STATE_MASK)
 #define SCTP_SET_STATE(_stcb, _state) \
-       (_stcb)->asoc.state = ((_stcb)->asoc.state & ~SCTP_STATE_MASK) | 
(_state)
+       sctp_set_state(_stcb, _state)
 #define SCTP_CLEAR_SUBSTATE(_stcb, _substate) \
        (_stcb)->asoc.state &= ~(_substate)
 #define SCTP_ADD_SUBSTATE(_stcb, _substate) \
-       (_stcb)->asoc.state |= (_substate)
+       sctp_add_substate(_stcb, _substate)
 
 /* SCTP reachability state for each address */
 #define SCTP_ADDR_REACHABLE            0x001

Modified: head/sys/netinet/sctp_indata.c
==============================================================================
--- head/sys/netinet/sctp_indata.c      Tue Aug 21 11:22:49 2018        
(r338133)
+++ head/sys/netinet/sctp_indata.c      Tue Aug 21 13:25:32 2018        
(r338134)
@@ -4355,7 +4355,6 @@ again:
                                SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                        }
                        SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_SENT);
-                       SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
                        sctp_stop_timers_for_shutdown(stcb);
                        if (asoc->alternate) {
                                netp = asoc->alternate;
@@ -4373,7 +4372,6 @@ again:
 
                        SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                        SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_ACK_SENT);
-                       SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
                        sctp_stop_timers_for_shutdown(stcb);
                        if (asoc->alternate) {
                                netp = asoc->alternate;
@@ -5052,7 +5050,6 @@ hopeless_peer:
                                SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                        }
                        SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_SENT);
-                       SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
                        sctp_stop_timers_for_shutdown(stcb);
                        if (asoc->alternate) {
                                netp = asoc->alternate;
@@ -5071,7 +5068,6 @@ hopeless_peer:
 
                        SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                        SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_ACK_SENT);
-                       SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
                        sctp_stop_timers_for_shutdown(stcb);
                        if (asoc->alternate) {
                                netp = asoc->alternate;

Modified: head/sys/netinet/sctp_input.c
==============================================================================
--- head/sys/netinet/sctp_input.c       Tue Aug 21 11:22:49 2018        
(r338133)
+++ head/sys/netinet/sctp_input.c       Tue Aug 21 13:25:32 2018        
(r338134)
@@ -962,7 +962,6 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp,
                    (SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_ACK_SENT) &&
                    (SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_SENT)) {
                        SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_RECEIVED);
-                       SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
                        /*
                         * notify upper layer that peer has initiated a
                         * shutdown
@@ -997,7 +996,6 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp,
                    (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) {
                        SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                }
-               SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
                if (SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_ACK_SENT) {
                        SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_ACK_SENT);
                        sctp_stop_timers_for_shutdown(stcb);

Modified: head/sys/netinet/sctp_output.c
==============================================================================
--- head/sys/netinet/sctp_output.c      Tue Aug 21 11:22:49 2018        
(r338133)
+++ head/sys/netinet/sctp_output.c      Tue Aug 21 13:25:32 2018        
(r338134)
@@ -6709,7 +6709,6 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct s
                                                
SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                                        }
                                        SCTP_SET_STATE(stcb, 
SCTP_STATE_SHUTDOWN_SENT);
-                                       SCTP_CLEAR_SUBSTATE(stcb, 
SCTP_STATE_SHUTDOWN_PENDING);
                                        sctp_stop_timers_for_shutdown(stcb);
                                        sctp_send_shutdown(stcb, net);
                                        
sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb,
@@ -13507,7 +13506,6 @@ dataless_eof:
                                        SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                                }
                                SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_SENT);
-                               SCTP_CLEAR_SUBSTATE(stcb, 
SCTP_STATE_SHUTDOWN_PENDING);
                                sctp_stop_timers_for_shutdown(stcb);
                                if (stcb->asoc.alternate) {
                                        netp = stcb->asoc.alternate;

Modified: head/sys/netinet/sctp_pcb.c
==============================================================================
--- head/sys/netinet/sctp_pcb.c Tue Aug 21 11:22:49 2018        (r338133)
+++ head/sys/netinet/sctp_pcb.c Tue Aug 21 13:25:32 2018        (r338134)
@@ -3437,7 +3437,6 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate,
                                                
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(asoc);
                                        if (asoc->asoc.alternate) {
                                                netp = asoc->asoc.alternate;

Modified: head/sys/netinet/sctp_timer.c
==============================================================================
--- head/sys/netinet/sctp_timer.c       Tue Aug 21 11:22:49 2018        
(r338133)
+++ head/sys/netinet/sctp_timer.c       Tue Aug 21 13:25:32 2018        
(r338134)
@@ -1567,7 +1567,6 @@ sctp_autoclose_timer(struct sctp_inpcb *inp,
                                                
SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                                        }
                                        SCTP_SET_STATE(stcb, 
SCTP_STATE_SHUTDOWN_SENT);
-                                       SCTP_CLEAR_SUBSTATE(stcb, 
SCTP_STATE_SHUTDOWN_PENDING);
                                        sctp_stop_timers_for_shutdown(stcb);
                                        if (stcb->asoc.alternate) {
                                                netp = stcb->asoc.alternate;

Modified: head/sys/netinet/sctp_usrreq.c
==============================================================================
--- head/sys/netinet/sctp_usrreq.c      Tue Aug 21 11:22:49 2018        
(r338133)
+++ head/sys/netinet/sctp_usrreq.c      Tue Aug 21 13:25:32 2018        
(r338134)
@@ -739,7 +739,6 @@ sctp_disconnect(struct socket *so)
                                                
SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                                        }
                                        SCTP_SET_STATE(stcb, 
SCTP_STATE_SHUTDOWN_SENT);
-                                       SCTP_CLEAR_SUBSTATE(stcb, 
SCTP_STATE_SHUTDOWN_PENDING);
                                        sctp_stop_timers_for_shutdown(stcb);
                                        if (stcb->asoc.alternate) {
                                                netp = stcb->asoc.alternate;
@@ -946,7 +945,6 @@ sctp_shutdown(struct socket *so)
                        /* there is nothing queued to send, so I'm done... */
                        SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                        SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_SENT);
-                       SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
                        sctp_stop_timers_for_shutdown(stcb);
                        sctp_send_shutdown(stcb, netp);
                        sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN,

Modified: head/sys/netinet/sctputil.c
==============================================================================
--- head/sys/netinet/sctputil.c Tue Aug 21 11:22:49 2018        (r338133)
+++ head/sys/netinet/sctputil.c Tue Aug 21 13:25:32 2018        (r338134)
@@ -7381,3 +7381,25 @@ sctp_hc_get_mtu(union sctp_sockstore *addr, uint16_t f
        }
        return ((uint32_t)tcp_hc_getmtu(&inc));
 }
+void
+sctp_set_state(struct sctp_tcb *stcb, int new_state)
+{
+       KASSERT((new_state & ~SCTP_STATE_MASK) == 0,
+               ("sctp_set_state: Can't set substate (new_state = %x)",
+               new_state));
+       stcb->asoc.state = (stcb->asoc.state & ~SCTP_STATE_MASK) | new_state;
+       if ((new_state == SCTP_STATE_SHUTDOWN_RECEIVED) ||
+           (new_state == SCTP_STATE_SHUTDOWN_SENT) ||
+           (new_state == SCTP_STATE_SHUTDOWN_ACK_SENT)) {
+               SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
+       }
+}
+
+void
+sctp_add_substate(struct sctp_tcb *stcb, int substate)
+{
+       KASSERT((substate & SCTP_STATE_MASK) == 0,
+               ("sctp_add_substate: Can't set state (substate = %x)",
+               substate));
+       stcb->asoc.state |= substate;
+}

Modified: head/sys/netinet/sctputil.h
==============================================================================
--- head/sys/netinet/sctputil.h Tue Aug 21 11:22:49 2018        (r338133)
+++ head/sys/netinet/sctputil.h Tue Aug 21 13:25:32 2018        (r338134)
@@ -388,5 +388,7 @@ void sctp_audit_log(uint8_t, uint8_t);
 uint32_t sctp_min_mtu(uint32_t, uint32_t, uint32_t);
 void sctp_hc_set_mtu(union sctp_sockstore *, uint16_t, uint32_t);
 uint32_t sctp_hc_get_mtu(union sctp_sockstore *, uint16_t);
+void sctp_set_state(struct sctp_tcb *, int);
+void sctp_add_substate(struct sctp_tcb *, int);
 #endif                         /* _KERNEL */
 #endif
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to