Author: tuexen
Date: Wed Mar 11 14:25:23 2015
New Revision: 279886
URL: https://svnweb.freebsd.org/changeset/base/279886

Log:
  Fix the adaptation of the path state when thresholds are changed
  using the SCTP_PEER_ADDR_THLDS socket option.
  
  MFC after: 3 days

Modified:
  head/sys/netinet/sctp_usrreq.c

Modified: head/sys/netinet/sctp_usrreq.c
==============================================================================
--- head/sys/netinet/sctp_usrreq.c      Wed Mar 11 13:07:11 2015        
(r279885)
+++ head/sys/netinet/sctp_usrreq.c      Wed Mar 11 14:25:23 2015        
(r279886)
@@ -6189,14 +6189,16 @@ sctp_setopt(struct socket *so, int optna
                        }
                        if (stcb != NULL) {
                                if (net != NULL) {
+                                       net->failure_threshold = 
thlds->spt_pathmaxrxt;
+                                       net->pf_threshold = 
thlds->spt_pathpfthld;
                                        if (net->dest_state & SCTP_ADDR_PF) {
-                                               if ((net->failure_threshold > 
thlds->spt_pathmaxrxt) ||
-                                                   (net->failure_threshold <= 
thlds->spt_pathpfthld)) {
+                                               if ((net->error_count > 
net->failure_threshold) ||
+                                                   (net->error_count <= 
net->pf_threshold)) {
                                                        net->dest_state &= 
~SCTP_ADDR_PF;
                                                }
                                        } else {
-                                               if ((net->failure_threshold > 
thlds->spt_pathpfthld) &&
-                                                   (net->failure_threshold <= 
thlds->spt_pathmaxrxt)) {
+                                               if ((net->error_count > 
net->pf_threshold) &&
+                                                   (net->error_count <= 
net->failure_threshold)) {
                                                        net->dest_state |= 
SCTP_ADDR_PF;
                                                        sctp_send_hb(stcb, net, 
SCTP_SO_LOCKED);
                                                        
sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, 
SCTP_FROM_SCTP_TIMER + SCTP_LOC_3);
@@ -6204,28 +6206,28 @@ sctp_setopt(struct socket *so, int optna
                                                }
                                        }
                                        if (net->dest_state & 
SCTP_ADDR_REACHABLE) {
-                                               if (net->failure_threshold > 
thlds->spt_pathmaxrxt) {
+                                               if (net->error_count > 
net->failure_threshold) {
                                                        net->dest_state &= 
~SCTP_ADDR_REACHABLE;
                                                        
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, 0, net, SCTP_SO_LOCKED);
                                                }
                                        } else {
-                                               if (net->failure_threshold <= 
thlds->spt_pathmaxrxt) {
+                                               if (net->error_count <= 
net->failure_threshold) {
                                                        net->dest_state |= 
SCTP_ADDR_REACHABLE;
                                                        
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, net, SCTP_SO_LOCKED);
                                                }
                                        }
-                                       net->failure_threshold = 
thlds->spt_pathmaxrxt;
-                                       net->pf_threshold = 
thlds->spt_pathpfthld;
                                } else {
                                        TAILQ_FOREACH(net, &stcb->asoc.nets, 
sctp_next) {
+                                               net->failure_threshold = 
thlds->spt_pathmaxrxt;
+                                               net->pf_threshold = 
thlds->spt_pathpfthld;
                                                if (net->dest_state & 
SCTP_ADDR_PF) {
-                                                       if 
((net->failure_threshold > thlds->spt_pathmaxrxt) ||
-                                                           
(net->failure_threshold <= thlds->spt_pathpfthld)) {
+                                                       if ((net->error_count > 
net->failure_threshold) ||
+                                                           (net->error_count 
<= net->pf_threshold)) {
                                                                net->dest_state 
&= ~SCTP_ADDR_PF;
                                                        }
                                                } else {
-                                                       if 
((net->failure_threshold > thlds->spt_pathpfthld) &&
-                                                           
(net->failure_threshold <= thlds->spt_pathmaxrxt)) {
+                                                       if ((net->error_count > 
net->pf_threshold) &&
+                                                           (net->error_count 
<= net->failure_threshold)) {
                                                                net->dest_state 
|= SCTP_ADDR_PF;
                                                                
sctp_send_hb(stcb, net, SCTP_SO_LOCKED);
                                                                
sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, 
SCTP_FROM_SCTP_TIMER + SCTP_LOC_3);
@@ -6233,18 +6235,16 @@ sctp_setopt(struct socket *so, int optna
                                                        }
                                                }
                                                if (net->dest_state & 
SCTP_ADDR_REACHABLE) {
-                                                       if 
(net->failure_threshold > thlds->spt_pathmaxrxt) {
+                                                       if (net->error_count > 
net->failure_threshold) {
                                                                net->dest_state 
&= ~SCTP_ADDR_REACHABLE;
                                                                
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, 0, net, SCTP_SO_LOCKED);
                                                        }
                                                } else {
-                                                       if 
(net->failure_threshold <= thlds->spt_pathmaxrxt) {
+                                                       if (net->error_count <= 
net->failure_threshold) {
                                                                net->dest_state 
|= SCTP_ADDR_REACHABLE;
                                                                
sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, net, SCTP_SO_LOCKED);
                                                        }
                                                }
-                                               net->failure_threshold = 
thlds->spt_pathmaxrxt;
-                                               net->pf_threshold = 
thlds->spt_pathpfthld;
                                        }
                                        stcb->asoc.def_net_failure = 
thlds->spt_pathmaxrxt;
                                        stcb->asoc.def_net_pf_threshold = 
thlds->spt_pathpfthld;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to