4984993 ping -v <ipv6 address> broken onnv_45
authormh138676
Mon, 24 Jul 2006 21:00:20 -0700
changeset 2428 31f1987cf127
parent 2427 098be5c54062
child 2429 d2b380bdc797
4984993 ping -v <ipv6 address> broken 6429228 fix for 6281206 causes continuous update_ra_flags error messages on the console 6441279 ndpd log API should be const correct
usr/src/cmd/cmd-inet/usr.lib/in.ndpd/defs.h
usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c
usr/src/cmd/cmd-inet/usr.lib/in.ndpd/ndp.c
usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h
usr/src/cmd/cmd-inet/usr.sbin/ping/ping.c
--- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/defs.h	Mon Jul 24 20:05:31 2006 -0700
+++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/defs.h	Mon Jul 24 21:00:20 2006 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -64,6 +63,8 @@
 #include <netinet/icmp6.h>
 #include <net/route.h>
 
+#include "tables.h"
+
 #ifdef	__cplusplus
 extern "C" {
 #endif
@@ -130,8 +131,10 @@
 #define	MAXARGSPERLINE	128
 
 void		timer_schedule(uint_t delay);
-extern void	logmsg(int level, char *fmt, ...);
-extern void	logperror(char *str);
+extern void	logmsg(int level, const char *fmt, ...);
+extern void	logperror(const char *str);
+extern void	logperror_pi(const struct phyint *pi, const char *str);
+extern void	logperror_pr(const struct prefix *pr, const char *str);
 extern int	parse_config(char *config_file, boolean_t file_required);
 
 extern int	poll_add(int fd);
--- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c	Mon Jul 24 20:05:31 2006 -0700
+++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c	Mon Jul 24 21:00:20 2006 -0700
@@ -1965,7 +1965,7 @@
 
 /* PRINTFLIKE1 */
 void
-logmsg(int level, char *fmt, ...)
+logmsg(int level, const char *fmt, ...)
 {
 	va_list ap;
 	va_start(ap, fmt);
@@ -1980,7 +1980,7 @@
 }
 
 void
-logperror(char *str)
+logperror(const char *str)
 {
 	if (logging) {
 		syslog(LOG_ERR, "%s: %m\n", str);
@@ -1991,7 +1991,7 @@
 }
 
 void
-logperror_pi(struct phyint *pi, char *str)
+logperror_pi(const struct phyint *pi, const char *str)
 {
 	if (logging) {
 		syslog(LOG_ERR, "%s (interface %s): %m\n",
@@ -2004,7 +2004,7 @@
 }
 
 void
-logperror_pr(struct prefix *pr, char *str)
+logperror_pr(const struct prefix *pr, const char *str)
 {
 	if (logging) {
 		syslog(LOG_ERR, "%s (prefix %s if %s): %m\n",
--- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/ndp.c	Mon Jul 24 20:05:31 2006 -0700
+++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/ndp.c	Mon Jul 24 21:00:20 2006 -0700
@@ -65,7 +65,7 @@
 static void	verify_mtu_opt(struct phyint *pi, uchar_t *opt,
 		    char *frombuf);
 
-static void	update_ra_flag(struct phyint *pi,
+static void	update_ra_flag(const struct phyint *pi,
 		    const struct sockaddr_in6 *from, int isrouter);
 
 static uint_t	ra_flags;	/* Global to detect when to trigger DHCP */
@@ -445,7 +445,7 @@
 		opt = (struct nd_opt_hdr *)((char *)opt + optlen);
 		len -= optlen;
 	}
-	if (!slla_opt_present)
+	if (!loopback && !slla_opt_present)
 		update_ra_flag(pi, from, NDF_ISROUTER_ON);
 	/* Stop sending solicitations */
 	check_to_solicit(pi, SOLICIT_DONE);
@@ -1364,7 +1364,8 @@
  * Update IsRouter Flag for Host turning into a router or vice-versa.
  */
 static void
-update_ra_flag(struct phyint *pi, const struct sockaddr_in6 *from, int isrouter)
+update_ra_flag(const struct phyint *pi, const struct sockaddr_in6 *from,
+    int isrouter)
 {
 	struct lifreq lifr;
 	char abuf[INET6_ADDRSTRLEN];
@@ -1386,7 +1387,14 @@
 	(void) strlcpy(lifr.lifr_name, pi->pi_name, sizeof (lifr.lifr_name));
 
 	if (ioctl(pi->pi_sock, SIOCLIFGETND, (char *)&lifr) < 0) {
-		logperror_pi(pi, "update_ra_flag: SIOCLIFGETND");
+		if (errno == ESRCH) {
+			if (debug & D_IFSCAN) {
+				logmsg(LOG_DEBUG,
+"update_ra_flag: SIOCLIFGETND: nce doesn't exist, not setting IFF_ROUTER");
+			}
+		} else {
+			logperror_pi(pi, "update_ra_flag: SIOCLIFGETND");
+		}
 	} else {
 		/*
 		 * The lif_nd_req structure has three state values to be used
--- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h	Mon Jul 24 20:05:31 2006 -0700
+++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h	Mon Jul 24 21:00:20 2006 -0700
@@ -323,8 +323,6 @@
 extern uint_t		router_timer(struct router *dr, uint_t elapsed);
 
 
-extern void	logperror_pi(struct phyint *pi, char *str);
-extern void	logperror_pr(struct prefix *pr, char *str);
 extern void	check_to_advertise(struct phyint *pi, enum adv_events event);
 extern void	check_to_solicit(struct phyint *pi,
 		    enum solicit_events event);
--- a/usr/src/cmd/cmd-inet/usr.sbin/ping/ping.c	Mon Jul 24 20:05:31 2006 -0700
+++ b/usr/src/cmd/cmd-inet/usr.sbin/ping/ping.c	Mon Jul 24 21:00:20 2006 -0700
@@ -1471,13 +1471,6 @@
 			    progname, strerror(errno));
 			exit(EXIT_FAILURE);
 		}
-		if (setsockopt(recv_sock, IPPROTO_IPV6, IPV6_RECVRTHDRDSTOPTS,
-		    (char *)&on, sizeof (on)) == -1) {
-			Fprintf(stderr,
-			    "%s: setsockopt IPV6_RECVRTHDRDSTOPTS %s\n",
-			    progname, strerror(errno));
-			exit(EXIT_FAILURE);
-		}
 	}
 
 	*send_sockp = send_sock;