Module Name:    src
Committed By:   martin
Date:           Wed Dec 17 19:25:40 UTC 2014

Modified Files:
        src/doc [netbsd-7]: 3RDPARTY
        src/external/bsd/ppp [netbsd-7]: ppp2netbsd
        src/external/bsd/ppp/dist [netbsd-7]: README
        src/external/bsd/ppp/dist/pppd [netbsd-7]: chap_ms.c ipcp.c ipv6cp.c
            ipv6cp.h options.c patchlevel.h pppd.h tty.c utils.c
        src/external/bsd/ppp/dist/pppd/plugins/pppol2tp [netbsd-7]: pppol2tp.c
        src/external/bsd/ppp/usr.sbin/pppd [netbsd-7]: sys-bsd.c

Log Message:
Pullup the import of pppd 2.4.7, requested by christos in #331:

* Fixed a potential security issue in parsing option files
  (CVE-2014-3158).
* There is a new "stop-bits" option, which takes an argument of
  1 or 2, indicating the number of stop bits to use for async
  serial ports.
* Various bug fixes.


To generate a diff of this commit:
cvs rdiff -u -r1.1145.2.2 -r1.1145.2.3 src/doc/3RDPARTY
cvs rdiff -u -r1.1 -r1.1.6.1 src/external/bsd/ppp/ppp2netbsd
cvs rdiff -u -r1.1.1.1 -r1.1.1.1.6.1 src/external/bsd/ppp/dist/README
cvs rdiff -u -r1.2 -r1.2.6.1 src/external/bsd/ppp/dist/pppd/chap_ms.c \
    src/external/bsd/ppp/dist/pppd/ipcp.c \
    src/external/bsd/ppp/dist/pppd/ipv6cp.c \
    src/external/bsd/ppp/dist/pppd/ipv6cp.h \
    src/external/bsd/ppp/dist/pppd/options.c \
    src/external/bsd/ppp/dist/pppd/patchlevel.h \
    src/external/bsd/ppp/dist/pppd/pppd.h \
    src/external/bsd/ppp/dist/pppd/tty.c \
    src/external/bsd/ppp/dist/pppd/utils.c
cvs rdiff -u -r1.1.1.1 -r1.1.1.1.6.1 \
    src/external/bsd/ppp/dist/pppd/plugins/pppol2tp/pppol2tp.c
cvs rdiff -u -r1.1 -r1.1.6.1 src/external/bsd/ppp/usr.sbin/pppd/sys-bsd.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/doc/3RDPARTY
diff -u src/doc/3RDPARTY:1.1145.2.2 src/doc/3RDPARTY:1.1145.2.3
--- src/doc/3RDPARTY:1.1145.2.2	Tue Nov 18 18:32:29 2014
+++ src/doc/3RDPARTY	Wed Dec 17 19:25:39 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: 3RDPARTY,v 1.1145.2.2 2014/11/18 18:32:29 snj Exp $
+#	$NetBSD: 3RDPARTY,v 1.1145.2.3 2014/12/17 19:25:39 martin Exp $
 #
 # This file contains a list of the software that has been integrated into
 # NetBSD where we are not the primary maintainer.
@@ -1118,8 +1118,8 @@ directory layout (the easiest way to che
 set-permissions'').
 
 Package:	ppp
-Version:	2.4.5
-Current Vers:	2.4.6
+Version:	2.4.7
+Current Vers:	2.4.7
 Maintainer:	Paul Mackerras <pau...@samba.org>
 Archive Site:	ftp://ftp.samba.org/pub/ppp/
 Home Page:

Index: src/external/bsd/ppp/ppp2netbsd
diff -u src/external/bsd/ppp/ppp2netbsd:1.1 src/external/bsd/ppp/ppp2netbsd:1.1.6.1
--- src/external/bsd/ppp/ppp2netbsd:1.1	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/ppp2netbsd	Wed Dec 17 19:25:39 2014
@@ -38,8 +38,7 @@ UNUSED_DIRS="${UNUSED_DIRS} .git" 
 UNUSED_FILES="Changes-2.3 README.linux README.pppoe README.sol2 configure"
 UNUSED_FILES="${UNUSED_FILES} pppd/md[45].* pppd/sha1.* pppd/srp-entry.*"
 UNUSED_FILES="${UNUSED_FILES} pppd/sys-linux.c pppd/sys-solaris.c"
