Author: tuexen
Date: Thu May 28 19:28:08 2015
New Revision: 283665
URL: https://svnweb.freebsd.org/changeset/base/283665

Log:
  Take source and destination address into account when determining
  the scope.
  This fixes a problem when a client with a global address
  connects to a server with a private address.
  Thanks to Irene Ruengeler in helping me to find the issue.
  
  MFC after: 3 days

Modified:
  head/sys/netinet/sctp_output.c

Modified: head/sys/netinet/sctp_output.c
==============================================================================
--- head/sys/netinet/sctp_output.c      Thu May 28 18:52:32 2015        
(r283664)
+++ head/sys/netinet/sctp_output.c      Thu May 28 19:28:08 2015        
(r283665)
@@ -5612,7 +5612,8 @@ do_a_abort:
                                stc.laddr_type = SCTP_IPV4_ADDRESS;
                                /* scope_id is only for v6 */
                                stc.scope_id = 0;
-                               if (IN4_ISPRIVATE_ADDRESS(&src4->sin_addr)) {
+                               if ((IN4_ISPRIVATE_ADDRESS(&src4->sin_addr)) ||
+                                   (IN4_ISPRIVATE_ADDRESS(&dst4->sin_addr))) {
                                        stc.ipv4_scope = 1;
                                }
                                /* Must use the address in this case */
@@ -5636,16 +5637,18 @@ do_a_abort:
                                        stc.local_scope = 0;
                                        stc.site_scope = 1;
                                        stc.ipv4_scope = 1;
-                               } else if 
(IN6_IS_ADDR_LINKLOCAL(&src6->sin6_addr)) {
+                               } else if 
(IN6_IS_ADDR_LINKLOCAL(&src6->sin6_addr) ||
+                                   IN6_IS_ADDR_LINKLOCAL(&dst6->sin6_addr)) {
                                        /*
-                                        * If the new destination is a
-                                        * LINK_LOCAL we must have common
-                                        * both site and local scope. Don't
-                                        * set local scope though since we
-                                        * must depend on the source to be
-                                        * added implicitly. We cannot
-                                        * assure just because we share one
-                                        * link that all links are common.
+                                        * If the new destination or source
+                                        * is a LINK_LOCAL we must have
+                                        * common both site and local scope.
+                                        * Don't set local scope though
+                                        * since we must depend on the
+                                        * source to be added implicitly. We
+                                        * cannot assure just because we
+                                        * share one link that all links are
+                                        * common.
                                         */
                                        stc.local_scope = 0;
                                        stc.site_scope = 1;
@@ -5661,11 +5664,12 @@ do_a_abort:
                                         * pull out the scope_id from
                                         * incoming pkt
                                         */
-                               } else if 
(IN6_IS_ADDR_SITELOCAL(&src6->sin6_addr)) {
+                               } else if 
(IN6_IS_ADDR_SITELOCAL(&src6->sin6_addr) ||
+                                   IN6_IS_ADDR_SITELOCAL(&dst6->sin6_addr)) {
                                        /*
-                                        * If the new destination is
-                                        * SITE_LOCAL then we must have site
-                                        * scope in common.
+                                        * If the new destination or source
+                                        * is SITE_LOCAL then we must have
+                                        * site scope in common.
                                         */
                                        stc.site_scope = 1;
                                }
_______________________________________________
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