Author: tuexen
Date: Sun Jun 14 22:14:00 2015
New Revision: 284393
URL: https://svnweb.freebsd.org/changeset/base/284393

Log:
  Correctly detect the case where the last address is removed.
  
  MFC after: 3 days

Modified:
  head/sys/netinet/sctp_asconf.c

Modified: head/sys/netinet/sctp_asconf.c
==============================================================================
--- head/sys/netinet/sctp_asconf.c      Sun Jun 14 21:50:38 2015        
(r284392)
+++ head/sys/netinet/sctp_asconf.c      Sun Jun 14 22:14:00 2015        
(r284393)
@@ -1328,6 +1328,7 @@ sctp_asconf_queue_add(struct sctp_tcb *s
 {
        uint32_t status;
        int pending_delete_queued = 0;
+       int last;
 
        /* see if peer supports ASCONF */
        if (stcb->asoc.asconf_supported == 0) {
@@ -1337,15 +1338,21 @@ sctp_asconf_queue_add(struct sctp_tcb *s
         * if this is deleting the last address from the assoc, mark it as
         * pending.
         */
-       if ((type == SCTP_DEL_IP_ADDRESS) && !stcb->asoc.asconf_del_pending &&
-           (sctp_local_addr_count(stcb) < 2)) {
-               /* set the pending delete info only */
-               stcb->asoc.asconf_del_pending = 1;
-               stcb->asoc.asconf_addr_del_pending = ifa;
-               atomic_add_int(&ifa->refcount, 1);
-               SCTPDBG(SCTP_DEBUG_ASCONF2,
-                   "asconf_queue_add: mark delete last address pending\n");
-               return (-1);
+       if ((type == SCTP_DEL_IP_ADDRESS) && !stcb->asoc.asconf_del_pending) {
+               if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) {
+                       last = (sctp_local_addr_count(stcb) == 0);
+               } else {
+                       last = (sctp_local_addr_count(stcb) == 1);
+               }
+               if (last) {
+                       /* set the pending delete info only */
+                       stcb->asoc.asconf_del_pending = 1;
+                       stcb->asoc.asconf_addr_del_pending = ifa;
+                       atomic_add_int(&ifa->refcount, 1);
+                       SCTPDBG(SCTP_DEBUG_ASCONF2,
+                           "asconf_queue_add: mark delete last address 
pending\n");
+                       return (-1);
+               }
        }
        /* queue an asconf parameter */
        status = sctp_asconf_queue_mgmt(stcb, ifa, type);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to