-UNUSED_FILES="${UNUSED_FILES} pppdump/zlib.* pppdump/ppp-comp.h .gitignore"
-UNUSED_FILES="${UNUSED_FILES} pppdump/.gitignore pppdump/bsd-comp.c"
+UNUSED_FILES="${UNUSED_FILES} pppdump/zlib.* pppdump/ppp-comp.h"
 
 # Stuff we don't want
 GPL_DIRS="pppd/plugins/pppoatm pppd/plugins/radius pppd/plugins/rp-pppoe"
@@ -67,4 +66,10 @@ find . -type f -name 'Makefile*' | while
 done
 echo; echo
 
+echo -n "Removing .gitignore... "
+find . -type f -name '.gitignore' | while read m; do
+	rm -f ${m}
+	echo -n "${m} "
+done
+echo; echo
 cleantags .

Index: src/external/bsd/ppp/dist/README
diff -u src/external/bsd/ppp/dist/README:1.1.1.1 src/external/bsd/ppp/dist/README:1.1.1.1.6.1
--- src/external/bsd/ppp/dist/README:1.1.1.1	Thu Nov 28 21:53:41 2013
+++ src/external/bsd/ppp/dist/README	Wed Dec 17 19:25:39 2014
@@ -61,9 +61,39 @@ use any IP address.  (This only applies 
 authenticating itself to you, of course.)
 
 
-What's new in ppp-2.4.5.
+What's new in ppp-2.4.7.
 ************************
 
+* Fixed a potential security issue in parsing option files (CVE-2014-3158).
+
+* There is a new "stop-bits" option, which takes an argument of 1 or 2,
+  indicating the number of stop bits to use for async serial ports.
+
+* Various bug fixes.
+
+
+What was new in ppp-2.4.6.
+**************************
+
+* Man page updates.
+
+* Several bug fixes.
+
+* Options files can now set and unset environment variables for
+  scripts.
+
+* The timeout for chat scripts can now be taken from an environment
+  variable.
+
+* There is a new option, master_detach, which allows pppd to detach
+  from the controlling terminal when it is the multilink bundle master
+  but its own link has terminated, even if the nodetach option has
+  been given.
+
+
+What was new in ppp-2.4.5.
+**************************
+
 * Under Linux, pppd can now operate in a mode where it doesn't request
   the peer's IP address, as some peers refuse to supply an IP address.
   Since Linux supports device routes as well as gateway routes, it's

Index: src/external/bsd/ppp/dist/pppd/chap_ms.c
diff -u src/external/bsd/ppp/dist/pppd/chap_ms.c:1.2 src/external/bsd/ppp/dist/pppd/chap_ms.c:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/chap_ms.c:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/chap_ms.c	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: chap_ms.c,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: chap_ms.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
 /*
  * chap_ms.c - Microsoft MS-CHAP compatible implementation.
@@ -81,7 +81,7 @@
 #define RCSID	"Id: chap_ms.c,v 1.38 2007/12/01 20:10:51 carlsonj Exp "
 static const char rcsid[] = RCSID;
 #else
-__RCSID("$NetBSD: chap_ms.c,v 1.2 2013/11/28 22:33:42 christos Exp $");
+__RCSID("$NetBSD: chap_ms.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $");
 #endif
 
 #ifdef CHAPMS
@@ -391,7 +391,7 @@ chapms2_make_response(unsigned char *res
 		      unsigned char *private)
 {
 	const struct chapms2_response_cache_entry *cache_entry;
-	unsigned char auth_response[MS_AUTH_RESPONSE_LENGTH];
+	unsigned char auth_response[MS_AUTH_RESPONSE_LENGTH+1];
 
 	challenge++;	/* skip length, should be 16 */
 	*response++ = MS_CHAP2_RESPONSE_LEN;
