Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Dec 2014 14:59:21 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r275830 - head/sbin/ping6
Message-ID:  <201412161459.sBGExLov029308@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Tue Dec 16 14:59:20 2014
New Revision: 275830
URL: https://svnweb.freebsd.org/changeset/base/275830

Log:
  Add ability to not specify a zone identifier twice, when both source and
  destination addresses are specified.
  For example:
  	# ping6 -S fe80::1%ix0 ff02::1
  or
  	# ping6 -S fe80::1 fe80::2%ix0
  
  Obtained from:	Yandex LLC
  Sponsored by:	Yandex LLC

Modified:
  head/sbin/ping6/ping6.c

Modified: head/sbin/ping6/ping6.c
==============================================================================
--- head/sbin/ping6/ping6.c	Tue Dec 16 14:50:33 2014	(r275829)
+++ head/sbin/ping6/ping6.c	Tue Dec 16 14:59:20 2014	(r275830)
@@ -648,11 +648,20 @@ main(int argc, char *argv[])
 		err(1, "socket");
 
 	/* set the source address if specified. */
-	if ((options & F_SRCADDR) &&
-	    bind(s, (struct sockaddr *)&src, srclen) != 0) {
-		err(1, "bind");
+	if ((options & F_SRCADDR) != 0) {
+		/* properly fill sin6_scope_id */
+		if (IN6_IS_ADDR_LINKLOCAL(&src.sin6_addr) && (
+		    IN6_IS_ADDR_LINKLOCAL(&dst.sin6_addr) ||
+		    IN6_IS_ADDR_MC_LINKLOCAL(&dst.sin6_addr) ||
+		    IN6_IS_ADDR_MC_NODELOCAL(&dst.sin6_addr))) {
+			if (src.sin6_scope_id == 0)
+				src.sin6_scope_id = dst.sin6_scope_id;
+			if (dst.sin6_scope_id == 0)
+				dst.sin6_scope_id = src.sin6_scope_id;
+		}
+		if (bind(s, (struct sockaddr *)&src, srclen) != 0)
+			err(1, "bind");
 	}
-
 	/* set the gateway (next hop) if specified */
 	if (gateway) {
 		memset(&hints, 0, sizeof(hints));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201412161459.sBGExLov029308>