Index: src/external/bsd/ppp/dist/pppd/ipcp.c
diff -u src/external/bsd/ppp/dist/pppd/ipcp.c:1.2 src/external/bsd/ppp/dist/pppd/ipcp.c:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/ipcp.c:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/ipcp.c	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipcp.c,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: ipcp.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
 /*
  * ipcp.c - PPP IP Control Protocol.
@@ -47,7 +47,7 @@
 #define RCSID	"Id: ipcp.c,v 1.73 2008/05/26 08:33:22 paulus Exp "
 static const char rcsid[] = RCSID;
 #else
-__RCSID("$NetBSD: ipcp.c,v 1.2 2013/11/28 22:33:42 christos Exp $");
+__RCSID("$NetBSD: ipcp.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $");
 #endif
 
 /*
@@ -969,6 +969,21 @@ ipcp_ackci(f, p, len)
 	    goto bad; \
     }
 
+#define ACKCIWINS(opt, addr) \
+    if (addr) { \
+	u_int32_t l; \
+	if ((len -= CILEN_ADDR) < 0) \
+	    goto bad; \
+	GETCHAR(citype, p); \
+	GETCHAR(cilen, p); \
+	if (cilen != CILEN_ADDR || citype != opt) \
+	    goto bad; \
+	GETLONG(l, p); \
+	cilong = htonl(l); \
+	if (addr != cilong) \
+	    goto bad; \
+    }
+
     ACKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr,
 	       go->hisaddr);
 
@@ -981,6 +996,10 @@ ipcp_ackci(f, p, len)
 
     ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
 
+    ACKCIWINS(CI_MS_WINS1, go->winsaddr[0]);
+
+    ACKCIWINS(CI_MS_WINS2, go->winsaddr[1]);
+
     /*
      * If there are any remaining CIs, then this packet is bad.
      */
Index: src/external/bsd/ppp/dist/pppd/ipv6cp.c
diff -u src/external/bsd/ppp/dist/pppd/ipv6cp.c:1.2 src/external/bsd/ppp/dist/pppd/ipv6cp.c:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/ipv6cp.c:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/ipv6cp.c	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipv6cp.c,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: ipv6cp.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
 /*
  * ipv6cp.c - PPP IPV6 Control Protocol.
@@ -145,7 +145,7 @@
 #define RCSID	"Id: ipv6cp.c,v 1.21 2005/08/25 23:59:34 paulus Exp "
 static const char rcsid[] = RCSID;
 #else
-__RCSID("$NetBSD: ipv6cp.c,v 1.2 2013/11/28 22:33:42 christos Exp $");
+__RCSID("$NetBSD: ipv6cp.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $");
 #endif
 
 /*
@@ -257,10 +257,8 @@ static option_t ipv6cp_option_list[] = {
     { "ipv6cp-use-ipaddr", o_bool, &ipv6cp_allowoptions[0].use_ip,
       "Use (default) IPv4 address as interface identifier", 1 },
 
-#if defined(SOL2) || defined(__linux__)
     { "ipv6cp-use-persistent", o_bool, &ipv6cp_wantoptions[0].use_persistent,
       "Use uniquely-available persistent value for link local address", 1 },
-#endif /* defined(SOL2) */
 
     { "ipv6cp-restart", o_int, &ipv6cp_fsm[0].timeouttime,
       "Set timeout for IPv6CP", OPT_PRIO },
@@ -1096,7 +1094,6 @@ ipv6_check_options()
     if (!ipv6cp_protent.enabled_flag)
 	return;
 
-#if defined(SOL2) || defined(__linux__)
     /*
      * Persistent link-local id is only used when user has not explicitly
      * configure/hard-code the id
@@ -1116,7 +1113,6 @@ ipv6_check_options()
 	    wo->opt_local = 1;
 	}
     }
-#endif
 
     if (!wo->opt_local) {	/* init interface identifier */
 	if (wo->use_ip && eui64_iszero(wo->ourid)) {
@@ -1154,15 +1150,8 @@ ipv6_demand_conf(u)
 {
     ipv6cp_options *wo = &ipv6cp_wantoptions[u];
 
-#if defined(__linux__) || defined(SOL2) || (defined(SVR4) && (defined(SNI) || defined(__USLC__)))
-#if defined(SOL2)
     if (!sif6up(u))
 	return 0;
-#else
-    if (!sifup(u))
-	return 0;
-#endif /* defined(SOL2) */
-#endif    
     if (!sif6addr(u, wo->ourid, wo->hisid))
 	return 0;
 #if !defined(__linux__) && !(defined(SVR4) && (defined(SNI) || defined(__USLC__)))
@@ -1255,43 +1244,20 @@ ipv6cp_up(f)
 	sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
 
     } else {
-	/*
-	 * Set LL addresses
-	 */
-#if !defined(__linux__) && !defined(SOL2) && !(defined(SVR4) && (defined(SNI) || defined(__USLC__)))
-	if (!sif6addr(f->unit, go->ourid, ho->hisid)) {
-	    if (debug)
-		warn("sif6addr failed");
-	    ipv6cp_close(f->unit, "Interface configuration failed");
-	    return;
-	}
-#endif
-
 	/* bring the interface up for IPv6 */
-#if defined(SOL2)
 	if (!sif6up(f->unit)) {
 	    if (debug)
-		warn("sifup failed (IPV6)");
+		warn("sif6up failed (IPV6)");
 	    ipv6cp_close(f->unit, "Interface configuration failed");
 	    return;
 	}
-#else
-	if (!sifup(f->unit)) {
-	    if (debug)
-		warn("sifup failed (IPV6)");
-	    ipv6cp_close(f->unit, "Interface configuration failed");
-	    return;
-	}
-#endif /* defined(SOL2) */
 
-#if defined(__linux__) || defined(SOL2) || (defined(SVR4) && (defined(SNI) || defined(__USLC__)))
 	if (!sif6addr(f->unit, go->ourid, ho->hisid)) {
 	    if (debug)
 		warn("sif6addr failed");
 	    ipv6cp_close(f->unit, "Interface configuration failed");
 	    return;
 	}
-#endif
 	sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
 
 	notice("local  LL address %s", llv6_ntoa(go->ourid));
@@ -1348,16 +1314,14 @@ ipv6cp_down(f)
     } else {
 	sifnpmode(f->unit, PPP_IPV6, NPMODE_DROP);
 #if !defined(__linux__) && !(defined(SVR4) && (defined(SNI) || defined(__USLC)))
-#if defined(SOL2)
 	sif6down(f->unit);
-#else
-	sifdown(f->unit);
-#endif /* defined(SOL2) */
 #endif
 	ipv6cp_clear_addrs(f->unit, 
 			   ipv6cp_gotoptions[f->unit].ourid,
 			   ipv6cp_hisoptions[f->unit].hisid);
-#if defined(__linux__) || (defined(SVR4) && (defined(SNI) || defined(__USLC)))
+#if defined(__linux__)
+	sif6down(f->unit);
+#elif defined(SVR4) && (defined(SNI) || defined(__USLC))
 	sifdown(f->unit);
 #endif
     }
Index: src/external/bsd/ppp/dist/pppd/ipv6cp.h
diff -u src/external/bsd/ppp/dist/pppd/ipv6cp.h:1.2 src/external/bsd/ppp/dist/pppd/ipv6cp.h:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/ipv6cp.h:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/ipv6cp.h	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipv6cp.h,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: ipv6cp.h,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
 /*
  * ipv6cp.h - PPP IPV6 Control Protocol.
@@ -156,9 +156,7 @@ typedef struct ipv6cp_options {
     int opt_local;		/* ourtoken set by option */
     int opt_remote;		/* histoken set by option */
     int use_ip;			/* use IP as interface identifier */
-#if defined(SOL2) || defined(__linux__)
     int use_persistent;		/* use uniquely persistent value for address */
-#endif /* defined(SOL2) */
     int neg_vj;			/* Van Jacobson Compression? */
     u_short vj_protocol;	/* protocol value to use in VJ option */
     eui64_t ourid, hisid;	/* Interface identifiers */
Index: src/external/bsd/ppp/dist/pppd/options.c
diff -u src/external/bsd/ppp/dist/pppd/options.c:1.2 src/external/bsd/ppp/dist/pppd/options.c:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/options.c:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/options.c	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: options.c,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: options.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
 /*
  * options.c - handles option processing for PPP.
@@ -47,7 +47,7 @@
 #define RCSID	"Id: options.c,v 1.102 2008/06/15 06:53:06 paulus Exp "
 static const char rcsid[] = RCSID;
 #else
-__RCSID("$NetBSD: options.c,v 1.2 2013/11/28 22:33:42 christos Exp $");
+__RCSID("$NetBSD: options.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $");
 #endif
 
 #include <ctype.h>
@@ -792,10 +792,13 @@ process_option(opt, cmd, argv)
 	if (opt->flags & OPT_STATIC) {
 	    strlcpy((char *)(opt->addr), *argv, opt->upper_limit);
 	} else {
+	    char **optptr = (char **)(opt->addr);
 	    sv = strdup(*argv);
 	    if (sv == NULL)
 		novm("option argument");
-	    *(char **)(opt->addr) = sv;
+	    if (*optptr)
+		free(*optptr);
+	    *optptr = sv;
 	}
 	break;
 
@@ -1299,9 +1302,10 @@ getword(f, word, newlinep, filename)
 	    /*
 	     * Store the resulting character for the escape sequence.
 	     */
-	    if (len < MAXWORDLEN-1)
+	    if (len < MAXWORDLEN) {
 		word[len] = value;
-	    ++len;
+		++len;
+	    }
 
 	    if (!got)
 		c = getc(f);
@@ -1339,9 +1343,10 @@ getword(f, word, newlinep, filename)
 	/*
 	 * An ordinary character: store it in the word and get another.
 	 */
-	if (len < MAXWORDLEN-1)
+	if (len < MAXWORDLEN) {
 	    word[len] = c;
-	++len;
+	    ++len;
+	}
 
 	c = getc(f);
     }
Index: src/external/bsd/ppp/dist/pppd/patchlevel.h
diff -u src/external/bsd/ppp/dist/pppd/patchlevel.h:1.2 src/external/bsd/ppp/dist/pppd/patchlevel.h:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/patchlevel.h:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/patchlevel.h	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: patchlevel.h,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: patchlevel.h,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
-#define VERSION		"2.4.5"
-#define DATE		"17 November 2009"
+#define VERSION		"2.4.7"
+#define DATE		"9 August 2014"
Index: src/external/bsd/ppp/dist/pppd/pppd.h
diff -u src/external/bsd/ppp/dist/pppd/pppd.h:1.2 src/external/bsd/ppp/dist/pppd/pppd.h:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/pppd.h:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/pppd.h	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: pppd.h,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: pppd.h,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
 /*
  * pppd.h - PPP daemon global declarations.
@@ -280,6 +280,7 @@ extern int	kdebugflag;	/* Tell kernel to
 extern int	default_device;	/* Using /dev/tty or equivalent */
 extern char	devnam[MAXPATHLEN];	/* Device name */
 extern int	crtscts;	/* Use hardware flow control */
+extern int	stop_bits;	/* Number of serial port stop bits */
 extern bool	modem;		/* Use modem control lines */
 extern int	inspeed;	/* Input/Output speed requested */
 extern u_int32_t netmask;	/* IP netmask to set on interface */
@@ -663,6 +664,8 @@ int  cifaddr __P((int, u_int32_t, u_int3
 				/* Reset i/f IP addresses */
 #ifdef INET6
 int  ether_to_eui64(eui64_t *p_eui64);	/* convert eth0 hw address to EUI64 */
+int  sif6up __P((int));		/* Configure i/f up for IPv6 */
+int  sif6down __P((int));	/* Configure i/f down for IPv6 */
 int  sif6addr __P((int, eui64_t, eui64_t));
 				/* Configure IPv6 addresses for i/f */
 int  cif6addr __P((int, eui64_t, eui64_t));
Index: src/external/bsd/ppp/dist/pppd/tty.c
diff -u src/external/bsd/ppp/dist/pppd/tty.c:1.2 src/external/bsd/ppp/dist/pppd/tty.c:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/tty.c:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/tty.c	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty.c,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: tty.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
 /*
  * tty.c - code for handling serial ports in pppd.
@@ -75,7 +75,7 @@
 #define RCSID	"Id: tty.c,v 1.27 2008/07/01 12:27:56 paulus Exp "
 static const char rcsid[] = RCSID;
 #else
-__RCSID("$NetBSD: tty.c,v 1.2 2013/11/28 22:33:42 christos Exp $");
+__RCSID("$NetBSD: tty.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $");
 #endif
 
 #include <stdio.h>
@@ -144,6 +144,7 @@ struct stat devstat;		/* result of stat(
 
 /* option variables */
 int	crtscts = 0;		/* Use hardware flow control */
+int	stop_bits = 1;		/* Number of serial port stop bits */
 bool	modem = 1;		/* Use modem control lines */
 int	inspeed = 0;		/* Input/Output speed requested */
 bool	lockflag = 0;		/* Create lock file to lock the serial dev */
@@ -229,6 +230,9 @@ option_t tty_options[] = {
       OPT_PRIOSUB | OPT_ALIAS | OPT_NOARG | OPT_VAL(-1) },
     { "xonxoff", o_special_noarg, (void *)setxonxoff,
       "Set software (XON/XOFF) flow control", OPT_PRIOSUB },
+    { "stop-bits", o_int, &stop_bits,
+      "Number of stop bits in serial port",
+      OPT_PRIO | OPT_PRIVFIX | OPT_LIMITS, NULL, 2, 1 },
 
     { "modem", o_bool, &modem,
       "Use modem control lines", OPT_PRIO | 1 },
Index: src/external/bsd/ppp/dist/pppd/utils.c
diff -u src/external/bsd/ppp/dist/pppd/utils.c:1.2 src/external/bsd/ppp/dist/pppd/utils.c:1.2.6.1
--- src/external/bsd/ppp/dist/pppd/utils.c:1.2	Thu Nov 28 22:33:42 2013
+++ src/external/bsd/ppp/dist/pppd/utils.c	Wed Dec 17 19:25:40 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: utils.c,v 1.2 2013/11/28 22:33:42 christos Exp $	*/
+/*	$NetBSD: utils.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $	*/
 
 /*
  * utils.c - various utility functions used in pppd.
@@ -35,7 +35,7 @@
 #define RCSID	"Id: utils.c,v 1.25 2008/06/03 12:06:37 paulus Exp "
 static const char rcsid[] = RCSID;
 #else
-__RCSID("$NetBSD: utils.c,v 1.2 2013/11/28 22:33:42 christos Exp $");
+__RCSID("$NetBSD: utils.c,v 1.2.6.1 2014/12/17 19:25:40 martin Exp $");
 #endif
 
 #include <stdio.h>
@@ -268,6 +268,8 @@ vslprintf(buf, buflen, fmt, args)
 	case 'q':		/* quoted string */
 	    quoted = c == 'q';
 	    p = va_arg(args, unsigned char *);
+	    if (p == NULL)
+		    p = (unsigned char *)"<NULL>";
 	    if (fillch == '0' && prec >= 0) {
 		n = prec;
 	    } else {

Index: src/external/bsd/ppp/dist/pppd/plugins/pppol2tp/pppol2tp.c
diff -u src/external/bsd/ppp/dist/pppd/plugins/pppol2tp/pppol2tp.c:1.1.1.1 src/external/bsd/ppp/dist/pppd/plugins/pppol2tp/pppol2tp.c:1.1.1.1.6.1
--- src/external/bsd/ppp/dist/pppd/plugins/pppol2tp/pppol2tp.c:1.1.1.1	Thu Nov 28 21:53:45 2013
+++ src/external/bsd/ppp/dist/pppd/plugins/pppol2tp/pppol2tp.c	Wed Dec 17 19:25:40 2014
@@ -74,8 +74,6 @@ struct channel pppol2tp_channel;
 
 static void (*old_snoop_recv_hook)(unsigned char *p, int len) = NULL;
 static void (*old_snoop_send_hook)(unsigned char *p, int len) = NULL;
-static void (*old_ip_up_hook)(void) = NULL;
-static void (*old_ip_down_hook)(void) = NULL;
 
 /* Hook provided to allow other plugins to handle ACCM changes */
 void (*pppol2tp_send_accm_hook)(int tunnel_id, int session_id,
@@ -436,22 +434,18 @@ static void pppol2tp_lcp_snoop_send(unsi
  * Interface up/down events
  *****************************************************************************/
 
-static void pppol2tp_ip_up_hook(void)
+static void pppol2tp_ip_up(void *opaque, int arg)
 {
-	if (old_ip_up_hook != NULL)
-		(*old_ip_up_hook)();
-
+	/* may get called twice (for IPv4 and IPv6) but the hook handles that well */
 	if (pppol2tp_ip_updown_hook != NULL) {
 		(*pppol2tp_ip_updown_hook)(pppol2tp_tunnel_id,
 					   pppol2tp_session_id, 1);
 	}
 }
 
-static void pppol2tp_ip_down_hook(void)
+static void pppol2tp_ip_down(void *opaque, int arg)
 {
-	if (old_ip_down_hook != NULL)
-		(*old_ip_down_hook)();
-
+	/* may get called twice (for IPv4 and IPv6) but the hook handles that well */
 	if (pppol2tp_ip_updown_hook != NULL) {
 		(*pppol2tp_ip_updown_hook)(pppol2tp_tunnel_id,
 					   pppol2tp_session_id, 0);
@@ -478,14 +472,6 @@ static void pppol2tp_check_options(void)
 		snoop_recv_hook = pppol2tp_lcp_snoop_recv;
 		snoop_send_hook = pppol2tp_lcp_snoop_send;
 	}
-
-	/* Hook up ip up/down hooks to send indicator to openl2tpd
-	 * that the link is up
-	 */
-	old_ip_up_hook = ip_up_hook;
-	ip_up_hook = pppol2tp_ip_up_hook;
-	old_ip_down_hook = ip_down_hook;
-	ip_down_hook = pppol2tp_ip_down_hook;
 }
 
 /* Called just before pppd exits.
@@ -509,6 +495,14 @@ void plugin_init(void)
 	fatal("No PPPoL2TP support on this OS");
 #endif
 	add_options(pppol2tp_options);
+
+	/* Hook up ip up/down notifiers to send indicator to openl2tpd
+	 * that the link is up
+	 */
+	add_notifier(&ip_up_notifier, pppol2tp_ip_up, NULL);
+	add_notifier(&ip_down_notifier, pppol2tp_ip_down, NULL);
+	add_notifier(&ipv6_up_notifier, pppol2tp_ip_up, NULL);
+	add_notifier(&ipv6_down_notifier, pppol2tp_ip_down, NULL);
 }
 
 struct channel pppol2tp_channel = {

Index: src/external/bsd/ppp/usr.sbin/pppd/sys-bsd.c
diff -u src/external/bsd/ppp/usr.sbin/pppd/sys-bsd.c:1.1 src/external/bsd/ppp/usr.sbin/pppd/sys-bsd.c:1.1.6.1
--- src/external/bsd/ppp/usr.sbin/pppd/sys-bsd.c:1.1	Thu Nov 28 22:33:43 2013
+++ src/external/bsd/ppp/usr.sbin/pppd/sys-bsd.c	Wed Dec 17 19:25:40 2014
@@ -189,6 +189,7 @@ static fd_set in_fds;		/* set of fds tha
 static int max_in_fd;		/* highest fd set in in_fds */
 
 static int if_is_up;		/* the interface is currently up */
+static int if6_is_up;		/* the interface is currently up */
 static u_int32_t ifaddrs[2];	/* local and remote addresses we set */
 static u_int32_t default_route_gateway;	/* gateway addr for default route */
 static u_int32_t proxy_arp_addr;	/* remote addr for proxy arp */
@@ -199,6 +200,7 @@ static void set_flags(int, int);
 static int dodefaultroute(u_int32_t, int);
 static int get_ether_addr(u_int32_t, struct sockaddr_dl *);
 static void restore_loop(void);	/* Transfer ppp unit back to loopback */
+static int setifstate(int, int);
 
 
 static void
@@ -1400,11 +1402,79 @@ sifvjcomp(int u, int vjcomp, int cidcomp
     return 1;
 }
 
-/*
+/********************************************************************
+ *
  * sifup - Config the interface up and enable IP packets to pass.
  */
-int
-sifup(int u)
+
+int sifup(int u)
+{
+    int ret;
+
+    if ((ret = setifstate(u, 1)))
+	if_is_up++;
+
+    return ret;
+}
+
+/********************************************************************
+ *
+ * sifdown - Disable the indicated protocol and config the interface
+ *	     down if there are no remaining protocols.
+ */
+
+int sifdown (int u)
+{
+    if (if_is_up && --if_is_up > 0)
+	return 1;
+
+#ifdef INET6
+    if (if6_is_up)
+	return 1;
+#endif /* INET6 */
+
+    return setifstate(u, 0);
+}
+
+#ifdef INET6
+/********************************************************************
+ *
+ * sif6up - Config the interface up for IPv6
+ */
+
+int sif6up(int u)
+{
+    int ret;
+
+    if ((ret = setifstate(u, 1)))
+	if6_is_up = 1;
+
+    return ret;
+}
+
+/********************************************************************
+ *
+ * sif6down - Disable the IPv6CP protocol and config the interface
+ *	      down if there are no remaining protocols.
+ */
+
+int sif6down (int u)
+{
+    if6_is_up = 0;
+
+    if (if_is_up)
+	return 1;
+
+    return setifstate(u, 0);
+}
+#endif /* INET6 */
+
+/********************************************************************
+ *
+ * setifstate - Config the interface up or down
+ */
+
+static int setifstate (int u, int state)
 {
     struct ifreq ifr;
 
@@ -1413,7 +1483,10 @@ sifup(int u)
 	error("%s: ioctl (SIOCGIFFLAGS): %m", __func__);
 	return 0;
     }
-    ifr.ifr_flags |= IFF_UP;
+    if (state)
+	ifr.ifr_flags |= IFF_UP;
+    else
+	ifr.ifr_flags &= ~IFF_UP;
     if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
 	error("%s: ioctl(SIOCSIFFLAGS): %m", __func__);
 	return 0;
@@ -1440,37 +1513,6 @@ sifnpmode(int u, int proto, enum NPmode 
 }
 
 /*
- * sifdown - Config the interface down and disable IP.
- */
-int
-sifdown(int u)
-{
-    struct ifreq ifr;
-    int rv;
-    struct npioctl npi;
-
-    rv = 1;
-    npi.protocol = PPP_IP;
-    npi.mode = NPMODE_ERROR;
-    ioctl(ppp_fd, PPPIOCSNPMODE, (caddr_t) &npi);
-    /* ignore errors, because ppp_fd might have been closed by now. */
-
-    strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
-    if (ioctl(sock_fd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
-	error("%s: ioctl (SIOCGIFFLAGS): %m", __func__);
-	rv = 0;
-    } else {
-	ifr.ifr_flags &= ~IFF_UP;
-	if (ioctl(sock_fd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
-	    error("%s: ioctl(SIOCSIFFLAGS): %m", __func__);
-	    rv = 0;
-	} else
-	    if_is_up = 0;
-    }
-    return rv;
-}
-
-/*
  * SET_SA_FAMILY - set the sa_family field of a struct sockaddr,
  * if it exists.
  */
@@ -2069,3 +2111,54 @@ unlock(void)
     }
 }
 #endif
+
+#ifdef INET6
+/*
+ * ether_to_eui64 - Convert 48-bit Ethernet address into 64-bit EUI
+ *
+ * convert the 48-bit MAC address of eth0 into EUI 64. caller also assumes
+ * that the system has a properly configured Ethernet interface for this
+ * function to return non-zero.
+ */
+int
+ether_to_eui64(eui64_t *p_eui64)
+{
+    struct ifaddrs *ifap, *ifa;
+
+    if (getifaddrs(&ifap) != 0) {
+	warn("%s: getifaddrs: %m", __func__);
+	return 0;
+    }
+    for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+	/*
+	 * Check the interface's internet address.
+	 */
+	if (ifa->ifa_addr->sa_family != AF_LINK)
+	    continue;
+	/*
+	 * Check that the interface is up, and not point-to-point or loopback.
+	 */
+	if ((ifa->ifa_flags & (IFF_UP|IFF_POINTOPOINT|IFF_LOOPBACK)) == IFF_UP)
+	{
+	    /*
+	     * And convert the EUI-48 into EUI-64, per RFC 2472 [sec 4.1]
+	     */
+	    unsigned char *ptr = (void *)ifa->ifa_addr;
+	    p_eui64->e8[0] = ptr[0] | 0x02;
+	    p_eui64->e8[1] = ptr[1];
+	    p_eui64->e8[2] = ptr[2];
+	    p_eui64->e8[3] = 0xFF;
+	    p_eui64->e8[4] = 0xFE;
+	    p_eui64->e8[5] = ptr[3];
+	    p_eui64->e8[6] = ptr[4];
+	    p_eui64->e8[7] = ptr[5];
+	    freeifaddrs(ifap);
+	    return 1;
+	}
+    }
+    warn("%s: can't find a link address", __func__);
+    freeifaddrs(ifap);
+
+    return 0;
+}
+#endif

Reply via email to