update ppp to v2.4.4 (#5102)

SVN-Revision: 15955
This commit is contained in:
Jo-Philipp Wich 2009-05-20 22:36:38 +00:00
parent 89127a67f2
commit 9137c11605
42 changed files with 5084 additions and 3008 deletions

View file

@ -1,5 +1,5 @@
# #
# Copyright (C) 2006-2008 OpenWrt.org # Copyright (C) 2006-2009 OpenWrt.org
# #
# This is free software, licensed under the GNU General Public License v2. # This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information. # See /LICENSE for more information.
@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=ppp PKG_NAME:=ppp
PKG_VERSION:=2.4.3 PKG_VERSION:=2.4.4
PKG_RELEASE:=11 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=ftp://ftp.samba.org/pub/ppp/ PKG_SOURCE_URL:=ftp://ftp.samba.org/pub/ppp/
PKG_MD5SUM:=848f6c3cafeb6074ffeb293c3af79b7c PKG_MD5SUM:=183800762e266132218b204dfb428d29
PKG_BUILD_DEPENDS:=libpcap PKG_BUILD_DEPENDS:=libpcap

View file

@ -1,35 +0,0 @@
From: Simon Peter <dn.tlp@gmx.net>
Subject: Bug#306261: pppd does not properly close /dev/ppp on persist
When using the kernel PPPoE driver, pppd never
closes /dev/ppp when the link has come down.
It opens superfluous fds to the device each time it re-opens the
connection, with the unclosed ones falsely reported always ready for
data by select().
This makes pppd eat up 100% CPU time after the first persist because of
the always instantly returning select() on the unclosed fds.
The problem also occurs with the upstream version, but does not occur
when a pty/tty device is used for the ppp connection.
Index: ppp-2.4.3/pppd/sys-linux.c
===================================================================
--- ppp-2.4.3.orig/pppd/sys-linux.c 2007-06-04 13:22:08.527558896 +0200
+++ ppp-2.4.3/pppd/sys-linux.c 2007-06-04 13:22:08.807516336 +0200
@@ -453,6 +453,13 @@
if (new_style_driver) {
int flags;
+ /* if a ppp_fd is already open, close it first */
+ if(ppp_fd > 0) {
+ close(ppp_fd);
+ remove_fd(ppp_fd);
+ ppp_fd = -1;
+ }
+
/* Open an instance of /dev/ppp and connect the channel to it */
if (ioctl(fd, PPPIOCGCHAN, &chindex) == -1) {
error("Couldn't get channel number: %m");

View file

@ -0,0 +1,176 @@
diff -Naur ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c
--- ppp-2.4.4.orig/pppd/ipcp.c 2005-08-25 19:59:34.000000000 -0400
+++ ppp-2.4.4/pppd/ipcp.c 2009-05-07 15:47:29.000000000 -0400
@@ -1850,7 +1850,7 @@
*/
if (ipcp_script_state == s_down && ipcp_script_pid == 0) {
ipcp_script_state = s_up;
- ipcp_script(_PATH_IPUP, 0);
+ ipcp_script(path_ipup, 0);
}
}
@@ -1900,7 +1900,7 @@
/* Execute the ip-down script */
if (ipcp_script_state == s_up && ipcp_script_pid == 0) {
ipcp_script_state = s_down;
- ipcp_script(_PATH_IPDOWN, 0);
+ ipcp_script(path_ipdown, 0);
}
}
@@ -1954,13 +1954,13 @@
case s_up:
if (ipcp_fsm[0].state != OPENED) {
ipcp_script_state = s_down;
- ipcp_script(_PATH_IPDOWN, 0);
+ ipcp_script(path_ipdown, 0);
}
break;
case s_down:
if (ipcp_fsm[0].state == OPENED) {
ipcp_script_state = s_up;
- ipcp_script(_PATH_IPUP, 0);
+ ipcp_script(path_ipup, 0);
}
break;
}
diff -Naur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4/pppd/main.c
--- ppp-2.4.4.orig/pppd/main.c 2006-06-03 23:52:50.000000000 -0400
+++ ppp-2.4.4/pppd/main.c 2009-05-07 15:47:29.000000000 -0400
@@ -315,6 +315,9 @@
struct protent *protp;
char numbuf[16];
+ strlcpy(path_ipup, _PATH_IPUP, sizeof(path_ipup));
+ strlcpy(path_ipdown, _PATH_IPDOWN, sizeof(path_ipdown));
+
link_stats_valid = 0;
new_phase(PHASE_INITIALIZE);
diff -Naur ppp-2.4.4.orig/pppd/options.c ppp-2.4.4/pppd/options.c
--- ppp-2.4.4.orig/pppd/options.c 2006-06-18 07:26:00.000000000 -0400
+++ ppp-2.4.4/pppd/options.c 2009-05-07 15:47:29.000000000 -0400
@@ -113,6 +113,8 @@
bool tune_kernel; /* may alter kernel settings */
int connect_delay = 1000; /* wait this many ms after connect script */
int req_unit = -1; /* requested interface unit */
+char path_ipup[MAXPATHLEN]; /* pathname of ip-up script */
+char path_ipdown[MAXPATHLEN];/* pathname of ip-down script */
bool multilink = 0; /* Enable multilink operation */
char *bundle_name = NULL; /* bundle name for multilink */
bool dump_options; /* print out option values */
@@ -281,6 +283,13 @@
"Number of seconds to wait for child processes at exit",
OPT_PRIO },
+ { "ip-up-script", o_string, path_ipup,
+ "Set pathname of ip-up script",
+ OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+ { "ip-down-script", o_string, path_ipdown,
+ "Set pathname of ip-down script",
+ OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+
#ifdef HAVE_MULTILINK
{ "multilink", o_bool, &multilink,
"Enable multilink operation", OPT_PRIO | 1 },
diff -Naur ppp-2.4.4.orig/pppd/pppd.h ppp-2.4.4/pppd/pppd.h
--- ppp-2.4.4.orig/pppd/pppd.h 2005-08-25 19:59:34.000000000 -0400
+++ ppp-2.4.4/pppd/pppd.h 2009-05-07 15:47:29.000000000 -0400
@@ -312,6 +312,8 @@
extern int connect_delay; /* Time to delay after connect script */
extern int max_data_rate; /* max bytes/sec through charshunt */
extern int req_unit; /* interface unit number to use */
+extern char path_ipup[MAXPATHLEN]; /* pathname of ip-up script */
+extern char path_ipdown[MAXPATHLEN]; /* pathname of ip-down script */
extern bool multilink; /* enable multilink operation */
extern bool noendpoint; /* don't send or accept endpt. discrim. */
extern char *bundle_name; /* bundle name for multilink */
diff -Naur ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c
--- ppp-2.4.4.orig/pppd/ipcp.c 2005-08-25 19:59:34.000000000 -0400
+++ ppp-2.4.4/pppd/ipcp.c 2009-05-07 15:47:29.000000000 -0400
@@ -1850,7 +1850,7 @@
*/
if (ipcp_script_state == s_down && ipcp_script_pid == 0) {
ipcp_script_state = s_up;
- ipcp_script(_PATH_IPUP, 0);
+ ipcp_script(path_ipup, 0);
}
}
@@ -1900,7 +1900,7 @@
/* Execute the ip-down script */
if (ipcp_script_state == s_up && ipcp_script_pid == 0) {
ipcp_script_state = s_down;
- ipcp_script(_PATH_IPDOWN, 0);
+ ipcp_script(path_ipdown, 0);
}
}
@@ -1954,13 +1954,13 @@
case s_up:
if (ipcp_fsm[0].state != OPENED) {
ipcp_script_state = s_down;
- ipcp_script(_PATH_IPDOWN, 0);
+ ipcp_script(path_ipdown, 0);
}
break;
case s_down:
if (ipcp_fsm[0].state == OPENED) {
ipcp_script_state = s_up;
- ipcp_script(_PATH_IPUP, 0);
+ ipcp_script(path_ipup, 0);
}
break;
}
diff -Naur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4/pppd/main.c
--- ppp-2.4.4.orig/pppd/main.c 2006-06-03 23:52:50.000000000 -0400
+++ ppp-2.4.4/pppd/main.c 2009-05-07 15:47:29.000000000 -0400
@@ -315,6 +315,9 @@
struct protent *protp;
char numbuf[16];
+ strlcpy(path_ipup, _PATH_IPUP, sizeof(path_ipup));
+ strlcpy(path_ipdown, _PATH_IPDOWN, sizeof(path_ipdown));
+
link_stats_valid = 0;
new_phase(PHASE_INITIALIZE);
diff -Naur ppp-2.4.4.orig/pppd/options.c ppp-2.4.4/pppd/options.c
--- ppp-2.4.4.orig/pppd/options.c 2006-06-18 07:26:00.000000000 -0400
+++ ppp-2.4.4/pppd/options.c 2009-05-07 15:47:29.000000000 -0400
@@ -113,6 +113,8 @@
bool tune_kernel; /* may alter kernel settings */
int connect_delay = 1000; /* wait this many ms after connect script */
int req_unit = -1; /* requested interface unit */
+char path_ipup[MAXPATHLEN]; /* pathname of ip-up script */
+char path_ipdown[MAXPATHLEN];/* pathname of ip-down script */
bool multilink = 0; /* Enable multilink operation */
char *bundle_name = NULL; /* bundle name for multilink */
bool dump_options; /* print out option values */
@@ -281,6 +283,13 @@
"Number of seconds to wait for child processes at exit",
OPT_PRIO },
+ { "ip-up-script", o_string, path_ipup,
+ "Set pathname of ip-up script",
+ OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+ { "ip-down-script", o_string, path_ipdown,
+ "Set pathname of ip-down script",
+ OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+
#ifdef HAVE_MULTILINK
{ "multilink", o_bool, &multilink,
"Enable multilink operation", OPT_PRIO | 1 },
diff -Naur ppp-2.4.4.orig/pppd/pppd.h ppp-2.4.4/pppd/pppd.h
--- ppp-2.4.4.orig/pppd/pppd.h 2005-08-25 19:59:34.000000000 -0400
+++ ppp-2.4.4/pppd/pppd.h 2009-05-07 15:47:29.000000000 -0400
@@ -312,6 +312,8 @@
extern int connect_delay; /* Time to delay after connect script */
extern int max_data_rate; /* max bytes/sec through charshunt */
extern int req_unit; /* interface unit number to use */
+extern char path_ipup[MAXPATHLEN]; /* pathname of ip-up script */
+extern char path_ipdown[MAXPATHLEN]; /* pathname of ip-down script */
extern bool multilink; /* enable multilink operation */
extern bool noendpoint; /* don't send or accept endpt. discrim. */
extern char *bundle_name; /* bundle name for multilink */

View file

@ -0,0 +1,34 @@
diff -Naur ppp-2.4.4.orig/pppd/sys-linux.c ppp-2.4.4/pppd/sys-linux.c
--- ppp-2.4.4.orig/pppd/sys-linux.c 2005-08-26 18:44:35.000000000 -0400
+++ ppp-2.4.4/pppd/sys-linux.c 2009-05-07 15:50:00.000000000 -0400
@@ -453,6 +453,13 @@
if (new_style_driver) {
int flags;
+ /* if a ppp_fd is already open, close it first */
+ if(ppp_fd > 0) {
+ close(ppp_fd);
+ remove_fd(ppp_fd);
+ ppp_fd = -1;
+ }
+
/* Open an instance of /dev/ppp and connect the channel to it */
if (ioctl(fd, PPPIOCGCHAN, &chindex) == -1) {
error("Couldn't get channel number: %m");
diff -Naur ppp-2.4.4.orig/pppd/sys-linux.c ppp-2.4.4/pppd/sys-linux.c
--- ppp-2.4.4.orig/pppd/sys-linux.c 2005-08-26 18:44:35.000000000 -0400
+++ ppp-2.4.4/pppd/sys-linux.c 2009-05-07 15:50:00.000000000 -0400
@@ -453,6 +453,13 @@
if (new_style_driver) {
int flags;
+ /* if a ppp_fd is already open, close it first */
+ if(ppp_fd > 0) {
+ close(ppp_fd);
+ remove_fd(ppp_fd);
+ ppp_fd = -1;
+ }
+
/* Open an instance of /dev/ppp and connect the channel to it */
if (ioctl(fd, PPPIOCGCHAN, &chindex) == -1) {
error("Couldn't get channel number: %m");

View file

@ -1,92 +0,0 @@
Index: ppp-2.4.3/pppd/ipcp.c
===================================================================
--- ppp-2.4.3.orig/pppd/ipcp.c 2007-06-04 13:22:08.478566344 +0200
+++ ppp-2.4.3/pppd/ipcp.c 2007-06-04 13:22:09.003486544 +0200
@@ -1846,7 +1846,7 @@
*/
if (ipcp_script_state == s_down && ipcp_script_pid == 0) {
ipcp_script_state = s_up;
- ipcp_script(_PATH_IPUP);
+ ipcp_script(path_ipup);
}
}
@@ -1896,7 +1896,7 @@
/* Execute the ip-down script */
if (ipcp_script_state == s_up && ipcp_script_pid == 0) {
ipcp_script_state = s_down;
- ipcp_script(_PATH_IPDOWN);
+ ipcp_script(path_ipdown);
}
}
@@ -1950,13 +1950,13 @@
case s_up:
if (ipcp_fsm[0].state != OPENED) {
ipcp_script_state = s_down;
- ipcp_script(_PATH_IPDOWN);
+ ipcp_script(path_ipdown);
}
break;
case s_down:
if (ipcp_fsm[0].state == OPENED) {
ipcp_script_state = s_up;
- ipcp_script(_PATH_IPUP);
+ ipcp_script(path_ipup);
}
break;
}
Index: ppp-2.4.3/pppd/main.c
===================================================================
--- ppp-2.4.3.orig/pppd/main.c 2007-06-04 13:22:08.487564976 +0200
+++ ppp-2.4.3/pppd/main.c 2007-06-04 13:22:09.004486392 +0200
@@ -314,6 +314,9 @@
struct protent *protp;
char numbuf[16];
+ strlcpy(path_ipup, _PATH_IPUP, sizeof(path_ipup));
+ strlcpy(path_ipdown, _PATH_IPDOWN, sizeof(path_ipdown));
+
link_stats_valid = 0;
new_phase(PHASE_INITIALIZE);
Index: ppp-2.4.3/pppd/options.c
===================================================================
--- ppp-2.4.3.orig/pppd/options.c 2007-06-04 13:22:08.495563760 +0200
+++ ppp-2.4.3/pppd/options.c 2007-06-04 13:22:09.005486240 +0200
@@ -108,6 +108,8 @@
bool tune_kernel; /* may alter kernel settings */
int connect_delay = 1000; /* wait this many ms after connect script */
int req_unit = -1; /* requested interface unit */
+char path_ipup[MAXPATHLEN]; /* pathname of ip-up script */
+char path_ipdown[MAXPATHLEN];/* pathname of ip-down script */
bool multilink = 0; /* Enable multilink operation */
char *bundle_name = NULL; /* bundle name for multilink */
bool dump_options; /* print out option values */
@@ -276,6 +278,13 @@
"Number of seconds to wait for child processes at exit",
OPT_PRIO },
+ { "ip-up-script", o_string, path_ipup,
+ "Set pathname of ip-up script",
+ OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+ { "ip-down-script", o_string, path_ipdown,
+ "Set pathname of ip-down script",
+ OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+
#ifdef HAVE_MULTILINK
{ "multilink", o_bool, &multilink,
"Enable multilink operation", OPT_PRIO | 1 },
Index: ppp-2.4.3/pppd/pppd.h
===================================================================
--- ppp-2.4.3.orig/pppd/pppd.h 2007-06-04 13:22:08.505562240 +0200
+++ ppp-2.4.3/pppd/pppd.h 2007-06-04 13:22:09.005486240 +0200
@@ -312,6 +312,8 @@
extern int connect_delay; /* Time to delay after connect script */
extern int max_data_rate; /* max bytes/sec through charshunt */
extern int req_unit; /* interface unit number to use */
+extern char path_ipup[MAXPATHLEN]; /* pathname of ip-up script */
+extern char path_ipdown[MAXPATHLEN]; /* pathname of ip-down script */
extern bool multilink; /* enable multilink operation */
extern bool noendpoint; /* don't send or accept endpt. discrim. */
extern char *bundle_name; /* bundle name for multilink */

View file

@ -0,0 +1,40 @@
diff -Naur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4/pppd/main.c
--- ppp-2.4.4.orig/pppd/main.c 2009-05-07 15:49:34.000000000 -0400
+++ ppp-2.4.4/pppd/main.c 2009-05-07 15:53:42.000000000 -0400
@@ -1570,6 +1570,8 @@
if (errfd == 0 || errfd == 1)
errfd = dup(errfd);
+ closelog();
+
/* dup the in, out, err fds to 0, 1, 2 */
if (infd != 0)
dup2(infd, 0);
@@ -1578,7 +1580,6 @@
if (errfd != 2)
dup2(errfd, 2);
- closelog();
if (log_to_fd > 2)
close(log_to_fd);
if (the_channel->close)
diff -Naur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4/pppd/main.c
--- ppp-2.4.4.orig/pppd/main.c 2009-05-07 15:49:34.000000000 -0400
+++ ppp-2.4.4/pppd/main.c 2009-05-07 15:53:42.000000000 -0400
@@ -1570,6 +1570,8 @@
if (errfd == 0 || errfd == 1)
errfd = dup(errfd);
+ closelog();
+
/* dup the in, out, err fds to 0, 1, 2 */
if (infd != 0)
dup2(infd, 0);
@@ -1578,7 +1580,6 @@
if (errfd != 2)
dup2(errfd, 2);
- closelog();
if (log_to_fd > 2)
close(log_to_fd);
if (the_channel->close)

View file

@ -1,15 +0,0 @@
Index: ppp-2.4.3/pppd/plugins/rp-pppoe/discovery.c
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/rp-pppoe/discovery.c 2007-06-04 13:22:08.458569384 +0200
+++ ppp-2.4.3/pppd/plugins/rp-pppoe/discovery.c 2007-06-04 13:22:09.225452800 +0200
@@ -365,8 +365,8 @@
if (!packetIsForMe(conn, &packet)) continue;
if (packet.code == CODE_PADO) {
- if (NOT_UNICAST(packet.ethHdr.h_source)) {
- printErr("Ignoring PADO packet from non-unicast MAC address");
+ if (BROADCAST(packet.ethHdr.h_source)) {
+ printErr("Ignoring PADO packet from broadcast MAC address");
continue;
}
parsePacket(&packet, parsePADOTags, &pc);

View file

@ -0,0 +1,26 @@
diff -Naur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4/pppd/main.c
--- ppp-2.4.4.orig/pppd/main.c 2009-05-07 15:58:00.000000000 -0400
+++ ppp-2.4.4/pppd/main.c 2009-05-07 15:58:19.000000000 -0400
@@ -772,8 +772,7 @@
/* update pid files if they have been written already */
if (pidfilename[0])
create_pidfile(pid);
- if (linkpidfile[0])
- create_linkpidfile(pid);
+ create_linkpidfile(pid);
exit(0); /* parent dies */
}
setsid();
diff -Naur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4/pppd/main.c
--- ppp-2.4.4.orig/pppd/main.c 2009-05-07 15:58:00.000000000 -0400
+++ ppp-2.4.4/pppd/main.c 2009-05-07 15:58:19.000000000 -0400
@@ -772,8 +772,7 @@
/* update pid files if they have been written already */
if (pidfilename[0])
create_pidfile(pid);
- if (linkpidfile[0])
- create_linkpidfile(pid);
+ create_linkpidfile(pid);
exit(0); /* parent dies */
}
setsid();

File diff suppressed because it is too large Load diff

View file

@ -1,39 +0,0 @@
Subject: Bug#284382: ppp: linkpidfile is not created upon detachment
From: <herbert@gondor.apana.org.au>
Package: ppp
Version: 2.4.2+20040428-2
Severity: wishlist
When pppd detaches from the parent normally, that is, without nodetach
or updetach set, the linkpidfile is not created even when linkname is
set.
This is because the create_linkpidfile call in detach() is only made
if the linkpidfile is filled in. However, linkpidfile is never filled
in until create_linkpidfile has been called.
IMHO the call should be made uncondtionally in detach() since
create_linkpidfile does its own check on linkname anyway.
Please note that the version of pppd in woody always wrote the
linkpidfile after detaching. It did so in main() however. That
call has now been removed which is why I'm seeing this problem.
[...]
--
Index: ppp-2.4.3/pppd/main.c
===================================================================
--- ppp-2.4.3.orig/pppd/main.c 2007-06-04 13:22:09.004486392 +0200
+++ ppp-2.4.3/pppd/main.c 2007-06-04 13:22:10.548251704 +0200
@@ -768,8 +768,7 @@
/* update pid files if they have been written already */
if (pidfilename[0])
create_pidfile(pid);
- if (linkpidfile[0])
- create_linkpidfile(pid);
+ create_linkpidfile(pid);
exit(0); /* parent dies */
}
setsid();

View file

@ -0,0 +1,24 @@
diff -Naur ppp-2.4.4.orig/pppd/chap_ms.c ppp-2.4.4/pppd/chap_ms.c
--- ppp-2.4.4.orig/pppd/chap_ms.c 2006-05-21 07:56:40.000000000 -0400
+++ ppp-2.4.4/pppd/chap_ms.c 2009-05-07 16:13:09.000000000 -0400
@@ -852,7 +852,7 @@
u_char *p = &response[MS_CHAP2_PEER_CHALLENGE];
int i;
- BZERO(response, sizeof(*response));
+ BZERO(response, MS_CHAP2_RESPONSE_LEN);
/* Generate the Peer-Challenge if requested, or copy it if supplied. */
if (!PeerChallenge)
diff -Naur ppp-2.4.4.orig/pppd/chap_ms.c ppp-2.4.4/pppd/chap_ms.c
--- ppp-2.4.4.orig/pppd/chap_ms.c 2006-05-21 07:56:40.000000000 -0400
+++ ppp-2.4.4/pppd/chap_ms.c 2009-05-07 16:13:09.000000000 -0400
@@ -852,7 +852,7 @@
u_char *p = &response[MS_CHAP2_PEER_CHALLENGE];
int i;
- BZERO(response, sizeof(*response));
+ BZERO(response, MS_CHAP2_RESPONSE_LEN);
/* Generate the Peer-Challenge if requested, or copy it if supplied. */
if (!PeerChallenge)

View file

@ -0,0 +1,352 @@
diff -Naur ppp-2.4.4.orig/pppd/demand.c ppp-2.4.4/pppd/demand.c
--- ppp-2.4.4.orig/pppd/demand.c 2005-08-25 08:14:18.000000000 -0400
+++ ppp-2.4.4/pppd/demand.c 2009-05-07 16:16:20.000000000 -0400
@@ -36,6 +36,8 @@
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
+#include <unistd.h>
+#include <syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -43,6 +45,8 @@
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#ifdef PPP_FILTER
#include <pcap-bpf.h>
#endif
@@ -221,6 +225,14 @@
int c, rv;
rv = 0;
+
+/* check for synchronous connection... */
+
+ if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
+ rv = loop_frame(p,n);
+ return rv;
+ }
+
for (; n > 0; --n) {
c = *p++;
if (c == PPP_FLAG) {
@@ -299,17 +311,102 @@
* loopback, now that the real serial link is up.
*/
void
-demand_rexmit(proto)
+demand_rexmit(proto, newip)
int proto;
+ u_int32_t newip;
{
struct packet *pkt, *prev, *nextpkt;
+ unsigned short checksum;
+ unsigned short pkt_checksum = 0;
+ unsigned iphdr;
+ struct timeval tv;
+ char cv = 0;
+ char ipstr[16];
prev = NULL;
pkt = pend_q;
pend_q = NULL;
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */
for (; pkt != NULL; pkt = nextpkt) {
nextpkt = pkt->next;
if (PPP_PROTOCOL(pkt->data) == proto) {
+ if ( (proto == PPP_IP) && newip ) {
+ /* Get old checksum */
+
+ iphdr = (pkt->data[4] & 15) << 2;
+ checksum = *((unsigned short *) (pkt->data+14));
+ if (checksum == 0xFFFF) {
+ checksum = 0;
+ }
+
+
+ if (pkt->data[13] == 17) {
+ pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr));
+ if (pkt_checksum) {
+ cv = 1;
+ if (pkt_checksum == 0xFFFF) {
+ pkt_checksum = 0;
+ }
+ }
+ else {
+ cv = 0;
+ }
+ }
+
+ if (pkt->data[13] == 6) {
+ pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
+ cv = 1;
+ if (pkt_checksum == 0xFFFF) {
+ pkt_checksum = 0;
+ }
+ }
+
+ /* Delete old Source-IP-Address */
+ checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ /* Change Source-IP-Address */
+ * ((u_int32_t *) (pkt->data + 16)) = newip;
+
+ /* Add new Source-IP-Address */
+ checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ /* Write new checksum */
+ if (!checksum) {
+ checksum = 0xFFFF;
+ }
+ *((unsigned short *) (pkt->data+14)) = checksum;
+ if (pkt->data[13] == 6) {
+ *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
+ }
+ if (cv && (pkt->data[13] == 17) ) {
+ *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
+ }
+
+ /* Log Packet */
+ strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
+ if (pkt->data[13] == 1) {
+ syslog(LOG_INFO,"Open ICMP %s -> %s\n",
+ ipstr,
+ inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
+ } else {
+ syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
+ pkt->data[13] == 6 ? "TCP" : "UDP",
+ ipstr,
+ ntohs(*( (short *) (pkt->data+iphdr+4))),
+ inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
+ ntohs(*( (short *) (pkt->data+iphdr+6))));
+ }
+ }
output(0, pkt->data, pkt->length);
free(pkt);
} else {
diff -Naur ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c
--- ppp-2.4.4.orig/pppd/ipcp.c 2009-05-07 15:49:34.000000000 -0400
+++ ppp-2.4.4/pppd/ipcp.c 2009-05-07 16:16:20.000000000 -0400
@@ -1776,7 +1776,7 @@
proxy_arp_set[f->unit] = 1;
}
- demand_rexmit(PPP_IP);
+ demand_rexmit(PPP_IP,go->ouraddr);
sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
} else {
diff -Naur ppp-2.4.4.orig/pppd/ipv6cp.c ppp-2.4.4/pppd/ipv6cp.c
--- ppp-2.4.4.orig/pppd/ipv6cp.c 2005-08-25 19:59:34.000000000 -0400
+++ ppp-2.4.4/pppd/ipv6cp.c 2009-05-07 16:16:20.000000000 -0400
@@ -1232,7 +1232,7 @@
}
}
- demand_rexmit(PPP_IPV6);
+ demand_rexmit(PPP_IPV6,0);
sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
} else {
diff -Naur ppp-2.4.4.orig/pppd/pppd.h ppp-2.4.4/pppd/pppd.h
--- ppp-2.4.4.orig/pppd/pppd.h 2009-05-07 15:49:34.000000000 -0400
+++ ppp-2.4.4/pppd/pppd.h 2009-05-07 16:16:20.000000000 -0400
@@ -565,7 +565,7 @@
void demand_block __P((void)); /* set all NPs to queue up packets */
void demand_unblock __P((void)); /* set all NPs to pass packets */
void demand_discard __P((void)); /* set all NPs to discard packets */
-void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
+void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/
int loop_chars __P((unsigned char *, int)); /* process chars from loopback */
int loop_frame __P((unsigned char *, int)); /* should we bring link up? */
diff -Naur ppp-2.4.4.orig/pppd/demand.c ppp-2.4.4/pppd/demand.c
--- ppp-2.4.4.orig/pppd/demand.c 2005-08-25 08:14:18.000000000 -0400
+++ ppp-2.4.4/pppd/demand.c 2009-05-07 16:16:20.000000000 -0400
@@ -36,6 +36,8 @@
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
+#include <unistd.h>
+#include <syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -43,6 +45,8 @@
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#ifdef PPP_FILTER
#include <pcap-bpf.h>
#endif
@@ -221,6 +225,14 @@
int c, rv;
rv = 0;
+
+/* check for synchronous connection... */
+
+ if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
+ rv = loop_frame(p,n);
+ return rv;
+ }
+
for (; n > 0; --n) {
c = *p++;
if (c == PPP_FLAG) {
@@ -299,17 +311,102 @@
* loopback, now that the real serial link is up.
*/
void
-demand_rexmit(proto)
+demand_rexmit(proto, newip)
int proto;
+ u_int32_t newip;
{
struct packet *pkt, *prev, *nextpkt;
+ unsigned short checksum;
+ unsigned short pkt_checksum = 0;
+ unsigned iphdr;
+ struct timeval tv;
+ char cv = 0;
+ char ipstr[16];
prev = NULL;
pkt = pend_q;
pend_q = NULL;
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */
for (; pkt != NULL; pkt = nextpkt) {
nextpkt = pkt->next;
if (PPP_PROTOCOL(pkt->data) == proto) {
+ if ( (proto == PPP_IP) && newip ) {
+ /* Get old checksum */
+
+ iphdr = (pkt->data[4] & 15) << 2;
+ checksum = *((unsigned short *) (pkt->data+14));
+ if (checksum == 0xFFFF) {
+ checksum = 0;
+ }
+
+
+ if (pkt->data[13] == 17) {
+ pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr));
+ if (pkt_checksum) {
+ cv = 1;
+ if (pkt_checksum == 0xFFFF) {
+ pkt_checksum = 0;
+ }
+ }
+ else {
+ cv = 0;
+ }
+ }
+
+ if (pkt->data[13] == 6) {
+ pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
+ cv = 1;
+ if (pkt_checksum == 0xFFFF) {
+ pkt_checksum = 0;
+ }
+ }
+
+ /* Delete old Source-IP-Address */
+ checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ /* Change Source-IP-Address */
+ * ((u_int32_t *) (pkt->data + 16)) = newip;
+
+ /* Add new Source-IP-Address */
+ checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ /* Write new checksum */
+ if (!checksum) {
+ checksum = 0xFFFF;
+ }
+ *((unsigned short *) (pkt->data+14)) = checksum;
+ if (pkt->data[13] == 6) {
+ *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
+ }
+ if (cv && (pkt->data[13] == 17) ) {
+ *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
+ }
+
+ /* Log Packet */
+ strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
+ if (pkt->data[13] == 1) {
+ syslog(LOG_INFO,"Open ICMP %s -> %s\n",
+ ipstr,
+ inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
+ } else {
+ syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
+ pkt->data[13] == 6 ? "TCP" : "UDP",
+ ipstr,
+ ntohs(*( (short *) (pkt->data+iphdr+4))),
+ inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
+ ntohs(*( (short *) (pkt->data+iphdr+6))));
+ }
+ }
output(0, pkt->data, pkt->length);
free(pkt);
} else {
diff -Naur ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c
--- ppp-2.4.4.orig/pppd/ipcp.c 2009-05-07 15:49:34.000000000 -0400
+++ ppp-2.4.4/pppd/ipcp.c 2009-05-07 16:16:20.000000000 -0400
@@ -1776,7 +1776,7 @@
proxy_arp_set[f->unit] = 1;
}
- demand_rexmit(PPP_IP);
+ demand_rexmit(PPP_IP,go->ouraddr);
sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
} else {
diff -Naur ppp-2.4.4.orig/pppd/ipv6cp.c ppp-2.4.4/pppd/ipv6cp.c
--- ppp-2.4.4.orig/pppd/ipv6cp.c 2005-08-25 19:59:34.000000000 -0400
+++ ppp-2.4.4/pppd/ipv6cp.c 2009-05-07 16:16:20.000000000 -0400
@@ -1232,7 +1232,7 @@
}
}
- demand_rexmit(PPP_IPV6);
+ demand_rexmit(PPP_IPV6,0);
sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
} else {
diff -Naur ppp-2.4.4.orig/pppd/pppd.h ppp-2.4.4/pppd/pppd.h
--- ppp-2.4.4.orig/pppd/pppd.h 2009-05-07 15:49:34.000000000 -0400
+++ ppp-2.4.4/pppd/pppd.h 2009-05-07 16:16:20.000000000 -0400
@@ -565,7 +565,7 @@
void demand_block __P((void)); /* set all NPs to queue up packets */
void demand_unblock __P((void)); /* set all NPs to pass packets */
void demand_discard __P((void)); /* set all NPs to discard packets */
-void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
+void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/
int loop_chars __P((unsigned char *, int)); /* process chars from loopback */
int loop_frame __P((unsigned char *, int)); /* should we bring link up? */

View file

@ -1,96 +0,0 @@
Index: ppp-2.4.3/pppd/plugins/pppoatm/pppoatm.c
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/pppoatm/pppoatm.c 2007-06-04 13:22:08.348586104 +0200
+++ ppp-2.4.3/pppd/plugins/pppoatm/pppoatm.c 2007-06-04 13:22:10.825209600 +0200
@@ -70,18 +70,20 @@
{
struct sockaddr_atmpvc addr;
extern struct stat devstat;
+
if (device_got_set)
return 0;
- //info("PPPoATM setdevname_pppoatm: '%s'", cp);
+
memset(&addr, 0, sizeof addr);
if (text2atm(cp, (struct sockaddr *) &addr, sizeof(addr),
T2A_PVC | T2A_NAME) < 0) {
- if(doit)
- info("atm does not recognize: %s", cp);
+ if (doit)
+ info("cannot parse the ATM address: %s", cp);
return 0;
- }
- if (!doit) return 1;
- //if (!dev_set_ok()) return -1;
+ }
+ if (!doit)
+ return 1;
+
memcpy(&pvcaddr, &addr, sizeof pvcaddr);
strlcpy(devnam, cp, sizeof devnam);
devstat.st_mode = S_IFSOCK;
@@ -93,7 +95,6 @@
lcp_allowoptions[0].neg_asyncmap = 0;
lcp_wantoptions[0].neg_pcompression = 0;
}
- info("PPPoATM setdevname_pppoatm - SUCCESS:%s", cp);
device_got_set = 1;
return 1;
}
@@ -108,6 +109,7 @@
static void set_line_discipline_pppoatm(int fd)
{
struct atm_backend_ppp be;
+
be.backend_num = ATM_BACKEND_PPP;
if (!llc_encaps)
be.encaps = PPPOATM_ENCAPS_VC;
@@ -115,6 +117,7 @@
be.encaps = PPPOATM_ENCAPS_LLC;
else
be.encaps = PPPOATM_ENCAPS_AUTODETECT;
+
if (ioctl(fd, ATM_SETBACKEND, &be) < 0)
fatal("ioctl(ATM_SETBACKEND): %m");
}
@@ -175,16 +178,19 @@
{
int sock;
struct ifreq ifr;
+
if (mtu > pppoatm_max_mtu)
error("Couldn't increase MTU to %d", mtu);
+
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
fatal("Couldn't create IP socket: %m");
+
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
ifr.ifr_mtu = mtu;
if (ioctl(sock, SIOCSIFMTU, (caddr_t) &ifr) < 0)
fatal("ioctl(SIOCSIFMTU): %m");
- (void) close (sock);
+ close(sock);
}
static void recv_config_pppoa(int mru,
@@ -198,7 +204,7 @@
void plugin_init(void)
{
-#if defined(__linux__)
+#ifdef linux
extern int new_style_driver; /* From sys-linux.c */
if (!ppp_available() && !new_style_driver)
fatal("Kernel doesn't support ppp_generic - "
@@ -206,9 +212,9 @@
#else
fatal("No PPPoATM support on this OS");
#endif
- info("PPPoATM plugin_init");
add_options(pppoa_options);
}
+
struct channel pppoa_channel = {
options: pppoa_options,
process_extra_options: NULL,

View file

@ -1,32 +0,0 @@
Index: ppp-2.4.3/pppd/plugins/pppoatm/pppoatm.c
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/pppoatm/pppoatm.c 2007-06-04 13:22:10.825209600 +0200
+++ ppp-2.4.3/pppd/plugins/pppoatm/pppoatm.c 2007-06-04 13:22:11.014180872 +0200
@@ -179,8 +179,11 @@
int sock;
struct ifreq ifr;
- if (mtu > pppoatm_max_mtu)
- error("Couldn't increase MTU to %d", mtu);
+ if (pppoatm_max_mtu && mtu > pppoatm_max_mtu) {
+ warn("Couldn't increase MTU to %d. Using %d",
+ mtu, pppoatm_max_mtu);
+ mtu = pppoatm_max_mtu;
+ }
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
@@ -198,8 +201,11 @@
int pcomp,
int accomp)
{
- if (mru > pppoatm_max_mru)
- error("Couldn't increase MRU to %d", mru);
+ if (pppoatm_max_mru && mru > pppoatm_max_mru) {
+ warn("Couldn't increase MRU to %d. Using %d",
+ mru, pppoatm_max_mru);
+ mru = pppoatm_max_mru;
+ }
}
void plugin_init(void)

View file

@ -0,0 +1,70 @@
diff -Naur ppp-2.4.4.orig/pppd/chap-new.c ppp-2.4.4/pppd/chap-new.c
--- ppp-2.4.4.orig/pppd/chap-new.c 2005-07-13 06:41:58.000000000 -0400
+++ ppp-2.4.4/pppd/chap-new.c 2009-05-07 16:18:37.000000000 -0400
@@ -57,6 +57,7 @@
int chap_timeout_time = 3;
int chap_max_transmits = 10;
int chap_rechallenge_time = 0;
+int chapms_strip_domain = 0;
/*
* Command-line options.
@@ -68,6 +69,8 @@
"Set max #xmits for challenge", OPT_PRIO },
{ "chap-interval", o_int, &chap_rechallenge_time,
"Set interval for rechallenge", OPT_PRIO },
+ { "chapms-strip-domain", o_bool, &chapms_strip_domain,
+ "Strip the domain prefix before the Username", 1 },
{ NULL }
};
@@ -335,6 +338,14 @@
/* Null terminate and clean remote name. */
slprintf(rname, sizeof(rname), "%.*v", len, name);
name = rname;
+
+ /* strip the MS domain name */
+ if (chapms_strip_domain && strrchr(rname, '\\')) {
+ char tmp[MAXNAMELEN+1];
+
+ strcpy(tmp, strrchr(rname, '\\') + 1);
+ strcpy(rname, tmp);
+ }
}
if (chap_verify_hook)
diff -Naur ppp-2.4.4.orig/pppd/chap-new.c ppp-2.4.4/pppd/chap-new.c
--- ppp-2.4.4.orig/pppd/chap-new.c 2005-07-13 06:41:58.000000000 -0400
+++ ppp-2.4.4/pppd/chap-new.c 2009-05-07 16:18:37.000000000 -0400
@@ -57,6 +57,7 @@
int chap_timeout_time = 3;
int chap_max_transmits = 10;
int chap_rechallenge_time = 0;
+int chapms_strip_domain = 0;
/*
* Command-line options.
@@ -68,6 +69,8 @@
"Set max #xmits for challenge", OPT_PRIO },
{ "chap-interval", o_int, &chap_rechallenge_time,
"Set interval for rechallenge", OPT_PRIO },
+ { "chapms-strip-domain", o_bool, &chapms_strip_domain,
+ "Strip the domain prefix before the Username", 1 },
{ NULL }
};
@@ -335,6 +338,14 @@
/* Null terminate and clean remote name. */
slprintf(rname, sizeof(rname), "%.*v", len, name);
name = rname;
+
+ /* strip the MS domain name */
+ if (chapms_strip_domain && strrchr(rname, '\\')) {
+ char tmp[MAXNAMELEN+1];
+
+ strcpy(tmp, strrchr(rname, '\\') + 1);
+ strcpy(rname, tmp);
+ }
}
if (chap_verify_hook)

View file

@ -0,0 +1,192 @@
diff -Naur ppp-2.4.4.orig/pppd/plugins/pppoatm/pppoatm.c ppp-2.4.4/pppd/plugins/pppoatm/pppoatm.c
--- ppp-2.4.4.orig/pppd/plugins/pppoatm/pppoatm.c 2006-05-21 08:44:41.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/pppoatm/pppoatm.c 2009-05-07 16:22:22.000000000 -0400
@@ -70,18 +70,20 @@
{
struct sockaddr_atmpvc addr;
extern struct stat devstat;
+
if (device_got_set)
return 0;
- //info("PPPoATM setdevname_pppoatm: '%s'", cp);
+
memset(&addr, 0, sizeof addr);
if (text2atm(cp, (struct sockaddr *) &addr, sizeof(addr),
- T2A_PVC | T2A_NAME) < 0) {
- if(doit)
- info("atm does not recognize: %s", cp);
+ T2A_PVC | T2A_NAME | T2A_WILDCARD) < 0) {
+ if (doit)
+ info("cannot parse the ATM address: %s", cp);
return 0;
- }
- if (!doit) return 1;
- //if (!dev_set_ok()) return -1;
+ }
+ if (!doit)
+ return 1;
+
memcpy(&pvcaddr, &addr, sizeof pvcaddr);
strlcpy(devnam, cp, sizeof devnam);
devstat.st_mode = S_IFSOCK;
@@ -93,7 +95,6 @@
lcp_allowoptions[0].neg_asyncmap = 0;
lcp_wantoptions[0].neg_pcompression = 0;
}
- info("PPPoATM setdevname_pppoatm - SUCCESS:%s", cp);
device_got_set = 1;
return 1;
}
@@ -108,6 +109,7 @@
static void set_line_discipline_pppoatm(int fd)
{
struct atm_backend_ppp be;
+
be.backend_num = ATM_BACKEND_PPP;
if (!llc_encaps)
be.encaps = PPPOATM_ENCAPS_VC;
@@ -115,6 +117,7 @@
be.encaps = PPPOATM_ENCAPS_LLC;
else
be.encaps = PPPOATM_ENCAPS_AUTODETECT;
+
if (ioctl(fd, ATM_SETBACKEND, &be) < 0)
fatal("ioctl(ATM_SETBACKEND): %m");
}
@@ -175,16 +178,19 @@
{
int sock;
struct ifreq ifr;
+
if (mtu > pppoatm_max_mtu)
error("Couldn't increase MTU to %d", mtu);
+
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
fatal("Couldn't create IP socket: %m");
+
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
ifr.ifr_mtu = mtu;
if (ioctl(sock, SIOCSIFMTU, (caddr_t) &ifr) < 0)
fatal("ioctl(SIOCSIFMTU): %m");
- (void) close (sock);
+ close(sock);
}
static void recv_config_pppoa(int mru,
@@ -198,7 +204,7 @@
void plugin_init(void)
{
-#if defined(__linux__)
+#ifdef linux
extern int new_style_driver; /* From sys-linux.c */
if (!ppp_available() && !new_style_driver)
fatal("Kernel doesn't support ppp_generic - "
@@ -206,9 +212,9 @@
#else
fatal("No PPPoATM support on this OS");
#endif
- info("PPPoATM plugin_init");
add_options(pppoa_options);
}
+
struct channel pppoa_channel = {
options: pppoa_options,
process_extra_options: NULL,
diff -Naur ppp-2.4.4.orig/pppd/plugins/pppoatm/pppoatm.c ppp-2.4.4/pppd/plugins/pppoatm/pppoatm.c
--- ppp-2.4.4.orig/pppd/plugins/pppoatm/pppoatm.c 2006-05-21 08:44:41.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/pppoatm/pppoatm.c 2009-05-07 16:22:22.000000000 -0400
@@ -70,18 +70,20 @@
{
struct sockaddr_atmpvc addr;
extern struct stat devstat;
+
if (device_got_set)
return 0;
- //info("PPPoATM setdevname_pppoatm: '%s'", cp);
+
memset(&addr, 0, sizeof addr);
if (text2atm(cp, (struct sockaddr *) &addr, sizeof(addr),
- T2A_PVC | T2A_NAME) < 0) {
- if(doit)
- info("atm does not recognize: %s", cp);
+ T2A_PVC | T2A_NAME | T2A_WILDCARD) < 0) {
+ if (doit)
+ info("cannot parse the ATM address: %s", cp);
return 0;
- }
- if (!doit) return 1;
- //if (!dev_set_ok()) return -1;
+ }
+ if (!doit)
+ return 1;
+
memcpy(&pvcaddr, &addr, sizeof pvcaddr);
strlcpy(devnam, cp, sizeof devnam);
devstat.st_mode = S_IFSOCK;
@@ -93,7 +95,6 @@
lcp_allowoptions[0].neg_asyncmap = 0;
lcp_wantoptions[0].neg_pcompression = 0;
}
- info("PPPoATM setdevname_pppoatm - SUCCESS:%s", cp);
device_got_set = 1;
return 1;
}
@@ -108,6 +109,7 @@
static void set_line_discipline_pppoatm(int fd)
{
struct atm_backend_ppp be;
+
be.backend_num = ATM_BACKEND_PPP;
if (!llc_encaps)
be.encaps = PPPOATM_ENCAPS_VC;
@@ -115,6 +117,7 @@
be.encaps = PPPOATM_ENCAPS_LLC;
else
be.encaps = PPPOATM_ENCAPS_AUTODETECT;
+
if (ioctl(fd, ATM_SETBACKEND, &be) < 0)
fatal("ioctl(ATM_SETBACKEND): %m");
}
@@ -175,16 +178,19 @@
{
int sock;
struct ifreq ifr;
+
if (mtu > pppoatm_max_mtu)
error("Couldn't increase MTU to %d", mtu);
+
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
fatal("Couldn't create IP socket: %m");
+
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
ifr.ifr_mtu = mtu;
if (ioctl(sock, SIOCSIFMTU, (caddr_t) &ifr) < 0)
fatal("ioctl(SIOCSIFMTU): %m");
- (void) close (sock);
+ close(sock);
}
static void recv_config_pppoa(int mru,
@@ -198,7 +204,7 @@
void plugin_init(void)
{
-#if defined(__linux__)
+#ifdef linux
extern int new_style_driver; /* From sys-linux.c */
if (!ppp_available() && !new_style_driver)
fatal("Kernel doesn't support ppp_generic - "
@@ -206,9 +212,9 @@
#else
fatal("No PPPoATM support on this OS");
#endif
- info("PPPoATM plugin_init");
add_options(pppoa_options);
}
+
struct channel pppoa_channel = {
options: pppoa_options,
process_extra_options: NULL,

View file

@ -1,36 +0,0 @@
Index: ppp-2.4.3/pppd/chap-new.c
===================================================================
--- ppp-2.4.3.orig/pppd/chap-new.c 2007-06-04 13:22:08.298593704 +0200
+++ ppp-2.4.3/pppd/chap-new.c 2007-06-04 13:22:11.199152752 +0200
@@ -57,6 +57,7 @@
int chap_timeout_time = 3;
int chap_max_transmits = 10;
int chap_rechallenge_time = 0;
+int chapms_strip_domain = 0;
/*
* Command-line options.
@@ -68,6 +69,8 @@
"Set max #xmits for challenge", OPT_PRIO },
{ "chap-interval", o_int, &chap_rechallenge_time,
"Set interval for rechallenge", OPT_PRIO },
+ { "chapms-strip-domain", o_bool, &chapms_strip_domain,
+ "Strip the domain prefix before the Username", 1 },
{ NULL }
};
@@ -338,6 +341,14 @@
/* Null terminate and clean remote name. */
slprintf(rname, sizeof(rname), "%.*v", len, name);
name = rname;
+
+ /* strip the MS domain name */
+ if (chapms_strip_domain && strrchr(rname, '\\')) {
+ char tmp[MAXNAMELEN+1];
+
+ strcpy(tmp, strrchr(rname, '\\') + 1);
+ strcpy(rname, tmp);
+ }
}
if (chap_verify_hook)

View file

@ -1,264 +0,0 @@
Index: ppp-2.4.3/pppd/ipcp.c
===================================================================
--- ppp-2.4.3.orig/pppd/ipcp.c 2007-06-04 13:22:09.003486544 +0200
+++ ppp-2.4.3/pppd/ipcp.c 2007-06-04 13:22:11.387124176 +0200
@@ -197,6 +197,16 @@
"disable defaultroute option", OPT_ALIAS | OPT_A2CLR,
&ipcp_wantoptions[0].default_route },
+#ifdef __linux__
+ { "replacedefaultroute", o_bool,
+ &ipcp_wantoptions[0].replace_default_route,
+ "Replace default route", 1
+ },
+ { "noreplacedefaultroute", o_bool,
+ &ipcp_allowoptions[0].replace_default_route,
+ "Never replace default route", OPT_A2COPY,
+ &ipcp_wantoptions[0].replace_default_route },
+#endif
{ "proxyarp", o_bool, &ipcp_wantoptions[0].proxy_arp,
"Add proxy ARP entry", OPT_ENABLE|1, &ipcp_allowoptions[0].proxy_arp },
{ "noproxyarp", o_bool, &ipcp_allowoptions[0].proxy_arp,
@@ -263,7 +273,7 @@
ip_active_pkt
};
-static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t));
+static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t, bool));
static void ipcp_script __P((char *)); /* Run an up/down script */
static void ipcp_script_done __P((void *));
@@ -1659,7 +1669,12 @@
if (!sifnpmode(u, PPP_IP, NPMODE_QUEUE))
return 0;
if (wo->default_route)
+#ifndef __linux__
if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr))
+#else
+ if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr,
+ wo->replace_default_route))
+#endif
default_route_set[u] = 1;
if (wo->proxy_arp)
if (sifproxyarp(u, wo->hisaddr))
@@ -1741,7 +1756,8 @@
*/
if (demand) {
if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {
- ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr);
+ ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr,
+ wo->replace_default_route);
if (go->ouraddr != wo->ouraddr) {
warn("Local IP address changed to %I", go->ouraddr);
script_setenv("OLDIPLOCAL", ip_ntoa(wo->ouraddr), 0);
@@ -1766,7 +1782,12 @@
/* assign a default route through the interface if required */
if (ipcp_wantoptions[f->unit].default_route)
+#ifndef __linux__
if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
+#else
+ if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr,
+ wo->replace_default_route))
+#endif
default_route_set[f->unit] = 1;
/* Make a proxy ARP entry if requested. */
@@ -1813,7 +1834,12 @@
/* assign a default route through the interface if required */
if (ipcp_wantoptions[f->unit].default_route)
+#ifndef __linux__
if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
+#else
+ if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr,
+ wo->replace_default_route))
+#endif
default_route_set[f->unit] = 1;
/* Make a proxy ARP entry if requested. */
@@ -1890,7 +1916,7 @@
sifnpmode(f->unit, PPP_IP, NPMODE_DROP);
sifdown(f->unit);
ipcp_clear_addrs(f->unit, ipcp_gotoptions[f->unit].ouraddr,
- ipcp_hisoptions[f->unit].hisaddr);
+ ipcp_hisoptions[f->unit].hisaddr, 0);
}
/* Execute the ip-down script */
@@ -1906,16 +1932,25 @@
* proxy arp entries, etc.
*/
static void
-ipcp_clear_addrs(unit, ouraddr, hisaddr)
+ipcp_clear_addrs(unit, ouraddr, hisaddr, replacedefaultroute)
int unit;
u_int32_t ouraddr; /* local address */
u_int32_t hisaddr; /* remote address */
+ bool replacedefaultroute;
{
if (proxy_arp_set[unit]) {
cifproxyarp(unit, hisaddr);
proxy_arp_set[unit] = 0;
}
- if (default_route_set[unit]) {
+ /* If replacedefaultroute, sifdefaultroute will be called soon
+ * with replacedefaultroute set and that will overwrite the current
+ * default route. This is the case only when doing demand, otherwise
+ * during demand, this cifdefaultroute would restore the old default
+ * route which is not what we want in this case. In the non-demand
+ * case, we'll delete the default route and restore the old if there
+ * is one saved by an sifdefaultroute with replacedefaultroute.
+ */
+ if (!replacedefaultroute && default_route_set[unit]) {
cifdefaultroute(unit, ouraddr, hisaddr);
default_route_set[unit] = 0;
}
Index: ppp-2.4.3/pppd/ipcp.h
===================================================================
--- ppp-2.4.3.orig/pppd/ipcp.h 2007-06-04 13:22:08.263599024 +0200
+++ ppp-2.4.3/pppd/ipcp.h 2007-06-04 13:22:11.387124176 +0200
@@ -70,6 +70,7 @@
bool old_addrs; /* Use old (IP-Addresses) option? */
bool req_addr; /* Ask peer to send IP address? */
bool default_route; /* Assign default route through interface? */
+ bool replace_default_route; /* Replace default route through interface? */
bool proxy_arp; /* Make proxy ARP entry for peer? */
bool neg_vj; /* Van Jacobson Compression? */
bool old_vj; /* use old (short) form of VJ option? */
Index: ppp-2.4.3/pppd/pppd.h
===================================================================
--- ppp-2.4.3.orig/pppd/pppd.h 2007-06-04 13:22:09.005486240 +0200
+++ ppp-2.4.3/pppd/pppd.h 2007-06-04 13:22:11.388124024 +0200
@@ -642,7 +642,11 @@
int cif6addr __P((int, eui64_t, eui64_t));
/* Remove an IPv6 address from i/f */
#endif
+#ifndef __linux__
int sifdefaultroute __P((int, u_int32_t, u_int32_t));
+#else
+int sifdefaultroute __P((int, u_int32_t, u_int32_t, bool replace_default_rt));
+#endif
/* Create default route through i/f */
int cifdefaultroute __P((int, u_int32_t, u_int32_t));
/* Delete default route through i/f */
Index: ppp-2.4.3/pppd/sys-linux.c
===================================================================
--- ppp-2.4.3.orig/pppd/sys-linux.c 2007-06-04 13:22:08.807516336 +0200
+++ ppp-2.4.3/pppd/sys-linux.c 2007-06-04 13:22:11.389123872 +0200
@@ -206,6 +206,8 @@
static int if_is_up; /* Interface has been marked up */
static u_int32_t default_route_gateway; /* Gateway for default route added */
+static struct rtentry old_def_rt; /* Old default route */
+static int default_rt_repl_rest; /* replace and restore old default rt */
static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
static char proxy_arp_dev[16]; /* Device for proxy arp entry */
static u_int32_t our_old_addr; /* for detecting address changes */
@@ -1520,6 +1522,9 @@
p = NULL;
}
+ SET_SA_FAMILY (rt->rt_dst, AF_INET);
+ SET_SA_FAMILY (rt->rt_gateway, AF_INET);
+
SIN_ADDR(rt->rt_dst) = strtoul(cols[route_dest_col], NULL, 16);
SIN_ADDR(rt->rt_gateway) = strtoul(cols[route_gw_col], NULL, 16);
SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
@@ -1589,19 +1594,53 @@
/********************************************************************
*
* sifdefaultroute - assign a default route through the address given.
- */
-
-int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
-{
- struct rtentry rt;
-
- if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
- u_int32_t old_gateway = SIN_ADDR(rt.rt_gateway);
-
- if (old_gateway != gateway)
- error("not replacing existing default route to %s [%I]",
- rt.rt_dev, old_gateway);
- return 0;
+ *
+ * If the global default_rt_repl_rest flag is set, then this function
+ * already replaced the original system defaultroute with some other
+ * route and it should just replace the current defaultroute with
+ * another one, without saving the current route. Use: demand mode,
+ * when pppd sets first a defaultroute it it's temporary ppp0 addresses
+ * and then changes the temporary addresses to the addresses for the real
+ * ppp connection when it has come up.
+ */
+
+int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway, bool replace)
+{
+ struct rtentry rt, tmp_rt;
+ struct rtentry *del_rt = NULL;
+
+
+ if (default_rt_repl_rest) {
+ /* We have already reclaced the original defaultroute, if we
+ * are called again, we will delete the current default route
+ * and set the new default route in this function.
+ * - this is normally only the case the doing demand: */
+ if (defaultroute_exists( &tmp_rt ))
+ del_rt = &tmp_rt;
+ } else if ( defaultroute_exists( &old_def_rt ) &&
+ strcmp( old_def_rt.rt_dev, ifname ) != 0) {
+ /* We did not yet replace an existing default route, let's
+ * check if we should save and replace a default route:
+ */
+ u_int32_t old_gateway = SIN_ADDR(old_def_rt.rt_gateway);
+
+ if (old_gateway != gateway) {
+ if (!replace) {
+ error("not replacing default route to %s [%I]",
+ old_def_rt.rt_dev, old_gateway);
+ return 0;
+ } else {
+ // we need to copy rt_dev because we need it permanent too:
+ char * tmp_dev = malloc(strlen(old_def_rt.rt_dev)+1);
+ strcpy(tmp_dev, old_def_rt.rt_dev);
+ old_def_rt.rt_dev = tmp_dev;
+
+ notice("replacing old default route to %s [%I]",
+ old_def_rt.rt_dev, old_gateway);
+ default_rt_repl_rest = 1;
+ del_rt = &old_def_rt;
+ }
+ }
}
memset (&rt, '\0', sizeof (rt));
@@ -1623,6 +1662,12 @@
error("default route ioctl(SIOCADDRT): %m");
return 0;
}
+ if (default_rt_repl_rest && del_rt)
+ if (ioctl(sock_fd, SIOCDELRT, del_rt) < 0) {
+ if ( ! ok_error ( errno ))
+ error("del old default route ioctl(SIOCDELRT): %m(%d)", errno);
+ return 0;
+ }
default_route_gateway = gateway;
return 1;
@@ -1658,6 +1703,16 @@
return 0;
}
}
+ if (default_rt_repl_rest) {
+ notice("restoring old default route to %s [%I]",
+ old_def_rt.rt_dev, SIN_ADDR(old_def_rt.rt_gateway));
+ if (ioctl(sock_fd, SIOCADDRT, &old_def_rt) < 0) {
+ if ( ! ok_error ( errno ))
+ error("restore default route ioctl(SIOCADDRT): %m(%d)", errno);
+ return 0;
+ }
+ default_rt_repl_rest = 0;
+ }
return 1;
}

View file

@ -0,0 +1,62 @@
diff -Naur ppp-2.4.4.orig/pppd/plugins/pppoatm/pppoatm.c ppp-2.4.4/pppd/plugins/pppoatm/pppoatm.c
--- ppp-2.4.4.orig/pppd/plugins/pppoatm/pppoatm.c 2009-05-07 16:23:41.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/pppoatm/pppoatm.c 2009-05-07 16:23:57.000000000 -0400
@@ -179,8 +179,11 @@
int sock;
struct ifreq ifr;
- if (mtu > pppoatm_max_mtu)
- error("Couldn't increase MTU to %d", mtu);
+ if (pppoatm_max_mtu && mtu > pppoatm_max_mtu) {
+ warn("Couldn't increase MTU to %d. Using %d",
+ mtu, pppoatm_max_mtu);
+ mtu = pppoatm_max_mtu;
+ }
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
@@ -198,8 +201,11 @@
int pcomp,
int accomp)
{
- if (mru > pppoatm_max_mru)
- error("Couldn't increase MRU to %d", mru);
+ if (pppoatm_max_mru && mru > pppoatm_max_mru) {
+ warn("Couldn't increase MRU to %d. Using %d",
+ mru, pppoatm_max_mru);
+ mru = pppoatm_max_mru;
+ }
}
void plugin_init(void)
diff -Naur ppp-2.4.4.orig/pppd/plugins/pppoatm/pppoatm.c ppp-2.4.4/pppd/plugins/pppoatm/pppoatm.c
--- ppp-2.4.4.orig/pppd/plugins/pppoatm/pppoatm.c 2009-05-07 16:23:41.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/pppoatm/pppoatm.c 2009-05-07 16:23:57.000000000 -0400
@@ -179,8 +179,11 @@
int sock;
struct ifreq ifr;
- if (mtu > pppoatm_max_mtu)
- error("Couldn't increase MTU to %d", mtu);
+ if (pppoatm_max_mtu && mtu > pppoatm_max_mtu) {
+ warn("Couldn't increase MTU to %d. Using %d",
+ mtu, pppoatm_max_mtu);
+ mtu = pppoatm_max_mtu;
+ }
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
@@ -198,8 +201,11 @@
int pcomp,
int accomp)
{
- if (mru > pppoatm_max_mru)
- error("Couldn't increase MRU to %d", mru);
+ if (pppoatm_max_mru && mru > pppoatm_max_mru) {
+ warn("Couldn't increase MRU to %d. Using %d",
+ mru, pppoatm_max_mru);
+ mru = pppoatm_max_mru;
+ }
}
void plugin_init(void)

View file

@ -1,180 +0,0 @@
Index: ppp-2.4.3/pppd/demand.c
===================================================================
--- ppp-2.4.3.orig/pppd/demand.c 2007-06-04 13:22:08.217606016 +0200
+++ ppp-2.4.3/pppd/demand.c 2007-06-04 13:22:11.613089824 +0200
@@ -36,6 +36,8 @@
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
+#include <unistd.h>
+#include <syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -43,6 +45,8 @@
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#ifdef PPP_FILTER
#include <pcap-bpf.h>
#endif
@@ -221,6 +225,14 @@
int c, rv;
rv = 0;
+
+/* check for synchronous connection... */
+
+ if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
+ rv = loop_frame(p,n);
+ return rv;
+ }
+
for (; n > 0; --n) {
c = *p++;
if (c == PPP_FLAG) {
@@ -299,17 +311,102 @@
* loopback, now that the real serial link is up.
*/
void
-demand_rexmit(proto)
+demand_rexmit(proto, newip)
int proto;
+ u_int32_t newip;
{
struct packet *pkt, *prev, *nextpkt;
+ unsigned short checksum;
+ unsigned short pkt_checksum = 0;
+ unsigned iphdr;
+ struct timeval tv;
+ char cv = 0;
+ char ipstr[16];
prev = NULL;
pkt = pend_q;
pend_q = NULL;
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */
for (; pkt != NULL; pkt = nextpkt) {
nextpkt = pkt->next;
if (PPP_PROTOCOL(pkt->data) == proto) {
+ if ( (proto == PPP_IP) && newip ) {
+ /* Get old checksum */
+
+ iphdr = (pkt->data[4] & 15) << 2;
+ checksum = *((unsigned short *) (pkt->data+14));
+ if (checksum == 0xFFFF) {
+ checksum = 0;
+ }
+
+
+ if (pkt->data[13] == 17) {
+ pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr));
+ if (pkt_checksum) {
+ cv = 1;
+ if (pkt_checksum == 0xFFFF) {
+ pkt_checksum = 0;
+ }
+ }
+ else {
+ cv = 0;
+ }
+ }
+
+ if (pkt->data[13] == 6) {
+ pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
+ cv = 1;
+ if (pkt_checksum == 0xFFFF) {
+ pkt_checksum = 0;
+ }
+ }
+
+ /* Delete old Source-IP-Address */
+ checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ /* Change Source-IP-Address */
+ * ((u_int32_t *) (pkt->data + 16)) = newip;
+
+ /* Add new Source-IP-Address */
+ checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
+ pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
+
+ /* Write new checksum */
+ if (!checksum) {
+ checksum = 0xFFFF;
+ }
+ *((unsigned short *) (pkt->data+14)) = checksum;
+ if (pkt->data[13] == 6) {
+ *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
+ }
+ if (cv && (pkt->data[13] == 17) ) {
+ *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
+ }
+
+ /* Log Packet */
+ strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
+ if (pkt->data[13] == 1) {
+ syslog(LOG_INFO,"Open ICMP %s -> %s\n",
+ ipstr,
+ inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
+ } else {
+ syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
+ pkt->data[13] == 6 ? "TCP" : "UDP",
+ ipstr,
+ ntohs(*( (short *) (pkt->data+iphdr+4))),
+ inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
+ ntohs(*( (short *) (pkt->data+iphdr+6))));
+ }
+ }
output(0, pkt->data, pkt->length);
free(pkt);
} else {
Index: ppp-2.4.3/pppd/ipcp.c
===================================================================
--- ppp-2.4.3.orig/pppd/ipcp.c 2007-06-04 13:22:11.387124176 +0200
+++ ppp-2.4.3/pppd/ipcp.c 2007-06-04 13:22:11.614089672 +0200
@@ -1796,7 +1796,7 @@
proxy_arp_set[f->unit] = 1;
}
- demand_rexmit(PPP_IP);
+ demand_rexmit(PPP_IP,go->ouraddr);
sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
} else {
Index: ppp-2.4.3/pppd/ipv6cp.c
===================================================================
--- ppp-2.4.3.orig/pppd/ipv6cp.c 2007-06-04 13:22:08.229604192 +0200
+++ ppp-2.4.3/pppd/ipv6cp.c 2007-06-04 13:22:11.614089672 +0200
@@ -1232,7 +1232,7 @@
}
}
- demand_rexmit(PPP_IPV6);
+ demand_rexmit(PPP_IPV6,0);
sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
} else {
Index: ppp-2.4.3/pppd/pppd.h
===================================================================
--- ppp-2.4.3.orig/pppd/pppd.h 2007-06-04 13:22:11.388124024 +0200
+++ ppp-2.4.3/pppd/pppd.h 2007-06-04 13:22:11.615089520 +0200
@@ -563,7 +563,7 @@
void demand_block __P((void)); /* set all NPs to queue up packets */
void demand_unblock __P((void)); /* set all NPs to pass packets */
void demand_discard __P((void)); /* set all NPs to discard packets */
-void demand_rexmit __P((int)); /* retransmit saved frames for an NP */
+void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/
int loop_chars __P((unsigned char *, int)); /* process chars from loopback */
int loop_frame __P((unsigned char *, int)); /* should we bring link up? */

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,614 @@
diff -Naur ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c
--- ppp-2.4.4.orig/pppd/ipcp.c 2009-05-09 02:55:46.000000000 -0400
+++ ppp-2.4.4/pppd/ipcp.c 2009-05-09 02:58:31.000000000 -0400
@@ -197,6 +197,14 @@
"disable defaultroute option", OPT_ALIAS | OPT_A2CLR,
&ipcp_wantoptions[0].default_route },
+ { "replacedefaultroute", o_bool,
+ &ipcp_wantoptions[0].replace_default_route,
+ "Replace default route", 1
+ },
+ { "noreplacedefaultroute", o_bool,
+ &ipcp_allowoptions[0].replace_default_route,
+ "Never replace default route", OPT_A2COPY,
+ &ipcp_wantoptions[0].replace_default_route },
{ "proxyarp", o_bool, &ipcp_wantoptions[0].proxy_arp,
"Add proxy ARP entry", OPT_ENABLE|1, &ipcp_allowoptions[0].proxy_arp },
{ "noproxyarp", o_bool, &ipcp_allowoptions[0].proxy_arp,
@@ -263,7 +271,7 @@
ip_active_pkt
};
-static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t));
+static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t, bool));
static void ipcp_script __P((char *, int)); /* Run an up/down script */
static void ipcp_script_done __P((void *));
@@ -1660,7 +1668,8 @@
if (!sifnpmode(u, PPP_IP, NPMODE_QUEUE))
return 0;
if (wo->default_route)
- if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr))
+ if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr,
+ wo->replace_default_route))
default_route_set[u] = 1;
if (wo->proxy_arp)
if (sifproxyarp(u, wo->hisaddr))
@@ -1742,7 +1751,8 @@
*/
if (demand) {
if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {
- ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr);
+ ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr,
+ wo->replace_default_route);
if (go->ouraddr != wo->ouraddr) {
warn("Local IP address changed to %I", go->ouraddr);
script_setenv("OLDIPLOCAL", ip_ntoa(wo->ouraddr), 0);
@@ -1767,7 +1777,8 @@
/* assign a default route through the interface if required */
if (ipcp_wantoptions[f->unit].default_route)
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
+ if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr,
+ wo->replace_default_route))
default_route_set[f->unit] = 1;
/* Make a proxy ARP entry if requested. */
@@ -1817,7 +1828,8 @@
/* assign a default route through the interface if required */
if (ipcp_wantoptions[f->unit].default_route)
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
+ if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr,
+ wo->replace_default_route))
default_route_set[f->unit] = 1;
/* Make a proxy ARP entry if requested. */
@@ -1894,7 +1906,7 @@
sifnpmode(f->unit, PPP_IP, NPMODE_DROP);
sifdown(f->unit);
ipcp_clear_addrs(f->unit, ipcp_gotoptions[f->unit].ouraddr,
- ipcp_hisoptions[f->unit].hisaddr);
+ ipcp_hisoptions[f->unit].hisaddr, 0);
}
/* Execute the ip-down script */
@@ -1910,16 +1922,25 @@
* proxy arp entries, etc.
*/
static void
-ipcp_clear_addrs(unit, ouraddr, hisaddr)
+ipcp_clear_addrs(unit, ouraddr, hisaddr, replacedefaultroute)
int unit;
u_int32_t ouraddr; /* local address */
u_int32_t hisaddr; /* remote address */
+ bool replacedefaultroute;
{
if (proxy_arp_set[unit]) {
cifproxyarp(unit, hisaddr);
proxy_arp_set[unit] = 0;
}
- if (default_route_set[unit]) {
+ /* If replacedefaultroute, sifdefaultroute will be called soon
+ * with replacedefaultroute set and that will overwrite the current
+ * default route. This is the case only when doing demand, otherwise
+ * during demand, this cifdefaultroute would restore the old default
+ * route which is not what we want in this case. In the non-demand
+ * case, we'll delete the default route and restore the old if there
+ * is one saved by an sifdefaultroute with replacedefaultroute.
+ */
+ if (!replacedefaultroute && default_route_set[unit]) {
cifdefaultroute(unit, ouraddr, hisaddr);
default_route_set[unit] = 0;
}
diff -Naur ppp-2.4.4.orig/pppd/ipcp.h ppp-2.4.4/pppd/ipcp.h
--- ppp-2.4.4.orig/pppd/ipcp.h 2009-05-09 02:54:59.000000000 -0400
+++ ppp-2.4.4/pppd/ipcp.h 2009-05-09 02:58:31.000000000 -0400
@@ -70,6 +70,7 @@
bool old_addrs; /* Use old (IP-Addresses) option? */
bool req_addr; /* Ask peer to send IP address? */
bool default_route; /* Assign default route through interface? */
+ bool replace_default_route; /* Replace default route through interface? */
bool proxy_arp; /* Make proxy ARP entry for peer? */
bool neg_vj; /* Van Jacobson Compression? */
bool old_vj; /* use old (short) form of VJ option? */
diff -Naur ppp-2.4.4.orig/pppd/pppd.8 ppp-2.4.4/pppd/pppd.8
--- ppp-2.4.4.orig/pppd/pppd.8 2009-05-09 02:54:59.000000000 -0400
+++ ppp-2.4.4/pppd/pppd.8 2009-05-09 02:58:31.000000000 -0400
@@ -121,6 +121,11 @@
This entry is removed when the PPP connection is broken. This option
is privileged if the \fInodefaultroute\fR option has been specified.
.TP
+.B replacedefaultroute
+This option is a flag to the defaultroute option. If defaultroute is
+set and this flag is also set, pppd replaces an existing default route
+with the new default route.
+.TP
.B disconnect \fIscript
Execute the command specified by \fIscript\fR, by passing it to a
shell, after
@@ -706,7 +711,12 @@
.TP
.B nodefaultroute
Disable the \fIdefaultroute\fR option. The system administrator who
-wishes to prevent users from creating default routes with pppd
+wishes to prevent users from adding a default route with pppd
+can do so by placing this option in the /etc/ppp/options file.
+.TP
+.B noreplacedefaultroute
+Disable the \fIreplacedefaultroute\fR option. The system administrator who
+wishes to prevent users from replacing a default route with pppd
can do so by placing this option in the /etc/ppp/options file.
.TP
.B nodeflate
diff -Naur ppp-2.4.4.orig/pppd/pppd.h ppp-2.4.4/pppd/pppd.h
--- ppp-2.4.4.orig/pppd/pppd.h 2009-05-09 02:55:46.000000000 -0400
+++ ppp-2.4.4/pppd/pppd.h 2009-05-09 02:58:31.000000000 -0400
@@ -644,7 +644,7 @@
int cif6addr __P((int, eui64_t, eui64_t));
/* Remove an IPv6 address from i/f */
#endif
-int sifdefaultroute __P((int, u_int32_t, u_int32_t));
+int sifdefaultroute __P((int, u_int32_t, u_int32_t, bool replace_default_rt));
/* Create default route through i/f */
int cifdefaultroute __P((int, u_int32_t, u_int32_t));
/* Delete default route through i/f */
diff -Naur ppp-2.4.4.orig/pppd/sys-linux.c ppp-2.4.4/pppd/sys-linux.c
--- ppp-2.4.4.orig/pppd/sys-linux.c 2009-05-09 02:55:46.000000000 -0400
+++ ppp-2.4.4/pppd/sys-linux.c 2009-05-09 02:58:31.000000000 -0400
@@ -206,6 +206,8 @@
static int if_is_up; /* Interface has been marked up */
static int have_default_route; /* Gateway for default route added */
+static struct rtentry old_def_rt; /* Old default route */
+static int default_rt_repl_rest; /* replace and restore old default rt */
static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
static char proxy_arp_dev[16]; /* Device for proxy arp entry */
static u_int32_t our_old_addr; /* for detecting address changes */
@@ -1520,6 +1522,9 @@
p = NULL;
}
+ SET_SA_FAMILY (rt->rt_dst, AF_INET);
+ SET_SA_FAMILY (rt->rt_gateway, AF_INET);
+
SIN_ADDR(rt->rt_dst) = strtoul(cols[route_dest_col], NULL, 16);
SIN_ADDR(rt->rt_gateway) = strtoul(cols[route_gw_col], NULL, 16);
SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
@@ -1589,20 +1594,51 @@
/********************************************************************
*
* sifdefaultroute - assign a default route through the address given.
- */
-
-int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
-{
- struct rtentry rt;
-
- if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
- if (rt.rt_flags & RTF_GATEWAY)
- error("not replacing existing default route via %I",
- SIN_ADDR(rt.rt_gateway));
- else
+ *
+ * If the global default_rt_repl_rest flag is set, then this function
+ * already replaced the original system defaultroute with some other
+ * route and it should just replace the current defaultroute with
+ * another one, without saving the current route. Use: demand mode,
+ * when pppd sets first a defaultroute it it's temporary ppp0 addresses
+ * and then changes the temporary addresses to the addresses for the real
+ * ppp connection when it has come up.
+ */
+
+int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway, bool replace)
+{
+ struct rtentry rt, tmp_rt;
+ struct rtentry *del_rt = NULL;
+
+ if (default_rt_repl_rest) {
+ /* We have already reclaced the original defaultroute, if we
+ are called again, we will delete the current default route
+ and set the new default route in this function.
+ - this is normally only the case the doing demand: */
+ if (defaultroute_exists(&tmp_rt))
+ del_rt = &tmp_rt;
+ } else if (defaultroute_exists(&old_def_rt) &&
+ strcmp(old_def_rt.rt_dev, ifname) != 0) {
+ /* We did not yet replace an existing default route, let's
+ check if we should save and replace a default route: */
+ if (old_def_rt.rt_flags & RTF_GATEWAY) {
+ if (!replace) {
+ error("not replacing existing default route via %I",
+ SIN_ADDR(old_def_rt.rt_gateway));
+ return 0;
+ } else {
+ /* we need to copy rt_dev because we need it permanent too: */
+ char *tmp_dev = malloc(strlen(old_def_rt.rt_dev) + 1);
+ strcpy(tmp_dev, old_def_rt.rt_dev);
+ old_def_rt.rt_dev = tmp_dev;
+
+ notice("replacing old default route to %s [%I]",
+ old_def_rt.rt_dev, SIN_ADDR(old_def_rt.rt_gateway));
+ default_rt_repl_rest = 1;
+ del_rt = &old_def_rt;
+ }
+ } else
error("not replacing existing default route through %s",
- rt.rt_dev);
- return 0;
+ old_def_rt.rt_dev);
}
memset (&rt, 0, sizeof (rt));
@@ -1617,10 +1653,16 @@
rt.rt_flags = RTF_UP;
if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
- if ( ! ok_error ( errno ))
+ if (!ok_error(errno))
error("default route ioctl(SIOCADDRT): %m");
return 0;
}
+ if (default_rt_repl_rest && del_rt)
+ if (ioctl(sock_fd, SIOCDELRT, del_rt) < 0) {
+ if (!ok_error(errno))
+ error("del old default route ioctl(SIOCDELRT): %m");
+ return 0;
+ }
have_default_route = 1;
return 1;
@@ -1649,11 +1691,21 @@
rt.rt_flags = RTF_UP;
if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
if (still_ppp()) {
- if ( ! ok_error ( errno ))
+ if (!ok_error(errno))
error("default route ioctl(SIOCDELRT): %m");
return 0;
}
}
+ if (default_rt_repl_rest) {
+ notice("restoring old default route to %s [%I]",
+ old_def_rt.rt_dev, SIN_ADDR(old_def_rt.rt_gateway));
+ if (ioctl(sock_fd, SIOCADDRT, &old_def_rt) < 0) {
+ if (!ok_error(errno))
+ error("restore default route ioctl(SIOCADDRT): %m");
+ return 0;
+ }
+ default_rt_repl_rest = 0;
+ }
return 1;
}
diff -Naur ppp-2.4.4.orig/pppd/sys-solaris.c ppp-2.4.4/pppd/sys-solaris.c
--- ppp-2.4.4.orig/pppd/sys-solaris.c 2009-05-09 02:54:59.000000000 -0400
+++ ppp-2.4.4/pppd/sys-solaris.c 2009-05-09 02:58:31.000000000 -0400
@@ -2036,12 +2036,18 @@
* sifdefaultroute - assign a default route through the address given.
*/
int
-sifdefaultroute(u, l, g)
+sifdefaultroute(u, l, g, replace)
int u;
u_int32_t l, g;
+ bool replace;
{
struct rtentry rt;
+ if (replace) {
+ error("replacedefaultroute not supported on this platform");
+ return 0;
+ }
+
#if defined(__USLC__)
g = l; /* use the local address as gateway */
#endif
diff -Naur ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c
--- ppp-2.4.4.orig/pppd/ipcp.c 2009-05-09 02:55:46.000000000 -0400
+++ ppp-2.4.4/pppd/ipcp.c 2009-05-09 02:58:31.000000000 -0400
@@ -197,6 +197,14 @@
"disable defaultroute option", OPT_ALIAS | OPT_A2CLR,
&ipcp_wantoptions[0].default_route },
+ { "replacedefaultroute", o_bool,
+ &ipcp_wantoptions[0].replace_default_route,
+ "Replace default route", 1
+ },
+ { "noreplacedefaultroute", o_bool,
+ &ipcp_allowoptions[0].replace_default_route,
+ "Never replace default route", OPT_A2COPY,
+ &ipcp_wantoptions[0].replace_default_route },
{ "proxyarp", o_bool, &ipcp_wantoptions[0].proxy_arp,
"Add proxy ARP entry", OPT_ENABLE|1, &ipcp_allowoptions[0].proxy_arp },
{ "noproxyarp", o_bool, &ipcp_allowoptions[0].proxy_arp,
@@ -263,7 +271,7 @@
ip_active_pkt
};
-static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t));
+static void ipcp_clear_addrs __P((int, u_int32_t, u_int32_t, bool));
static void ipcp_script __P((char *, int)); /* Run an up/down script */
static void ipcp_script_done __P((void *));
@@ -1660,7 +1668,8 @@
if (!sifnpmode(u, PPP_IP, NPMODE_QUEUE))
return 0;
if (wo->default_route)
- if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr))
+ if (sifdefaultroute(u, wo->ouraddr, wo->hisaddr,
+ wo->replace_default_route))
default_route_set[u] = 1;
if (wo->proxy_arp)
if (sifproxyarp(u, wo->hisaddr))
@@ -1742,7 +1751,8 @@
*/
if (demand) {
if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {
- ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr);
+ ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr,
+ wo->replace_default_route);
if (go->ouraddr != wo->ouraddr) {
warn("Local IP address changed to %I", go->ouraddr);
script_setenv("OLDIPLOCAL", ip_ntoa(wo->ouraddr), 0);
@@ -1767,7 +1777,8 @@
/* assign a default route through the interface if required */
if (ipcp_wantoptions[f->unit].default_route)
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
+ if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr,
+ wo->replace_default_route))
default_route_set[f->unit] = 1;
/* Make a proxy ARP entry if requested. */
@@ -1817,7 +1828,8 @@
/* assign a default route through the interface if required */
if (ipcp_wantoptions[f->unit].default_route)
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
+ if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr,
+ wo->replace_default_route))
default_route_set[f->unit] = 1;
/* Make a proxy ARP entry if requested. */
@@ -1894,7 +1906,7 @@
sifnpmode(f->unit, PPP_IP, NPMODE_DROP);
sifdown(f->unit);
ipcp_clear_addrs(f->unit, ipcp_gotoptions[f->unit].ouraddr,
- ipcp_hisoptions[f->unit].hisaddr);
+ ipcp_hisoptions[f->unit].hisaddr, 0);
}
/* Execute the ip-down script */
@@ -1910,16 +1922,25 @@
* proxy arp entries, etc.
*/
static void
-ipcp_clear_addrs(unit, ouraddr, hisaddr)
+ipcp_clear_addrs(unit, ouraddr, hisaddr, replacedefaultroute)
int unit;
u_int32_t ouraddr; /* local address */
u_int32_t hisaddr; /* remote address */
+ bool replacedefaultroute;
{
if (proxy_arp_set[unit]) {
cifproxyarp(unit, hisaddr);
proxy_arp_set[unit] = 0;
}
- if (default_route_set[unit]) {
+ /* If replacedefaultroute, sifdefaultroute will be called soon
+ * with replacedefaultroute set and that will overwrite the current
+ * default route. This is the case only when doing demand, otherwise
+ * during demand, this cifdefaultroute would restore the old default
+ * route which is not what we want in this case. In the non-demand
+ * case, we'll delete the default route and restore the old if there
+ * is one saved by an sifdefaultroute with replacedefaultroute.
+ */
+ if (!replacedefaultroute && default_route_set[unit]) {
cifdefaultroute(unit, ouraddr, hisaddr);
default_route_set[unit] = 0;
}
diff -Naur ppp-2.4.4.orig/pppd/ipcp.h ppp-2.4.4/pppd/ipcp.h
--- ppp-2.4.4.orig/pppd/ipcp.h 2009-05-09 02:54:59.000000000 -0400
+++ ppp-2.4.4/pppd/ipcp.h 2009-05-09 02:58:31.000000000 -0400
@@ -70,6 +70,7 @@
bool old_addrs; /* Use old (IP-Addresses) option? */
bool req_addr; /* Ask peer to send IP address? */
bool default_route; /* Assign default route through interface? */
+ bool replace_default_route; /* Replace default route through interface? */
bool proxy_arp; /* Make proxy ARP entry for peer? */
bool neg_vj; /* Van Jacobson Compression? */
bool old_vj; /* use old (short) form of VJ option? */
diff -Naur ppp-2.4.4.orig/pppd/pppd.8 ppp-2.4.4/pppd/pppd.8
--- ppp-2.4.4.orig/pppd/pppd.8 2009-05-09 02:54:59.000000000 -0400
+++ ppp-2.4.4/pppd/pppd.8 2009-05-09 02:58:31.000000000 -0400
@@ -121,6 +121,11 @@
This entry is removed when the PPP connection is broken. This option
is privileged if the \fInodefaultroute\fR option has been specified.
.TP
+.B replacedefaultroute
+This option is a flag to the defaultroute option. If defaultroute is
+set and this flag is also set, pppd replaces an existing default route
+with the new default route.
+.TP
.B disconnect \fIscript
Execute the command specified by \fIscript\fR, by passing it to a
shell, after
@@ -706,7 +711,12 @@
.TP
.B nodefaultroute
Disable the \fIdefaultroute\fR option. The system administrator who
-wishes to prevent users from creating default routes with pppd
+wishes to prevent users from adding a default route with pppd
+can do so by placing this option in the /etc/ppp/options file.
+.TP
+.B noreplacedefaultroute
+Disable the \fIreplacedefaultroute\fR option. The system administrator who
+wishes to prevent users from replacing a default route with pppd
can do so by placing this option in the /etc/ppp/options file.
.TP
.B nodeflate
diff -Naur ppp-2.4.4.orig/pppd/pppd.h ppp-2.4.4/pppd/pppd.h
--- ppp-2.4.4.orig/pppd/pppd.h 2009-05-09 02:55:46.000000000 -0400
+++ ppp-2.4.4/pppd/pppd.h 2009-05-09 02:58:31.000000000 -0400
@@ -644,7 +644,7 @@
int cif6addr __P((int, eui64_t, eui64_t));
/* Remove an IPv6 address from i/f */
#endif
-int sifdefaultroute __P((int, u_int32_t, u_int32_t));
+int sifdefaultroute __P((int, u_int32_t, u_int32_t, bool replace_default_rt));
/* Create default route through i/f */
int cifdefaultroute __P((int, u_int32_t, u_int32_t));
/* Delete default route through i/f */
diff -Naur ppp-2.4.4.orig/pppd/sys-linux.c ppp-2.4.4/pppd/sys-linux.c
--- ppp-2.4.4.orig/pppd/sys-linux.c 2009-05-09 02:55:46.000000000 -0400
+++ ppp-2.4.4/pppd/sys-linux.c 2009-05-09 02:58:31.000000000 -0400
@@ -206,6 +206,8 @@
static int if_is_up; /* Interface has been marked up */
static int have_default_route; /* Gateway for default route added */
+static struct rtentry old_def_rt; /* Old default route */
+static int default_rt_repl_rest; /* replace and restore old default rt */
static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
static char proxy_arp_dev[16]; /* Device for proxy arp entry */
static u_int32_t our_old_addr; /* for detecting address changes */
@@ -1520,6 +1522,9 @@
p = NULL;
}
+ SET_SA_FAMILY (rt->rt_dst, AF_INET);
+ SET_SA_FAMILY (rt->rt_gateway, AF_INET);
+
SIN_ADDR(rt->rt_dst) = strtoul(cols[route_dest_col], NULL, 16);
SIN_ADDR(rt->rt_gateway) = strtoul(cols[route_gw_col], NULL, 16);
SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
@@ -1589,20 +1594,51 @@
/********************************************************************
*
* sifdefaultroute - assign a default route through the address given.
- */
-
-int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
-{
- struct rtentry rt;
-
- if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
- if (rt.rt_flags & RTF_GATEWAY)
- error("not replacing existing default route via %I",
- SIN_ADDR(rt.rt_gateway));
- else
+ *
+ * If the global default_rt_repl_rest flag is set, then this function
+ * already replaced the original system defaultroute with some other
+ * route and it should just replace the current defaultroute with
+ * another one, without saving the current route. Use: demand mode,
+ * when pppd sets first a defaultroute it it's temporary ppp0 addresses
+ * and then changes the temporary addresses to the addresses for the real
+ * ppp connection when it has come up.
+ */
+
+int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway, bool replace)
+{
+ struct rtentry rt, tmp_rt;
+ struct rtentry *del_rt = NULL;
+
+ if (default_rt_repl_rest) {
+ /* We have already reclaced the original defaultroute, if we
+ are called again, we will delete the current default route
+ and set the new default route in this function.
+ - this is normally only the case the doing demand: */
+ if (defaultroute_exists(&tmp_rt))
+ del_rt = &tmp_rt;
+ } else if (defaultroute_exists(&old_def_rt) &&
+ strcmp(old_def_rt.rt_dev, ifname) != 0) {
+ /* We did not yet replace an existing default route, let's
+ check if we should save and replace a default route: */
+ if (old_def_rt.rt_flags & RTF_GATEWAY) {
+ if (!replace) {
+ error("not replacing existing default route via %I",
+ SIN_ADDR(old_def_rt.rt_gateway));
+ return 0;
+ } else {
+ /* we need to copy rt_dev because we need it permanent too: */
+ char *tmp_dev = malloc(strlen(old_def_rt.rt_dev) + 1);
+ strcpy(tmp_dev, old_def_rt.rt_dev);
+ old_def_rt.rt_dev = tmp_dev;
+
+ notice("replacing old default route to %s [%I]",
+ old_def_rt.rt_dev, SIN_ADDR(old_def_rt.rt_gateway));
+ default_rt_repl_rest = 1;
+ del_rt = &old_def_rt;
+ }
+ } else
error("not replacing existing default route through %s",
- rt.rt_dev);
- return 0;
+ old_def_rt.rt_dev);
}
memset (&rt, 0, sizeof (rt));
@@ -1617,10 +1653,16 @@
rt.rt_flags = RTF_UP;
if (ioctl(sock_fd, SIOCADDRT, &rt) < 0) {
- if ( ! ok_error ( errno ))
+ if (!ok_error(errno))
error("default route ioctl(SIOCADDRT): %m");
return 0;
}
+ if (default_rt_repl_rest && del_rt)
+ if (ioctl(sock_fd, SIOCDELRT, del_rt) < 0) {
+ if (!ok_error(errno))
+ error("del old default route ioctl(SIOCDELRT): %m");
+ return 0;
+ }
have_default_route = 1;
return 1;
@@ -1649,11 +1691,21 @@
rt.rt_flags = RTF_UP;
if (ioctl(sock_fd, SIOCDELRT, &rt) < 0 && errno != ESRCH) {
if (still_ppp()) {
- if ( ! ok_error ( errno ))
+ if (!ok_error(errno))
error("default route ioctl(SIOCDELRT): %m");
return 0;
}
}
+ if (default_rt_repl_rest) {
+ notice("restoring old default route to %s [%I]",
+ old_def_rt.rt_dev, SIN_ADDR(old_def_rt.rt_gateway));
+ if (ioctl(sock_fd, SIOCADDRT, &old_def_rt) < 0) {
+ if (!ok_error(errno))
+ error("restore default route ioctl(SIOCADDRT): %m");
+ return 0;
+ }
+ default_rt_repl_rest = 0;
+ }
return 1;
}
diff -Naur ppp-2.4.4.orig/pppd/sys-solaris.c ppp-2.4.4/pppd/sys-solaris.c
--- ppp-2.4.4.orig/pppd/sys-solaris.c 2009-05-09 02:54:59.000000000 -0400
+++ ppp-2.4.4/pppd/sys-solaris.c 2009-05-09 02:58:31.000000000 -0400
@@ -2036,12 +2036,18 @@
* sifdefaultroute - assign a default route through the address given.
*/
int
-sifdefaultroute(u, l, g)
+sifdefaultroute(u, l, g, replace)
int u;
u_int32_t l, g;
+ bool replace;
{
struct rtentry rt;
+ if (replace) {
+ error("replacedefaultroute not supported on this platform");
+ return 0;
+ }
+
#if defined(__USLC__)
g = l; /* use the local address as gateway */
#endif

View file

@ -1,7 +1,6 @@
Index: ppp-2.4.3/pppd/Makefile.linux diff -Naur ppp-2.4.4.orig/pppd/Makefile.linux ppp-2.4.4/pppd/Makefile.linux
=================================================================== --- ppp-2.4.4.orig/pppd/Makefile.linux 2009-05-08 23:17:17.000000000 -0400
--- ppp-2.4.3.orig/pppd/Makefile.linux 2007-06-04 13:22:08.197609056 +0200 +++ ppp-2.4.4/pppd/Makefile.linux 2009-05-08 23:18:37.000000000 -0400
+++ ppp-2.4.3/pppd/Makefile.linux 2007-06-04 13:22:11.837055776 +0200
@@ -48,21 +48,21 @@ @@ -48,21 +48,21 @@
# Uncomment the next line to include support for PPP packet filtering. # Uncomment the next line to include support for PPP packet filtering.
# This requires that the libpcap library and headers be installed # This requires that the libpcap library and headers be installed
@ -36,19 +35,15 @@ Index: ppp-2.4.3/pppd/Makefile.linux
-COMPILE_FLAGS= -DHAVE_PATHS_H -DIPX_CHANGE -DHAVE_MMAP -COMPILE_FLAGS= -DHAVE_PATHS_H -DIPX_CHANGE -DHAVE_MMAP
+COMPILE_FLAGS= -DHAVE_PATHS_H -DHAVE_MMAP +COMPILE_FLAGS= -DHAVE_PATHS_H -DHAVE_MMAP
CFLAGS= $(COPTS) $(COMPILE_FLAGS) $(INCLUDE_DIRS) CFLAGS= $(COPTS) $(COMPILE_FLAGS) $(INCLUDE_DIRS) '-DDESTDIR="@DESTDIR@"'
@@ -117,12 +117,12 @@ @@ -117,10 +117,10 @@
#LIBS += -lshadow $(LIBS) #LIBS += -lshadow $(LIBS)
endif endif
-ifneq ($(wildcard /usr/include/crypt.h),) -ifneq ($(wildcard /usr/include/crypt.h),)
+#ifneq ($(wildcard /usr/include/crypt.h),) +#ifneq ($(wildcard /usr/include/crypt.h),)
CFLAGS += -DHAVE_CRYPT_H=1 CFLAGS += -DHAVE_CRYPT_H=1
-endif
-ifneq ($(wildcard /usr/lib/libcrypt.*),)
+#endif
+#ifneq ($(wildcard /usr/lib/libcrypt.*),)
LIBS += -lcrypt LIBS += -lcrypt
-endif -endif
+#endif +#endif

View file

@ -1,7 +1,6 @@
Index: ppp-2.4.3/include/linux/ppp-comp.h diff -Naur ppp-2.4.4.orig/include/linux/ppp-comp.h ppp-2.4.4/include/linux/ppp-comp.h
=================================================================== --- ppp-2.4.4.orig/include/linux/ppp-comp.h 2009-05-09 03:44:09.000000000 -0400
--- ppp-2.4.3.orig/include/linux/ppp-comp.h 2007-06-04 13:22:08.143617264 +0200 +++ ppp-2.4.4/include/linux/ppp-comp.h 2009-05-09 03:45:52.000000000 -0400
+++ ppp-2.4.3/include/linux/ppp-comp.h 2007-06-04 13:22:12.031026288 +0200
@@ -36,7 +36,7 @@ @@ -36,7 +36,7 @@
*/ */
@ -63,10 +62,9 @@ Index: ppp-2.4.3/include/linux/ppp-comp.h
/* /*
* Definitions for other, as yet unsupported, compression methods. * Definitions for other, as yet unsupported, compression methods.
*/ */
Index: ppp-2.4.3/include/net/ppp-comp.h diff -Naur ppp-2.4.4.orig/include/net/ppp-comp.h ppp-2.4.4/include/net/ppp-comp.h
=================================================================== --- ppp-2.4.4.orig/include/net/ppp-comp.h 2009-05-09 03:44:09.000000000 -0400
--- ppp-2.4.3.orig/include/net/ppp-comp.h 2007-06-04 13:22:08.150616200 +0200 +++ ppp-2.4.4/include/net/ppp-comp.h 2009-05-09 03:45:52.000000000 -0400
+++ ppp-2.4.3/include/net/ppp-comp.h 2007-06-04 13:22:12.031026288 +0200
@@ -255,6 +255,33 @@ @@ -255,6 +255,33 @@
opts |= MPPE_OPT_UNKNOWN; \ opts |= MPPE_OPT_UNKNOWN; \
} while (/* CONSTCOND */ 0) } while (/* CONSTCOND */ 0)
@ -101,10 +99,9 @@ Index: ppp-2.4.3/include/net/ppp-comp.h
/* /*
* Definitions for other, as yet unsupported, compression methods. * Definitions for other, as yet unsupported, compression methods.
*/ */
Index: ppp-2.4.3/pppd/ccp.c diff -Naur ppp-2.4.4.orig/pppd/ccp.c ppp-2.4.4/pppd/ccp.c
=================================================================== --- ppp-2.4.4.orig/pppd/ccp.c 2009-05-09 03:44:09.000000000 -0400
--- ppp-2.4.3.orig/pppd/ccp.c 2007-06-04 13:22:08.157615136 +0200 +++ ppp-2.4.4/pppd/ccp.c 2009-05-09 03:45:52.000000000 -0400
+++ ppp-2.4.3/pppd/ccp.c 2007-06-04 13:22:12.033025984 +0200
@@ -62,12 +62,10 @@ @@ -62,12 +62,10 @@
static char bsd_value[8]; static char bsd_value[8];
static char deflate_value[8]; static char deflate_value[8];
@ -720,8 +717,8 @@ Index: ppp-2.4.3/pppd/ccp.c
*/ */
static int static int
ccp_nakci(f, p, len, treat_as_reject) ccp_nakci(f, p, len, treat_as_reject)
@@ -900,6 +1079,8 @@ @@ -901,6 +1080,8 @@
int len; int treat_as_reject;
{ {
ccp_options *go = &ccp_gotoptions[f->unit]; ccp_options *go = &ccp_gotoptions[f->unit];
+ ccp_options *ao = &ccp_allowoptions[f->unit]; + ccp_options *ao = &ccp_allowoptions[f->unit];
@ -729,7 +726,7 @@ Index: ppp-2.4.3/pppd/ccp.c
ccp_options no; /* options we've seen already */ ccp_options no; /* options we've seen already */
ccp_options try; /* options to ask for next time */ ccp_options try; /* options to ask for next time */
@@ -907,28 +1088,100 @@ @@ -908,28 +1089,100 @@
try = *go; try = *go;
#ifdef MPPE #ifdef MPPE
@ -848,7 +845,7 @@ Index: ppp-2.4.3/pppd/ccp.c
if (go->deflate && len >= CILEN_DEFLATE if (go->deflate && len >= CILEN_DEFLATE
&& p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT) && p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
&& p[1] == CILEN_DEFLATE) { && p[1] == CILEN_DEFLATE) {
@@ -1001,14 +1254,50 @@ @@ -1002,14 +1255,50 @@
return -1; return -1;
#ifdef MPPE #ifdef MPPE
@ -903,7 +900,7 @@ Index: ppp-2.4.3/pppd/ccp.c
if (go->deflate_correct && len >= CILEN_DEFLATE if (go->deflate_correct && len >= CILEN_DEFLATE
&& p[0] == CI_DEFLATE && p[1] == CILEN_DEFLATE) { && p[0] == CI_DEFLATE && p[1] == CILEN_DEFLATE) {
if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size) if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
@@ -1072,14 +1361,15 @@ @@ -1073,14 +1362,15 @@
int dont_nak; int dont_nak;
{ {
int ret, newret, res; int ret, newret, res;
@ -923,42 +920,34 @@ Index: ppp-2.4.3/pppd/ccp.c
ret = CONFACK; ret = CONFACK;
retp = p0 = p; retp = p0 = p;
@@ -1102,103 +1392,305 @@ @@ -1103,106 +1393,302 @@
switch (type) { switch (type) {
#ifdef MPPE #ifdef MPPE
case CI_MPPE: case CI_MPPE:
- if (!ao->mppe || clen != CILEN_MPPE) { - if (!ao->mppe || clen != CILEN_MPPE) {
+ if ((!ao->mppc && !ao->mppe) || clen != CILEN_MPPE) { + if ((!ao->mppc && !ao->mppe) || clen != CILEN_MPPE) {
newret = CONFREJ; newret = CONFREJ;
break; break;
} }
- MPPE_CI_TO_OPTS(&p[2], ho->mppe); - MPPE_CI_TO_OPTS(&p[2], ho->mppe);
-
- /* Nak if anything unsupported or unknown are set. */ - /* Nak if anything unsupported or unknown are set. */
- if (ho->mppe & MPPE_OPT_UNSUPPORTED) { - if (ho->mppe & MPPE_OPT_UNSUPPORTED) {
- newret = CONFNAK; + p2 = p[2];
+ p5 = p[5];
+ /* not sure what they want, tell 'em what we got */
+ if (((p[2] & ~MPPE_STATELESS) != 0 || p[3] != 0 || p[4] != 0 ||
+ (p[5] & ~(MPPE_40BIT | MPPE_56BIT | MPPE_128BIT |
+ MPPE_MPPC)) != 0 || p[5] == 0) ||
+ (p[2] == 0 && p[3] == 0 && p[4] == 0 && p[5] == 0)) {
newret = CONFNAK;
- ho->mppe &= ~MPPE_OPT_UNSUPPORTED; - ho->mppe &= ~MPPE_OPT_UNSUPPORTED;
- } - }
- if (ho->mppe & MPPE_OPT_UNKNOWN) { - if (ho->mppe & MPPE_OPT_UNKNOWN) {
+ p2 = p[2]; - newret = CONFNAK;
+ p5 = p[5];
+ /* not sure what they want, tell 'em what we got */
+ if (((p[2] & ~MPPE_STATELESS) != 0 || p[3] != 0 || p[4] != 0 ||
+ (p[5] & ~(MPPE_40BIT | MPPE_56BIT | MPPE_128BIT |
+ MPPE_MPPC)) != 0 || p[5] == 0) ||
+ (p[2] == 0 && p[3] == 0 && p[4] == 0 && p[5] == 0)) {
newret = CONFNAK;
- ho->mppe &= ~MPPE_OPT_UNKNOWN; - ho->mppe &= ~MPPE_OPT_UNKNOWN;
+ p[2] = (wo->mppe_stateless ? MPPE_STATELESS : 0); - }
+ p[3] = 0; -
+ p[4] = 0;
+ p[5] = (wo->mppe_40 ? MPPE_40BIT : 0) |
+ (wo->mppe_56 ? MPPE_56BIT : 0) |
+ (wo->mppe_128 ? MPPE_128BIT : 0) |
+ (wo->mppc ? MPPE_MPPC : 0);
+ break;
}
- /* Check state opt */ - /* Check state opt */
- if (ho->mppe & MPPE_OPT_STATEFUL) { - if (ho->mppe & MPPE_OPT_STATEFUL) {
- /* - /*
@ -969,58 +958,43 @@ Index: ppp-2.4.3/pppd/ccp.c
- */ - */
- if (refuse_mppe_stateful) { - if (refuse_mppe_stateful) {
- error("Refusing MPPE stateful mode offered by peer"); - error("Refusing MPPE stateful mode offered by peer");
+ if ((p[5] & MPPE_MPPC)) { - newret = CONFREJ;
+ if (ao->mppc) {
+ ho->mppc = 1;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ opt_buf[2] = opt_buf[3] = opt_buf[4] = 0;
+ opt_buf[5] = MPPE_MPPC;
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE, 1) <= 0) {
+ ho->mppc = 0;
+ p[5] &= ~MPPE_MPPC;
+ newret = CONFNAK;
+ }
+ } else {
newret = CONFREJ;
- break; - break;
+ if (wo->mppe || ao->mppe) { + p[2] = (wo->mppe_stateless ? MPPE_STATELESS : 0);
+ p[5] &= ~MPPE_MPPC; + p[3] = 0;
+ newret = CONFNAK; + p[4] = 0;
+ } + p[5] = (wo->mppe_40 ? MPPE_40BIT : 0) |
+ } + (wo->mppe_56 ? MPPE_56BIT : 0) |
+ } + (wo->mppe_128 ? MPPE_128BIT : 0) |
+ (wo->mppc ? MPPE_MPPC : 0);
+ break;
+ }
+ +
+ if (ao->mppe) + if ((p[5] & MPPE_MPPC)) {
+ ho->mppe = 1; + if (ao->mppc) {
+ + ho->mppc = 1;
+ if ((p[2] & MPPE_STATELESS)) { + BCOPY(p, opt_buf, CILEN_MPPE);
+ if (ao->mppe_stateless) { + opt_buf[2] = opt_buf[3] = opt_buf[4] = 0;
+ if (wo->mppe_stateless) + opt_buf[5] = MPPE_MPPC;
+ ho->mppe_stateless = 1; + if (ccp_test(f->unit, opt_buf, CILEN_MPPE, 1) <= 0) {
+ else { + ho->mppc = 0;
+ newret = CONFNAK; + p[5] &= ~MPPE_MPPC;
+ if (!dont_nak) + newret = CONFNAK;
+ p[2] &= ~MPPE_STATELESS; + }
+ } + } else {
+ } else { + newret = CONFREJ;
+ newret = CONFNAK; + if (wo->mppe || ao->mppe) {
+ if (!dont_nak) + p[5] &= ~MPPE_MPPC;
+ p[2] &= ~MPPE_STATELESS; + newret = CONFNAK;
+ } + }
+ } else {
+ if (wo->mppe_stateless && !dont_nak) {
+ wo->mppe_stateless = 0;
+ newret = CONFNAK;
+ p[2] |= MPPE_STATELESS;
} }
} }
-
- /* Find out which of {S,L} are set. */ - /* Find out which of {S,L} are set. */
- if ((ho->mppe & MPPE_OPT_128) - if ((ho->mppe & MPPE_OPT_128)
- && (ho->mppe & MPPE_OPT_40)) { - && (ho->mppe & MPPE_OPT_40)) {
- /* Both are set, negotiate the strongest. */ - /* Both are set, negotiate the strongest. */
+ if ((p[5] & ~MPPE_MPPC) == (MPPE_40BIT|MPPE_56BIT|MPPE_128BIT)) { - newret = CONFNAK;
newret = CONFNAK;
- if (ao->mppe & MPPE_OPT_128) - if (ao->mppe & MPPE_OPT_128)
- ho->mppe &= ~MPPE_OPT_40; - ho->mppe &= ~MPPE_OPT_40;
- else if (ao->mppe & MPPE_OPT_40) - else if (ao->mppe & MPPE_OPT_40)
@ -1028,179 +1002,200 @@ Index: ppp-2.4.3/pppd/ccp.c
- else { - else {
- newret = CONFREJ; - newret = CONFREJ;
- break; - break;
+ if (ao->mppe_128) { - }
+ ho->mppe_128 = 1;
+ p[5] &= ~(MPPE_40BIT|MPPE_56BIT);
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_128 = 0;
+ p[5] |= (MPPE_40BIT|MPPE_56BIT);
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_56_40;
+ }
+ goto check_mppe;
}
- } else if (ho->mppe & MPPE_OPT_128) { - } else if (ho->mppe & MPPE_OPT_128) {
- if (!(ao->mppe & MPPE_OPT_128)) { - if (!(ao->mppe & MPPE_OPT_128)) {
- newret = CONFREJ; - newret = CONFREJ;
- break; - break;
+ p[5] &= ~MPPE_128BIT; - }
+ goto check_mppe_56_40;
+ }
+ if ((p[5] & ~MPPE_MPPC) == (MPPE_56BIT|MPPE_128BIT)) {
+ newret = CONFNAK;
+ if (ao->mppe_128) {
+ ho->mppe_128 = 1;
+ p[5] &= ~MPPE_56BIT;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_128 = 0;
+ p[5] |= MPPE_56BIT;
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_56;
+ }
+ goto check_mppe;
}
- } else if (ho->mppe & MPPE_OPT_40) { - } else if (ho->mppe & MPPE_OPT_40) {
- if (!(ao->mppe & MPPE_OPT_40)) { - if (!(ao->mppe & MPPE_OPT_40)) {
- newret = CONFREJ; - newret = CONFREJ;
- break; - break;
+ p[5] &= ~MPPE_128BIT; - }
+ goto check_mppe_56; + if (ao->mppe)
+ } + ho->mppe = 1;
+ if ((p[5] & ~MPPE_MPPC) == (MPPE_40BIT|MPPE_128BIT)) {
+ newret = CONFNAK;
+ if (ao->mppe_128) {
+ ho->mppe_128 = 1;
+ p[5] &= ~MPPE_40BIT;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_128 = 0;
+ p[5] |= MPPE_40BIT;
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_40;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_40;
+ }
+ if ((p[5] & ~MPPE_MPPC) == MPPE_128BIT) {
+ if (ao->mppe_128) {
+ ho->mppe_128 = 1;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_128 = 0;
+ p[5] &= ~MPPE_128BIT;
+ newret = CONFNAK;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_128BIT;
+ newret = CONFNAK;
+ goto check_mppe;
+ }
+ check_mppe_56_40:
+ if ((p[5] & ~MPPE_MPPC) == (MPPE_40BIT|MPPE_56BIT)) {
+ newret = CONFNAK;
+ if (ao->mppe_56) {
+ ho->mppe_56 = 1;
+ p[5] &= ~MPPE_40BIT;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_56 = 0;
+ p[5] |= MPPE_40BIT;
+ p[5] &= ~MPPE_56BIT;
+ newret = CONFNAK;
+ goto check_mppe_40;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_56BIT;
+ goto check_mppe_40;
+ }
+ check_mppe_56:
+ if ((p[5] & ~MPPE_MPPC) == MPPE_56BIT) {
+ if (ao->mppe_56) {
+ ho->mppe_56 = 1;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_56 = 0;
+ p[5] &= ~MPPE_56BIT;
+ newret = CONFNAK;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_56BIT;
+ newret = CONFNAK;
+ goto check_mppe;
+ }
+ check_mppe_40:
+ if ((p[5] & ~MPPE_MPPC) == MPPE_40BIT) {
+ if (ao->mppe_40) {
+ ho->mppe_40 = 1;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_40 = 0;
+ p[5] &= ~MPPE_40BIT;
+ newret = CONFNAK;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_40BIT;
+ }
+ +
+ check_mppe: + if ((p[2] & MPPE_STATELESS)) {
+ if (!ho->mppe_40 && !ho->mppe_56 && !ho->mppe_128) { + if (ao->mppe_stateless) {
+ if (wo->mppe_40 || wo->mppe_56 || wo->mppe_128) { + if (wo->mppe_stateless)
+ newret = CONFNAK; + ho->mppe_stateless = 1;
+ p[2] |= (wo->mppe_stateless ? MPPE_STATELESS : 0); + else {
+ newret = CONFNAK;
+ if (!dont_nak)
+ p[2] &= ~MPPE_STATELESS;
+ }
+ } else {
+ newret = CONFNAK;
+ if (!dont_nak)
+ p[2] &= ~MPPE_STATELESS;
+ }
+ } else {
+ if (wo->mppe_stateless && !dont_nak) {
+ wo->mppe_stateless = 0;
+ newret = CONFNAK;
+ p[2] |= MPPE_STATELESS;
+ }
+ }
+
+ if ((p[5] & ~MPPE_MPPC) == (MPPE_40BIT|MPPE_56BIT|MPPE_128BIT)) {
+ newret = CONFNAK;
+ if (ao->mppe_128) {
+ ho->mppe_128 = 1;
+ p[5] &= ~(MPPE_40BIT|MPPE_56BIT);
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_128 = 0;
+ p[5] |= (MPPE_40BIT|MPPE_56BIT);
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_56_40;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_56_40;
+ }
+ if ((p[5] & ~MPPE_MPPC) == (MPPE_56BIT|MPPE_128BIT)) {
+ newret = CONFNAK;
+ if (ao->mppe_128) {
+ ho->mppe_128 = 1;
+ p[5] &= ~MPPE_56BIT;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_128 = 0;
+ p[5] |= MPPE_56BIT;
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_56;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_56;
+ }
+ if ((p[5] & ~MPPE_MPPC) == (MPPE_40BIT|MPPE_128BIT)) {
+ newret = CONFNAK;
+ if (ao->mppe_128) {
+ ho->mppe_128 = 1;
+ p[5] &= ~MPPE_40BIT;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_128 = 0;
+ p[5] |= MPPE_40BIT;
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_40;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_128BIT;
+ goto check_mppe_40;
+ }
+ if ((p[5] & ~MPPE_MPPC) == MPPE_128BIT) {
+ if (ao->mppe_128) {
+ ho->mppe_128 = 1;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_128 = 0;
+ p[5] &= ~MPPE_128BIT;
+ newret = CONFNAK;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_128BIT;
+ newret = CONFNAK;
+ goto check_mppe;
+ }
+ check_mppe_56_40:
+ if ((p[5] & ~MPPE_MPPC) == (MPPE_40BIT|MPPE_56BIT)) {
+ newret = CONFNAK;
+ if (ao->mppe_56) {
+ ho->mppe_56 = 1;
+ p[5] &= ~MPPE_40BIT;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_56 = 0;
+ p[5] |= MPPE_40BIT;
+ p[5] &= ~MPPE_56BIT;
+ newret = CONFNAK;
+ goto check_mppe_40;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_56BIT;
+ goto check_mppe_40;
+ }
+ check_mppe_56:
+ if ((p[5] & ~MPPE_MPPC) == MPPE_56BIT) {
+ if (ao->mppe_56) {
+ ho->mppe_56 = 1;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_56 = 0;
+ p[5] &= ~MPPE_56BIT;
+ newret = CONFNAK;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_56BIT;
+ newret = CONFNAK;
+ goto check_mppe;
+ }
+ check_mppe_40:
+ if ((p[5] & ~MPPE_MPPC) == MPPE_40BIT) {
+ if (ao->mppe_40) {
+ ho->mppe_40 = 1;
+ BCOPY(p, opt_buf, CILEN_MPPE);
+ BCOPY(mppe_send_key, &opt_buf[CILEN_MPPE],
+ MPPE_MAX_KEY_LEN);
+ if (ccp_test(f->unit, opt_buf, CILEN_MPPE +
+ MPPE_MAX_KEY_LEN, 1) <= 0) {
+ ho->mppe_40 = 0;
+ p[5] &= ~MPPE_40BIT;
+ newret = CONFNAK;
+ }
+ goto check_mppe;
+ }
+ p[5] &= ~MPPE_40BIT;
+ }
+
+ check_mppe:
+ if (!ho->mppe_40 && !ho->mppe_56 && !ho->mppe_128) {
+ if (wo->mppe_40 || wo->mppe_56 || wo->mppe_128) {
+ newret = CONFNAK;
+ p[2] |= (wo->mppe_stateless ? MPPE_STATELESS : 0);
+ p[5] |= (wo->mppe_40 ? MPPE_40BIT : 0) | + p[5] |= (wo->mppe_40 ? MPPE_40BIT : 0) |
+ (wo->mppe_56 ? MPPE_56BIT : 0) | + (wo->mppe_56 ? MPPE_56BIT : 0) |
+ (wo->mppe_128 ? MPPE_128BIT : 0) | + (wo->mppe_128 ? MPPE_128BIT : 0) |
+ (wo->mppc ? MPPE_MPPC : 0); + (wo->mppc ? MPPE_MPPC : 0);
+ } else { + } else {
+ ho->mppe = ho->mppe_stateless = 0; + ho->mppe = ho->mppe_stateless = 0;
} + }
} else { } else {
- /* Neither are set. */ - /* Neither are set. */
+ /* MPPE is not compatible with other compression types */ - /* We cannot accept this. */
+ if (wo->mppe) { - newret = CONFNAK;
+ ao->bsd_compress = 0; - /* Give the peer our idea of what can be used,
+ ao->predictor_1 = 0; - so it can choose and confirm */
+ ao->predictor_2 = 0; - ho->mppe = ao->mppe;
+ ao->deflate = 0; - }
+ ao->lzs = 0; -
+ }
+ }
+ if ((!ho->mppc || !ao->mppc) && !ho->mppe) {
+ p[2] = p2;
+ p[5] = p5;
newret = CONFREJ;
break;
}
- /* rebuild the opts */ - /* rebuild the opts */
- MPPE_OPTS_TO_CI(ho->mppe, &p[2]); - MPPE_OPTS_TO_CI(ho->mppe, &p[2]);
- if (newret == CONFACK) { - if (newret == CONFACK) {
@ -1229,79 +1224,99 @@ Index: ppp-2.4.3/pppd/ccp.c
- else - else
- newret = CONFREJ; - newret = CONFREJ;
- } - }
+ /* -
+ * I have commented the code below because according to RFC1547 - /*
+ * MTU is only information for higher level protocols about
+ * "the maximum allowable length for a packet (q.v.) transmitted
+ * over a point-to-point link without incurring network layer
+ * fragmentation." Of course a PPP implementation should be able
+ * to handle overhead added by MPPE - in our case apropriate code
+ * is located in drivers/net/ppp_generic.c in the kernel sources.
+ *
+ * According to RFC1661:
+ * - when negotiated MRU is less than 1500 octets, a PPP
+ * implementation must still be able to receive at least 1500
+ * octets,
+ * - when PFC is negotiated, a PPP implementation is still
+ * required to receive frames with uncompressed protocol field.
+ *
+ * So why not to handle MPPE overhead without changing MTU value?
+ * I am sure that RFC3078, unfortunately silently, assumes that.
+ */
/*
- * We have accepted MPPE or are willing to negotiate - * We have accepted MPPE or are willing to negotiate
- * MPPE parameters. A CONFREJ is due to subsequent - * MPPE parameters. A CONFREJ is due to subsequent
- * (non-MPPE) processing. - * (non-MPPE) processing.
+ * We need to decrease the interface MTU by MPPE_PAD - */
+ * because MPPE frames **grow**. The kernel [must]
+ * allocate MPPE_PAD extra bytes in xmit buffers.
*/
- rej_for_ci_mppe = 0; - rej_for_ci_mppe = 0;
+/* - break;
+ mtu = netif_get_mtu(f->unit); -#endif /* MPPE */
+ if (mtu) { + /* MPPE is not compatible with other compression types */
+ netif_set_mtu(f->unit, mtu - MPPE_PAD); + if (wo->mppe) {
+ } else { + ao->bsd_compress = 0;
+ ao->predictor_1 = 0;
+ ao->predictor_2 = 0;
+ ao->deflate = 0;
+ ao->lzs = 0;
+ }
+ }
+ if ((!ho->mppc || !ao->mppc) && !ho->mppe) {
+ p[2] = p2;
+ p[5] = p5;
+ newret = CONFREJ;
+ break;
+ }
+
+ /*
+ * I have commented the code below because according to RFC1547
+ * MTU is only information for higher level protocols about
+ * "the maximum allowable length for a packet (q.v.) transmitted
+ * over a point-to-point link without incurring network layer
+ * fragmentation." Of course a PPP implementation should be able
+ * to handle overhead added by MPPE - in our case apropriate code
+ * is located in drivers/net/ppp_generic.c in the kernel sources.
+ *
+ * According to RFC1661:
+ * - when negotiated MRU is less than 1500 octets, a PPP
+ * implementation must still be able to receive at least 1500
+ * octets,
+ * - when PFC is negotiated, a PPP implementation is still
+ * required to receive frames with uncompressed protocol field.
+ *
+ * So why not to handle MPPE overhead without changing MTU value?
+ * I am sure that RFC3078, unfortunately silently, assumes that.
+ */
+
+ /*
+ * We need to decrease the interface MTU by MPPE_PAD
+ * because MPPE frames **grow**. The kernel [must]
+ * allocate MPPE_PAD extra bytes in xmit buffers.
+ */
+ /*
+ mtu = netif_get_mtu(f->unit);
+ if (mtu) {
+ netif_set_mtu(f->unit, mtu - MPPE_PAD);
+ } else {
+ newret = CONFREJ; + newret = CONFREJ;
+ if (ccp_wantoptions[f->unit].mppe) { + if (ccp_wantoptions[f->unit].mppe) {
+ error("Cannot adjust MTU needed by MPPE."); + error("Cannot adjust MTU needed by MPPE.");
+ lcp_close(f->unit, "Cannot adjust MTU needed by MPPE."); + lcp_close(f->unit, "Cannot adjust MTU needed by MPPE.");
+ } + }
+ } + }
+*/ + */
break; + break;
#endif /* MPPE */ + #endif /* MPPE */
+ +
+ case CI_LZS: + case CI_LZS:
+ if (!ao->lzs || clen != CILEN_LZS) { + if (!ao->lzs || clen != CILEN_LZS) {
+ newret = CONFREJ; + newret = CONFREJ;
+ break; + break;
+ } + }
+ +
+ ho->lzs = 1; + ho->lzs = 1;
+ ho->lzs_hists = (p[2] << 8) | p[3]; + ho->lzs_hists = (p[2] << 8) | p[3];
+ ho->lzs_mode = p[4]; + ho->lzs_mode = p[4];
+ if ((ho->lzs_hists != ao->lzs_hists) || + if ((ho->lzs_hists != ao->lzs_hists) ||
+ (ho->lzs_mode != ao->lzs_mode)) { + (ho->lzs_mode != ao->lzs_mode)) {
+ newret = CONFNAK; + newret = CONFNAK;
+ if (!dont_nak) { + if (!dont_nak) {
+ p[2] = ao->lzs_hists >> 8; + p[2] = ao->lzs_hists >> 8;
+ p[3] = ao->lzs_hists & 0xff; + p[3] = ao->lzs_hists & 0xff;
+ p[4] = ao->lzs_mode; + p[4] = ao->lzs_mode;
+ } else + } else
+ break; + break;
+ } + }
+
+ if (p == p0 && ccp_test(f->unit, p, CILEN_LZS, 1) <= 0) {
+ newret = CONFREJ;
+ }
+ break;
+ +
+ if (p == p0 && ccp_test(f->unit, p, CILEN_LZS, 1) <= 0) {
+ newret = CONFREJ;
+ }
+ break;
case CI_DEFLATE: case CI_DEFLATE:
case CI_DEFLATE_DRAFT: case CI_DEFLATE_DRAFT:
if (!ao->deflate || clen != CILEN_DEFLATE if (!ao->deflate || clen != CILEN_DEFLATE
@@ -1340,12 +1832,6 @@ @@ -1344,12 +1830,6 @@
else else
*lenp = retp - p0; *lenp = retp - p0;
} }
@ -1314,7 +1329,7 @@ Index: ppp-2.4.3/pppd/ccp.c
return ret; return ret;
} }
@@ -1367,24 +1853,35 @@ @@ -1371,24 +1851,35 @@
char *p = result; char *p = result;
char *q = result + sizeof(result); /* 1 past result */ char *q = result + sizeof(result); /* 1 past result */
@ -1366,7 +1381,7 @@ Index: ppp-2.4.3/pppd/ccp.c
case CI_DEFLATE: case CI_DEFLATE:
case CI_DEFLATE_DRAFT: case CI_DEFLATE_DRAFT:
if (opt2 != NULL && opt2->deflate_size != opt->deflate_size) if (opt2 != NULL && opt2->deflate_size != opt->deflate_size)
@@ -1440,12 +1937,12 @@ @@ -1444,12 +1935,12 @@
} else if (ANY_COMPRESS(*ho)) } else if (ANY_COMPRESS(*ho))
notice("%s transmit compression enabled", method_name(ho, NULL)); notice("%s transmit compression enabled", method_name(ho, NULL));
#ifdef MPPE #ifdef MPPE
@ -1381,7 +1396,7 @@ Index: ppp-2.4.3/pppd/ccp.c
} }
/* /*
@@ -1468,7 +1965,7 @@ @@ -1472,7 +1963,7 @@
lcp_close(f->unit, "MPPE disabled"); lcp_close(f->unit, "MPPE disabled");
} }
} }
@ -1390,7 +1405,7 @@ Index: ppp-2.4.3/pppd/ccp.c
} }
/* /*
@@ -1528,24 +2025,28 @@ @@ -1532,24 +2023,28 @@
#ifdef MPPE #ifdef MPPE
case CI_MPPE: case CI_MPPE:
if (optlen >= CILEN_MPPE) { if (optlen >= CILEN_MPPE) {
@ -1431,7 +1446,7 @@ Index: ppp-2.4.3/pppd/ccp.c
case CI_DEFLATE: case CI_DEFLATE:
case CI_DEFLATE_DRAFT: case CI_DEFLATE_DRAFT:
if (optlen >= CILEN_DEFLATE) { if (optlen >= CILEN_DEFLATE) {
@@ -1631,6 +2132,7 @@ @@ -1635,6 +2130,7 @@
error("Lost compression sync: disabling compression"); error("Lost compression sync: disabling compression");
ccp_close(unit, "Lost compression sync"); ccp_close(unit, "Lost compression sync");
#ifdef MPPE #ifdef MPPE
@ -1439,7 +1454,7 @@ Index: ppp-2.4.3/pppd/ccp.c
/* /*
* If we were doing MPPE, we must also take the link down. * If we were doing MPPE, we must also take the link down.
*/ */
@@ -1638,9 +2140,18 @@ @@ -1642,9 +2138,18 @@
error("Too many MPPE errors, closing LCP"); error("Too many MPPE errors, closing LCP");
lcp_close(unit, "Too many MPPE errors"); lcp_close(unit, "Too many MPPE errors");
} }
@ -1459,15 +1474,14 @@ Index: ppp-2.4.3/pppd/ccp.c
* Send a reset-request to reset the peer's compressor. * Send a reset-request to reset the peer's compressor.
* We don't do that if we are still waiting for an * We don't do that if we are still waiting for an
* acknowledgement to a previous reset-request. * acknowledgement to a previous reset-request.
@@ -1671,4 +2182,3 @@ @@ -1675,4 +2180,3 @@
} else } else
ccp_localstate[f->unit] &= ~RACK_PENDING; ccp_localstate[f->unit] &= ~RACK_PENDING;
} }
- -
Index: ppp-2.4.3/pppd/ccp.h diff -Naur ppp-2.4.4.orig/pppd/ccp.h ppp-2.4.4/pppd/ccp.h
=================================================================== --- ppp-2.4.4.orig/pppd/ccp.h 2009-05-09 03:44:09.000000000 -0400
--- ppp-2.4.3.orig/pppd/ccp.h 2007-06-04 13:22:08.162614376 +0200 +++ ppp-2.4.4/pppd/ccp.h 2009-05-09 03:45:52.000000000 -0400
+++ ppp-2.4.3/pppd/ccp.h 2007-06-04 13:22:12.033025984 +0200
@@ -37,9 +37,17 @@ @@ -37,9 +37,17 @@
bool predictor_2; /* do Predictor-2? */ bool predictor_2; /* do Predictor-2? */
bool deflate_correct; /* use correct code for deflate? */ bool deflate_correct; /* use correct code for deflate? */
@ -1486,11 +1500,10 @@ Index: ppp-2.4.3/pppd/ccp.h
short method; /* code for chosen compression method */ short method; /* code for chosen compression method */
} ccp_options; } ccp_options;
Index: ppp-2.4.3/pppd/chap_ms.c diff -Naur ppp-2.4.4.orig/pppd/chap_ms.c ppp-2.4.4/pppd/chap_ms.c
=================================================================== --- ppp-2.4.4.orig/pppd/chap_ms.c 2009-05-09 03:45:07.000000000 -0400
--- ppp-2.4.3.orig/pppd/chap_ms.c 2007-06-04 13:22:08.168613464 +0200 +++ ppp-2.4.4/pppd/chap_ms.c 2009-05-09 03:45:52.000000000 -0400
+++ ppp-2.4.3/pppd/chap_ms.c 2007-06-04 13:22:12.033025984 +0200 @@ -897,13 +897,17 @@
@@ -895,13 +895,17 @@
/* /*
* Disable undesirable encryption types. Note that we don't ENABLE * Disable undesirable encryption types. Note that we don't ENABLE
* any encryption types, to avoid overriding manual configuration. * any encryption types, to avoid overriding manual configuration.
@ -1510,82 +1523,3 @@ Index: ppp-2.4.3/pppd/chap_ms.c
break; break;
default: default:
break; break;
Index: ppp-2.4.3/pppd/pppd.8
===================================================================
--- ppp-2.4.3.orig/pppd/pppd.8 2007-06-04 13:22:08.175612400 +0200
+++ ppp-2.4.3/pppd/pppd.8 2007-06-04 13:22:12.034025832 +0200
@@ -622,9 +622,29 @@
Enables the use of PPP multilink; this is an alias for the `multilink'
option. This option is currently only available under Linux.
.TP
-.B mppe\-stateful
-Allow MPPE to use stateful mode. Stateless mode is still attempted first.
-The default is to disallow stateful mode.
+.B mppc
+Enables MPPC (Microsoft Point to Point Compression). This is the default.
+.TP
+.B mppe \fIsubopt1[,subopt2[,subopt3[..]]]
+Modify MPPE (Microsoft Point to Point Encryption) parameters. In order
+for MPPE to successfully come up, you must have authenticated with either
+MS-CHAP or MS-CHAPv2. By default MPPE is optional, it means that pppd will
+not propose MPPE to the peer, but will negotiate MPPE if peer wants that.
+You can change this using \fIrequired\fR suboption.
+This option is presently only supported under Linux, and only if your
+kernel has been configured to include MPPE support.
+.IP
+MPPE suboptions:
+.br
+\fIrequired\fR - require MPPE; disconnect if peer doesn't support it,
+.br
+\fIstateless\fR - try to negotiate stateless mode; default is stateful,
+.br
+\fIno40\fR - disable 40 bit keys,
+.br
+\fIno56\fR - disable 56 bit keys,
+.br
+\fIno128\fR - disable 128 bit keys
.TP
.B mpshortseq
Enables the use of short (12-bit) sequence numbers in multilink
@@ -757,17 +777,11 @@
Disables the use of PPP multilink. This option is currently only
available under Linux.
.TP
-.B nomppe
-Disables MPPE (Microsoft Point to Point Encryption). This is the default.
-.TP
-.B nomppe\-40
-Disable 40-bit encryption with MPPE.
+.B nomppc
+Disables MPPC (Microsoft Point to Point Compression).
.TP
-.B nomppe\-128
-Disable 128-bit encryption with MPPE.
-.TP
-.B nomppe\-stateful
-Disable MPPE stateful mode. This is the default.
+.B nomppe
+Disables MPPE (Microsoft Point to Point Encryption).
.TP
.B nompshortseq
Disables the use of short (12-bit) sequence numbers in the PPP
@@ -948,19 +962,6 @@
Require the peer to authenticate itself using CHAP [Challenge
Handshake Authentication Protocol] authentication.
.TP
-.B require\-mppe
-Require the use of MPPE (Microsoft Point to Point Encryption). This
-option disables all other compression types. This option enables
-both 40-bit and 128-bit encryption. In order for MPPE to successfully
-come up, you must have authenticated with either MS\-CHAP or MS\-CHAPv2.
-This option is presently only supported under Linux, and only if your
-kernel has been configured to include MPPE support.
-.TP
-.B require\-mppe\-40
-Require the use of MPPE, with 40-bit encryption.
-.TP
-.B require\-mppe\-128
-Require the use of MPPE, with 128-bit encryption.
.TP
.B require\-mschap
Require the peer to authenticate itself using MS\-CHAP [Microsoft Challenge

View file

@ -1,13 +0,0 @@
Index: ppp-2.4.3/pppd/plugins/pppoatm/pppoatm.c
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/pppoatm/pppoatm.c 2007-06-04 13:22:11.014180872 +0200
+++ ppp-2.4.3/pppd/plugins/pppoatm/pppoatm.c 2007-06-04 13:22:12.281988136 +0200
@@ -136,8 +136,6 @@
int fd;
struct atm_qos qos;
- system ("/sbin/modprobe pppoatm");
-
if (!device_got_set)
no_device_given_pppoatm();
fd = socket(AF_ATMPVC, SOCK_DGRAM, 0);

View file

@ -0,0 +1,172 @@
diff -Naur ppp-2.4.4.orig/chat/Makefile.linux ppp-2.4.4/chat/Makefile.linux
--- ppp-2.4.4.orig/chat/Makefile.linux 2006-06-04 01:07:46.000000000 -0400
+++ ppp-2.4.4/chat/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -25,7 +25,7 @@
install: chat
mkdir -p $(BINDIR) $(MANDIR)
- $(INSTALL) -s -c chat $(BINDIR)
+ $(INSTALL) -c chat $(BINDIR)
$(INSTALL) -c -m 644 chat.8 $(MANDIR)
clean:
diff -Naur ppp-2.4.4.orig/pppd/Makefile.linux ppp-2.4.4/pppd/Makefile.linux
--- ppp-2.4.4.orig/pppd/Makefile.linux 2009-05-07 17:04:21.000000000 -0400
+++ ppp-2.4.4/pppd/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -99,7 +99,7 @@
CFLAGS += -DUSE_SRP -DOPENSSL -I/usr/local/ssl/include
LIBS += -lsrp -L/usr/local/ssl/lib -lcrypto
TARGETS += srp-entry
-EXTRAINSTALL = $(INSTALL) -s -c -m 555 srp-entry $(BINDIR)/srp-entry
+EXTRAINSTALL = $(INSTALL) -c -m 555 srp-entry $(BINDIR)/srp-entry
MANPAGES += srp-entry.8
EXTRACLEAN += srp-entry.o
NEEDDES=y
@@ -200,7 +200,7 @@
install: pppd
mkdir -p $(BINDIR) $(MANDIR)
$(EXTRAINSTALL)
- $(INSTALL) -s -c -m 555 pppd $(BINDIR)/pppd
+ $(INSTALL) -c -m 555 pppd $(BINDIR)/pppd
if chgrp pppusers $(BINDIR)/pppd 2>/dev/null; then \
chmod o-rx,u+s $(BINDIR)/pppd; fi
$(INSTALL) -c -m 444 pppd.8 $(MANDIR)
diff -Naur ppp-2.4.4.orig/pppd/plugins/radius/Makefile.linux ppp-2.4.4/pppd/plugins/radius/Makefile.linux
--- ppp-2.4.4.orig/pppd/plugins/radius/Makefile.linux 2006-06-04 01:04:14.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/radius/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -36,9 +36,9 @@
install: all
$(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -s -c -m 755 radius.so $(LIBDIR)
- $(INSTALL) -s -c -m 755 radattr.so $(LIBDIR)
- $(INSTALL) -s -c -m 755 radrealms.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radius.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radattr.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radrealms.so $(LIBDIR)
$(INSTALL) -c -m 444 pppd-radius.8 $(MANDIR)
$(INSTALL) -c -m 444 pppd-radattr.8 $(MANDIR)
diff -Naur ppp-2.4.4.orig/pppd/plugins/rp-pppoe/Makefile.linux ppp-2.4.4/pppd/plugins/rp-pppoe/Makefile.linux
--- ppp-2.4.4.orig/pppd/plugins/rp-pppoe/Makefile.linux 2009-05-07 17:02:45.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/rp-pppoe/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -39,9 +39,9 @@
install: all
$(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -s -c -m 4550 rp-pppoe.so $(LIBDIR)
+ $(INSTALL) -c -m 4550 rp-pppoe.so $(LIBDIR)
$(INSTALL) -d -m 755 $(BINDIR)
- $(INSTALL) -s -c -m 555 pppoe-discovery $(BINDIR)
+ $(INSTALL) -c -m 555 pppoe-discovery $(BINDIR)
clean:
rm -f *.o *.so
diff -Naur ppp-2.4.4.orig/pppdump/Makefile.linux ppp-2.4.4/pppdump/Makefile.linux
--- ppp-2.4.4.orig/pppdump/Makefile.linux 2006-06-04 01:04:14.000000000 -0400
+++ ppp-2.4.4/pppdump/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -17,5 +17,5 @@
install:
mkdir -p $(BINDIR) $(MANDIR)
- $(INSTALL) -s -c pppdump $(BINDIR)
+ $(INSTALL) -c pppdump $(BINDIR)
$(INSTALL) -c -m 444 pppdump.8 $(MANDIR)
diff -Naur ppp-2.4.4.orig/pppstats/Makefile.linux ppp-2.4.4/pppstats/Makefile.linux
--- ppp-2.4.4.orig/pppstats/Makefile.linux 2006-06-04 01:07:46.000000000 -0400
+++ ppp-2.4.4/pppstats/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -22,7 +22,7 @@
install: pppstats
-mkdir -p $(MANDIR)
- $(INSTALL) -s -c pppstats $(BINDIR)
+ $(INSTALL) -c pppstats $(BINDIR)
$(INSTALL) -c -m 444 pppstats.8 $(MANDIR)
pppstats: $(PPPSTATSRCS)
diff -Naur ppp-2.4.4.orig/chat/Makefile.linux ppp-2.4.4/chat/Makefile.linux
--- ppp-2.4.4.orig/chat/Makefile.linux 2006-06-04 01:07:46.000000000 -0400
+++ ppp-2.4.4/chat/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -25,7 +25,7 @@
install: chat
mkdir -p $(BINDIR) $(MANDIR)
- $(INSTALL) -s -c chat $(BINDIR)
+ $(INSTALL) -c chat $(BINDIR)
$(INSTALL) -c -m 644 chat.8 $(MANDIR)
clean:
diff -Naur ppp-2.4.4.orig/pppd/Makefile.linux ppp-2.4.4/pppd/Makefile.linux
--- ppp-2.4.4.orig/pppd/Makefile.linux 2009-05-07 17:04:21.000000000 -0400
+++ ppp-2.4.4/pppd/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -99,7 +99,7 @@
CFLAGS += -DUSE_SRP -DOPENSSL -I/usr/local/ssl/include
LIBS += -lsrp -L/usr/local/ssl/lib -lcrypto
TARGETS += srp-entry
-EXTRAINSTALL = $(INSTALL) -s -c -m 555 srp-entry $(BINDIR)/srp-entry
+EXTRAINSTALL = $(INSTALL) -c -m 555 srp-entry $(BINDIR)/srp-entry
MANPAGES += srp-entry.8
EXTRACLEAN += srp-entry.o
NEEDDES=y
@@ -200,7 +200,7 @@
install: pppd
mkdir -p $(BINDIR) $(MANDIR)
$(EXTRAINSTALL)
- $(INSTALL) -s -c -m 555 pppd $(BINDIR)/pppd
+ $(INSTALL) -c -m 555 pppd $(BINDIR)/pppd
if chgrp pppusers $(BINDIR)/pppd 2>/dev/null; then \
chmod o-rx,u+s $(BINDIR)/pppd; fi
$(INSTALL) -c -m 444 pppd.8 $(MANDIR)
diff -Naur ppp-2.4.4.orig/pppd/plugins/radius/Makefile.linux ppp-2.4.4/pppd/plugins/radius/Makefile.linux
--- ppp-2.4.4.orig/pppd/plugins/radius/Makefile.linux 2006-06-04 01:04:14.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/radius/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -36,9 +36,9 @@
install: all
$(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -s -c -m 755 radius.so $(LIBDIR)
- $(INSTALL) -s -c -m 755 radattr.so $(LIBDIR)
- $(INSTALL) -s -c -m 755 radrealms.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radius.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radattr.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radrealms.so $(LIBDIR)
$(INSTALL) -c -m 444 pppd-radius.8 $(MANDIR)
$(INSTALL) -c -m 444 pppd-radattr.8 $(MANDIR)
diff -Naur ppp-2.4.4.orig/pppd/plugins/rp-pppoe/Makefile.linux ppp-2.4.4/pppd/plugins/rp-pppoe/Makefile.linux
--- ppp-2.4.4.orig/pppd/plugins/rp-pppoe/Makefile.linux 2009-05-07 17:02:45.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/rp-pppoe/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -39,9 +39,9 @@
install: all
$(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -s -c -m 4550 rp-pppoe.so $(LIBDIR)
+ $(INSTALL) -c -m 4550 rp-pppoe.so $(LIBDIR)
$(INSTALL) -d -m 755 $(BINDIR)
- $(INSTALL) -s -c -m 555 pppoe-discovery $(BINDIR)
+ $(INSTALL) -c -m 555 pppoe-discovery $(BINDIR)
clean:
rm -f *.o *.so
diff -Naur ppp-2.4.4.orig/pppdump/Makefile.linux ppp-2.4.4/pppdump/Makefile.linux
--- ppp-2.4.4.orig/pppdump/Makefile.linux 2006-06-04 01:04:14.000000000 -0400
+++ ppp-2.4.4/pppdump/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -17,5 +17,5 @@
install:
mkdir -p $(BINDIR) $(MANDIR)
- $(INSTALL) -s -c pppdump $(BINDIR)
+ $(INSTALL) -c pppdump $(BINDIR)
$(INSTALL) -c -m 444 pppdump.8 $(MANDIR)
diff -Naur ppp-2.4.4.orig/pppstats/Makefile.linux ppp-2.4.4/pppstats/Makefile.linux
--- ppp-2.4.4.orig/pppstats/Makefile.linux 2006-06-04 01:07:46.000000000 -0400
+++ ppp-2.4.4/pppstats/Makefile.linux 2009-05-07 18:04:23.000000000 -0400
@@ -22,7 +22,7 @@
install: pppstats
-mkdir -p $(MANDIR)
- $(INSTALL) -s -c pppstats $(BINDIR)
+ $(INSTALL) -c pppstats $(BINDIR)
$(INSTALL) -c -m 444 pppstats.8 $(MANDIR)
pppstats: $(PPPSTATSRCS)

View file

@ -1,92 +0,0 @@
Index: ppp-2.4.3/chat/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/chat/Makefile.linux 2007-06-04 13:22:08.064629272 +0200
+++ ppp-2.4.3/chat/Makefile.linux 2007-06-04 13:22:12.463960472 +0200
@@ -25,7 +25,7 @@
install: chat
mkdir -p $(BINDIR)
- $(INSTALL) -s -c chat $(BINDIR)
+ $(INSTALL) -c chat $(BINDIR)
$(INSTALL) -c -m 644 chat.8 $(MANDIR)
clean:
Index: ppp-2.4.3/pppd/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/pppd/Makefile.linux 2007-06-04 13:22:11.837055776 +0200
+++ ppp-2.4.3/pppd/Makefile.linux 2007-06-04 13:22:12.463960472 +0200
@@ -99,7 +99,7 @@
CFLAGS += -DUSE_SRP -DOPENSSL -I/usr/local/ssl/include
LIBS += -lsrp -L/usr/local/ssl/lib -lcrypto
TARGETS += srp-entry
-EXTRAINSTALL = $(INSTALL) -s -c -m 555 srp-entry $(BINDIR)/srp-entry
+EXTRAINSTALL = $(INSTALL) -c -m 555 srp-entry $(BINDIR)/srp-entry
MANPAGES += srp-entry.8
EXTRACLEAN += srp-entry.o
NEEDDES=y
@@ -202,7 +202,7 @@
install: pppd
mkdir -p $(BINDIR) $(MANDIR)
$(EXTRAINSTALL)
- $(INSTALL) -s -c -m 555 pppd $(BINDIR)/pppd
+ $(INSTALL) -c -m 555 pppd $(BINDIR)/pppd
if chgrp pppusers $(BINDIR)/pppd 2>/dev/null; then \
chmod o-rx,u+s $(BINDIR)/pppd; fi
$(INSTALL) -c -m 444 pppd.8 $(MANDIR)
Index: ppp-2.4.3/pppd/plugins/radius/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/radius/Makefile.linux 2007-06-04 13:22:08.076627448 +0200
+++ ppp-2.4.3/pppd/plugins/radius/Makefile.linux 2007-06-04 13:22:12.463960472 +0200
@@ -36,9 +36,9 @@
install: all
$(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -s -c -m 755 radius.so $(LIBDIR)
- $(INSTALL) -s -c -m 755 radattr.so $(LIBDIR)
- $(INSTALL) -s -c -m 755 radrealms.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radius.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radattr.so $(LIBDIR)
+ $(INSTALL) -c -m 755 radrealms.so $(LIBDIR)
$(INSTALL) -c -m 444 pppd-radius.8 $(MANDIR)
$(INSTALL) -c -m 444 pppd-radattr.8 $(MANDIR)
Index: ppp-2.4.3/pppd/plugins/rp-pppoe/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/rp-pppoe/Makefile.linux 2007-06-04 13:22:09.416423768 +0200
+++ ppp-2.4.3/pppd/plugins/rp-pppoe/Makefile.linux 2007-06-04 13:22:12.468959712 +0200
@@ -39,9 +39,9 @@
install: all
$(INSTALL) -d -m 755 $(LIBDIR)
- $(INSTALL) -s -c -m 4550 rp-pppoe.so $(LIBDIR)
+ $(INSTALL) -c -m 4550 rp-pppoe.so $(LIBDIR)
$(INSTALL) -d -m 755 $(BINDIR)
- $(INSTALL) -s -c -m 555 pppoe-discovery $(BINDIR)
+ $(INSTALL) -c -m 555 pppoe-discovery $(BINDIR)
clean:
rm -f *.o *.so
Index: ppp-2.4.3/pppdump/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/pppdump/Makefile.linux 2007-06-04 13:22:08.091625168 +0200
+++ ppp-2.4.3/pppdump/Makefile.linux 2007-06-04 13:22:12.468959712 +0200
@@ -17,5 +17,5 @@
install:
mkdir -p $(BINDIR) $(MANDIR)
- $(INSTALL) -s -c pppdump $(BINDIR)
+ $(INSTALL) -c pppdump $(BINDIR)
$(INSTALL) -c -m 444 pppdump.8 $(MANDIR)
Index: ppp-2.4.3/pppstats/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/pppstats/Makefile.linux 2007-06-04 13:22:08.099623952 +0200
+++ ppp-2.4.3/pppstats/Makefile.linux 2007-06-04 13:22:12.468959712 +0200
@@ -22,7 +22,7 @@
install: pppstats
-mkdir -p $(MANDIR)
- $(INSTALL) -s -c pppstats $(BINDIR)
+ $(INSTALL) -c pppstats $(BINDIR)
$(INSTALL) -c -m 444 pppstats.8 $(MANDIR)
pppstats: $(PPPSTATSRCS)

View file

@ -0,0 +1,52 @@
diff -Naur ppp-2.4.4.orig/pppd/plugins/radius/Makefile.linux ppp-2.4.4/pppd/plugins/radius/Makefile.linux
--- ppp-2.4.4.orig/pppd/plugins/radius/Makefile.linux 2009-05-07 18:05:57.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/radius/Makefile.linux 2009-05-07 18:06:23.000000000 -0400
@@ -12,7 +12,8 @@
INSTALL = install
PLUGIN=radius.so radattr.so radrealms.so
-CFLAGS=-I. -I../.. -I../../../include -O2 -fPIC -DRC_LOG_FACILITY=LOG_DAEMON
+COPTS = -O2
+CFLAGS=-I. -I../.. -I../../../include $(COPTS) -fPIC -DRC_LOG_FACILITY=LOG_DAEMON
# Uncomment the next line to include support for Microsoft's
# MS-CHAP authentication protocol.
diff -Naur ppp-2.4.4.orig/pppdump/Makefile.linux ppp-2.4.4/pppdump/Makefile.linux
--- ppp-2.4.4.orig/pppdump/Makefile.linux 2009-05-07 18:05:57.000000000 -0400
+++ ppp-2.4.4/pppdump/Makefile.linux 2009-05-07 18:06:23.000000000 -0400
@@ -2,7 +2,8 @@
BINDIR = $(DESTDIR)/sbin
MANDIR = $(DESTDIR)/share/man/man8
-CFLAGS= -O -I../include/net
+COPTS = -O
+CFLAGS= $(COPTS) -I../include/net
OBJS = pppdump.o bsd-comp.o deflate.o zlib.o
INSTALL= install
diff -Naur ppp-2.4.4.orig/pppd/plugins/radius/Makefile.linux ppp-2.4.4/pppd/plugins/radius/Makefile.linux
--- ppp-2.4.4.orig/pppd/plugins/radius/Makefile.linux 2009-05-07 18:05:57.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/radius/Makefile.linux 2009-05-07 18:06:23.000000000 -0400
@@ -12,7 +12,8 @@
INSTALL = install
PLUGIN=radius.so radattr.so radrealms.so
-CFLAGS=-I. -I../.. -I../../../include -O2 -fPIC -DRC_LOG_FACILITY=LOG_DAEMON
+COPTS = -O2
+CFLAGS=-I. -I../.. -I../../../include $(COPTS) -fPIC -DRC_LOG_FACILITY=LOG_DAEMON
# Uncomment the next line to include support for Microsoft's
# MS-CHAP authentication protocol.
diff -Naur ppp-2.4.4.orig/pppdump/Makefile.linux ppp-2.4.4/pppdump/Makefile.linux
--- ppp-2.4.4.orig/pppdump/Makefile.linux 2009-05-07 18:05:57.000000000 -0400
+++ ppp-2.4.4/pppdump/Makefile.linux 2009-05-07 18:06:23.000000000 -0400
@@ -2,7 +2,8 @@
BINDIR = $(DESTDIR)/sbin
MANDIR = $(DESTDIR)/share/man/man8
-CFLAGS= -O -I../include/net
+COPTS = -O
+CFLAGS= $(COPTS) -I../include/net
OBJS = pppdump.o bsd-comp.o deflate.o zlib.o
INSTALL= install

View file

@ -1,28 +0,0 @@
Index: ppp-2.4.3/pppd/plugins/radius/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/radius/Makefile.linux 2007-06-04 13:22:12.463960472 +0200
+++ ppp-2.4.3/pppd/plugins/radius/Makefile.linux 2007-06-04 13:22:12.705923688 +0200
@@ -12,7 +12,8 @@
INSTALL = install
PLUGIN=radius.so radattr.so radrealms.so
-CFLAGS=-I. -I../.. -I../../../include -O2 -fPIC -DRC_LOG_FACILITY=LOG_DAEMON
+COPTS = -O2
+CFLAGS=-I. -I../.. -I../../../include $(COPTS) -fPIC -DRC_LOG_FACILITY=LOG_DAEMON
# Uncomment the next line to include support for Microsoft's
# MS-CHAP authentication protocol.
Index: ppp-2.4.3/pppdump/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/pppdump/Makefile.linux 2007-06-04 13:22:12.468959712 +0200
+++ ppp-2.4.3/pppdump/Makefile.linux 2007-06-04 13:22:12.705923688 +0200
@@ -2,7 +2,8 @@
BINDIR = $(DESTDIR)/sbin
MANDIR = $(DESTDIR)/share/man/man8
-CFLAGS= -O -I../include/net
+COPTS = -O
+CFLAGS= $(COPTS) -I../include/net
OBJS = pppdump.o bsd-comp.o deflate.o zlib.o
INSTALL= install

View file

@ -0,0 +1,148 @@
diff -Naur ppp-2.4.4.orig/pppd/plugins/radius/config.c ppp-2.4.4/pppd/plugins/radius/config.c
--- ppp-2.4.4.orig/pppd/plugins/radius/config.c 2004-11-14 02:26:26.000000000 -0500
+++ ppp-2.4.4/pppd/plugins/radius/config.c 2009-05-07 19:31:14.000000000 -0400
@@ -369,31 +369,37 @@
}
#endif
+#if 0
if (rc_conf_int("login_tries") <= 0)
{
error("%s: login_tries <= 0 is illegal", filename);
return (-1);
}
+#endif
if (rc_conf_str("seqfile") == NULL)
{
error("%s: seqfile not specified", filename);
return (-1);
}
+#if 0
if (rc_conf_int("login_timeout") <= 0)
{
error("%s: login_timeout <= 0 is illegal", filename);
return (-1);
}
+#endif
if (rc_conf_str("mapfile") == NULL)
{
error("%s: mapfile not specified", filename);
return (-1);
}
+#if 0
if (rc_conf_str("nologin") == NULL)
{
error("%s: nologin not specified", filename);
return (-1);
}
+#endif
return 0;
}
diff -Naur ppp-2.4.4.orig/pppd/plugins/radius/options.h ppp-2.4.4/pppd/plugins/radius/options.h
--- ppp-2.4.4.orig/pppd/plugins/radius/options.h 2004-11-14 02:26:26.000000000 -0500
+++ ppp-2.4.4/pppd/plugins/radius/options.h 2009-05-07 19:31:14.000000000 -0400
@@ -31,24 +31,21 @@
static SERVER acctserver = {0};
static SERVER authserver = {0};
-int default_tries = 4;
-int default_timeout = 60;
-
static OPTION config_options[] = {
/* internally used options */
{"config_file", OT_STR, ST_UNDEF, NULL},
/* General options */
{"auth_order", OT_AUO, ST_UNDEF, NULL},
-{"login_tries", OT_INT, ST_UNDEF, &default_tries},
-{"login_timeout", OT_INT, ST_UNDEF, &default_timeout},
-{"nologin", OT_STR, ST_UNDEF, "/etc/nologin"},
-{"issue", OT_STR, ST_UNDEF, "/etc/radiusclient/issue"},
+{"login_tries", OT_INT, ST_UNDEF, NULL},
+{"login_timeout", OT_INT, ST_UNDEF, NULL},
+{"nologin", OT_STR, ST_UNDEF, NULL},
+{"issue", OT_STR, ST_UNDEF, NULL},
/* RADIUS specific options */
{"authserver", OT_SRV, ST_UNDEF, &authserver},
{"acctserver", OT_SRV, ST_UNDEF, &acctserver},
{"servers", OT_STR, ST_UNDEF, NULL},
{"dictionary", OT_STR, ST_UNDEF, NULL},
-{"login_radius", OT_STR, ST_UNDEF, "/usr/sbin/login.radius"},
+{"login_radius", OT_STR, ST_UNDEF, NULL},
{"seqfile", OT_STR, ST_UNDEF, NULL},
{"mapfile", OT_STR, ST_UNDEF, NULL},
{"default_realm", OT_STR, ST_UNDEF, NULL},
diff -Naur ppp-2.4.4.orig/pppd/plugins/radius/config.c ppp-2.4.4/pppd/plugins/radius/config.c
--- ppp-2.4.4.orig/pppd/plugins/radius/config.c 2004-11-14 02:26:26.000000000 -0500
+++ ppp-2.4.4/pppd/plugins/radius/config.c 2009-05-07 19:31:14.000000000 -0400
@@ -369,31 +369,37 @@
}
#endif
+#if 0
if (rc_conf_int("login_tries") <= 0)
{
error("%s: login_tries <= 0 is illegal", filename);
return (-1);
}
+#endif
if (rc_conf_str("seqfile") == NULL)
{
error("%s: seqfile not specified", filename);
return (-1);
}
+#if 0
if (rc_conf_int("login_timeout") <= 0)
{
error("%s: login_timeout <= 0 is illegal", filename);
return (-1);
}
+#endif
if (rc_conf_str("mapfile") == NULL)
{
error("%s: mapfile not specified", filename);
return (-1);
}
+#if 0
if (rc_conf_str("nologin") == NULL)
{
error("%s: nologin not specified", filename);
return (-1);
}
+#endif
return 0;
}
diff -Naur ppp-2.4.4.orig/pppd/plugins/radius/options.h ppp-2.4.4/pppd/plugins/radius/options.h
--- ppp-2.4.4.orig/pppd/plugins/radius/options.h 2004-11-14 02:26:26.000000000 -0500
+++ ppp-2.4.4/pppd/plugins/radius/options.h 2009-05-07 19:31:14.000000000 -0400
@@ -31,24 +31,21 @@
static SERVER acctserver = {0};
static SERVER authserver = {0};
-int default_tries = 4;
-int default_timeout = 60;
-
static OPTION config_options[] = {
/* internally used options */
{"config_file", OT_STR, ST_UNDEF, NULL},
/* General options */
{"auth_order", OT_AUO, ST_UNDEF, NULL},
-{"login_tries", OT_INT, ST_UNDEF, &default_tries},
-{"login_timeout", OT_INT, ST_UNDEF, &default_timeout},
-{"nologin", OT_STR, ST_UNDEF, "/etc/nologin"},
-{"issue", OT_STR, ST_UNDEF, "/etc/radiusclient/issue"},
+{"login_tries", OT_INT, ST_UNDEF, NULL},
+{"login_timeout", OT_INT, ST_UNDEF, NULL},
+{"nologin", OT_STR, ST_UNDEF, NULL},
+{"issue", OT_STR, ST_UNDEF, NULL},
/* RADIUS specific options */
{"authserver", OT_SRV, ST_UNDEF, &authserver},
{"acctserver", OT_SRV, ST_UNDEF, &acctserver},
{"servers", OT_STR, ST_UNDEF, NULL},
{"dictionary", OT_STR, ST_UNDEF, NULL},
-{"login_radius", OT_STR, ST_UNDEF, "/usr/sbin/login.radius"},
+{"login_radius", OT_STR, ST_UNDEF, NULL},
{"seqfile", OT_STR, ST_UNDEF, NULL},
{"mapfile", OT_STR, ST_UNDEF, NULL},
{"default_realm", OT_STR, ST_UNDEF, NULL},

View file

@ -0,0 +1,56 @@
diff -Naur ppp-2.4.4.orig/pppd/plugins/rp-pppoe/discovery.c ppp-2.4.4/pppd/plugins/rp-pppoe/discovery.c
--- ppp-2.4.4.orig/pppd/plugins/rp-pppoe/discovery.c 2009-05-07 19:47:30.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/rp-pppoe/discovery.c 2009-05-07 20:23:04.000000000 -0400
@@ -593,12 +593,14 @@
conn->discoveryState = STATE_SENT_PADI;
waitForPADO(conn, timeout);
+#if 0
/* If we're just probing for access concentrators, don't do
exponential backoff. This reduces the time for an unsuccessful
probe to 15 seconds. */
if (!conn->printACNames) {
timeout *= 2;
}
+#endif
if (conn->printACNames && conn->numPADOs) {
break;
}
@@ -621,7 +623,9 @@
sendPADR(conn);
conn->discoveryState = STATE_SENT_PADR;
waitForPADS(conn, timeout);
+#if 0
timeout *= 2;
+#endif
} while (conn->discoveryState == STATE_SENT_PADR);
/* We're done. */
diff -Naur ppp-2.4.4.orig/pppd/plugins/rp-pppoe/discovery.c ppp-2.4.4/pppd/plugins/rp-pppoe/discovery.c
--- ppp-2.4.4.orig/pppd/plugins/rp-pppoe/discovery.c 2009-05-07 19:47:30.000000000 -0400
+++ ppp-2.4.4/pppd/plugins/rp-pppoe/discovery.c 2009-05-07 20:23:04.000000000 -0400
@@ -593,12 +593,14 @@
conn->discoveryState = STATE_SENT_PADI;
waitForPADO(conn, timeout);
+#if 0
/* If we're just probing for access concentrators, don't do
exponential backoff. This reduces the time for an unsuccessful
probe to 15 seconds. */
if (!conn->printACNames) {
timeout *= 2;
}
+#endif
if (conn->printACNames && conn->numPADOs) {
break;
}
@@ -621,7 +623,9 @@
sendPADR(conn);
conn->discoveryState = STATE_SENT_PADR;
waitForPADS(conn, timeout);
+#if 0
timeout *= 2;
+#endif
} while (conn->discoveryState == STATE_SENT_PADR);
/* We're done. */

View file

@ -1,17 +0,0 @@
Index: ppp-2.4.3/pppd/plugins/rp-pppoe/plugin.c
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/rp-pppoe/plugin.c 2007-06-04 13:22:09.417423616 +0200
+++ ppp-2.4.3/pppd/plugins/rp-pppoe/plugin.c 2007-06-04 13:22:12.953885992 +0200
@@ -282,9 +282,9 @@
if (strlen(cmd) > 4 && !strncmp(cmd, "nic-", 4)) {
/* Strip off "nic-" */
cmd += 4;
- } else if (strlen(cmd) < 4
- || (strncmp(cmd, "eth", 3) && strncmp(cmd, "nas", 3)
- && strncmp(cmd, "tap", 3) && strncmp(cmd, "br", 2))) {
+ } else if (strlen(cmd) < 3
+ || (strncmp(cmd, "eth", 3) && strncmp(cmd, "nas", 3) && strncmp(cmd, "vlan", 4) && strncmp(cmd, "ath", 3)
+ && strncmp(cmd, "tap", 3) && strncmp(cmd, "br", 2))) {
return 0;
}

View file

@ -0,0 +1,164 @@
diff -Naur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4/pppd/main.c
--- ppp-2.4.4.orig/pppd/main.c 2009-05-07 22:25:24.000000000 -0400
+++ ppp-2.4.4/pppd/main.c 2009-05-07 22:22:40.000000000 -0400
@@ -90,6 +90,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <sys/sysinfo.h>
#include "pppd.h"
#include "magic.h"
@@ -227,6 +228,7 @@
/* Prototypes for procedures local to this file. */
+static void check_time(void);
static void setup_signals __P((void));
static void create_pidfile __P((int pid));
static void create_linkpidfile __P((int pid));
@@ -532,6 +534,7 @@
info("Starting link");
}
+ check_time();
gettimeofday(&start_time, NULL);
script_unsetenv("CONNECT_TIME");
script_unsetenv("BYTES_SENT");
@@ -1264,6 +1267,36 @@
static struct callout *callout = NULL; /* Callout list */
static struct timeval timenow; /* Current time */
+static long uptime_diff = 0;
+static int uptime_diff_set = 0;
+
+static void check_time(void)
+{
+ long new_diff;
+ struct timeval t;
+ struct sysinfo i;
+ struct callout *p;
+
+ gettimeofday(&t, NULL);
+ sysinfo(&i);
+ new_diff = t.tv_sec - i.uptime;
+
+ if (!uptime_diff_set) {
+ uptime_diff = new_diff;
+ uptime_diff_set = 1;
+ return;
+ }
+
+ if ((new_diff - 5 > uptime_diff) || (new_diff + 5 < uptime_diff)) {
+ /* system time has changed, update counters and timeouts */
+ info("System time change detected.");
+ start_time.tv_sec += new_diff - uptime_diff;
+
+ for (p = callout; p != NULL; p = p->c_next)
+ p->c_time.tv_sec += new_diff - uptime_diff;
+ }
+ uptime_diff = new_diff;
+}
/*
* timeout - Schedule a timeout.
@@ -1334,6 +1367,8 @@
{
struct callout *p;
+ check_time();
+
while (callout != NULL) {
p = callout;
@@ -1361,6 +1396,8 @@
{
if (callout == NULL)
return NULL;
+
+ check_time();
gettimeofday(&timenow, NULL);
tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;
diff -Naur ppp-2.4.4.orig/pppd/main.c ppp-2.4.4/pppd/main.c
--- ppp-2.4.4.orig/pppd/main.c 2009-05-07 22:25:24.000000000 -0400
+++ ppp-2.4.4/pppd/main.c 2009-05-07 22:22:40.000000000 -0400
@@ -90,6 +90,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <sys/sysinfo.h>
#include "pppd.h"
#include "magic.h"
@@ -227,6 +228,7 @@
/* Prototypes for procedures local to this file. */
+static void check_time(void);
static void setup_signals __P((void));
static void create_pidfile __P((int pid));
static void create_linkpidfile __P((int pid));
@@ -532,6 +534,7 @@
info("Starting link");
}
+ check_time();
gettimeofday(&start_time, NULL);
script_unsetenv("CONNECT_TIME");
script_unsetenv("BYTES_SENT");
@@ -1264,6 +1267,36 @@
static struct callout *callout = NULL; /* Callout list */
static struct timeval timenow; /* Current time */
+static long uptime_diff = 0;
+static int uptime_diff_set = 0;
+
+static void check_time(void)
+{
+ long new_diff;
+ struct timeval t;
+ struct sysinfo i;
+ struct callout *p;
+
+ gettimeofday(&t, NULL);
+ sysinfo(&i);
+ new_diff = t.tv_sec - i.uptime;
+
+ if (!uptime_diff_set) {
+ uptime_diff = new_diff;
+ uptime_diff_set = 1;
+ return;
+ }
+
+ if ((new_diff - 5 > uptime_diff) || (new_diff + 5 < uptime_diff)) {
+ /* system time has changed, update counters and timeouts */
+ info("System time change detected.");
+ start_time.tv_sec += new_diff - uptime_diff;
+
+ for (p = callout; p != NULL; p = p->c_next)
+ p->c_time.tv_sec += new_diff - uptime_diff;
+ }
+ uptime_diff = new_diff;
+}
/*
* timeout - Schedule a timeout.
@@ -1334,6 +1367,8 @@
{
struct callout *p;
+ check_time();
+
while (callout != NULL) {
p = callout;
@@ -1361,6 +1396,8 @@
{
if (callout == NULL)
return NULL;
+
+ check_time();
gettimeofday(&timenow, NULL);
tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;

View file

@ -1,76 +0,0 @@
Index: ppp-2.4.3/pppd/plugins/radius/config.c
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/radius/config.c 2007-06-04 13:22:07.980642040 +0200
+++ ppp-2.4.3/pppd/plugins/radius/config.c 2007-06-04 13:22:13.139857720 +0200
@@ -369,31 +369,37 @@
}
#endif
+#if 0
if (rc_conf_int("login_tries") <= 0)
{
error("%s: login_tries <= 0 is illegal", filename);
return (-1);
}
+#endif
if (rc_conf_str("seqfile") == NULL)
{
error("%s: seqfile not specified", filename);
return (-1);
}
+#if 0
if (rc_conf_int("login_timeout") <= 0)
{
error("%s: login_timeout <= 0 is illegal", filename);
return (-1);
}
+#endif
if (rc_conf_str("mapfile") == NULL)
{
error("%s: mapfile not specified", filename);
return (-1);
}
+#if 0
if (rc_conf_str("nologin") == NULL)
{
error("%s: nologin not specified", filename);
return (-1);
}
+#endif
return 0;
}
Index: ppp-2.4.3/pppd/plugins/radius/options.h
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/radius/options.h 2007-06-04 13:22:07.989640672 +0200
+++ ppp-2.4.3/pppd/plugins/radius/options.h 2007-06-04 13:22:13.139857720 +0200
@@ -31,24 +31,21 @@
static SERVER acctserver = {0};
static SERVER authserver = {0};
-int default_tries = 4;
-int default_timeout = 60;
-
static OPTION config_options[] = {
/* internally used options */
{"config_file", OT_STR, ST_UNDEF, NULL},
/* General options */
{"auth_order", OT_AUO, ST_UNDEF, NULL},
-{"login_tries", OT_INT, ST_UNDEF, &default_tries},
-{"login_timeout", OT_INT, ST_UNDEF, &default_timeout},
-{"nologin", OT_STR, ST_UNDEF, "/etc/nologin"},
-{"issue", OT_STR, ST_UNDEF, "/etc/radiusclient/issue"},
+{"login_tries", OT_INT, ST_UNDEF, NULL},
+{"login_timeout", OT_INT, ST_UNDEF, NULL},
+{"nologin", OT_STR, ST_UNDEF, NULL},
+{"issue", OT_STR, ST_UNDEF, NULL},
/* RADIUS specific options */
{"authserver", OT_SRV, ST_UNDEF, &authserver},
{"acctserver", OT_SRV, ST_UNDEF, &acctserver},
{"servers", OT_STR, ST_UNDEF, NULL},
{"dictionary", OT_STR, ST_UNDEF, NULL},
-{"login_radius", OT_STR, ST_UNDEF, "/usr/sbin/login.radius"},
+{"login_radius", OT_STR, ST_UNDEF, NULL},
{"seqfile", OT_STR, ST_UNDEF, NULL},
{"mapfile", OT_STR, ST_UNDEF, NULL},
{"default_realm", OT_STR, ST_UNDEF, NULL},

View file

@ -0,0 +1,36 @@
diff -Naur ppp-2.4.4.orig/pppd/lcp.c ppp-2.4.4/pppd/lcp.c
--- ppp-2.4.4.orig/pppd/lcp.c 2009-05-07 22:24:09.000000000 -0400
+++ ppp-2.4.4/pppd/lcp.c 2009-05-07 22:26:57.000000000 -0400
@@ -1904,12 +1904,12 @@
* the interface MTU is set to the lowest of that, the
* MTU we want to use, and our link MRU.
*/
- mtu = ho->neg_mru? ho->mru: PPP_MRU;
+ mtu = MIN(ho->neg_mru? ho->mru: PPP_MRU, ao->mru);
mru = go->neg_mru? MAX(wo->mru, go->mru): PPP_MRU;
#ifdef HAVE_MULTILINK
if (!(multilink && go->neg_mrru && ho->neg_mrru))
#endif /* HAVE_MULTILINK */
- netif_set_mtu(f->unit, MIN(MIN(mtu, mru), ao->mru));
+ netif_set_mtu(f->unit, MIN(mtu, mru));
ppp_send_config(f->unit, mtu,
(ho->neg_asyncmap? ho->asyncmap: 0xffffffff),
ho->neg_pcompression, ho->neg_accompression);
diff -Naur ppp-2.4.4.orig/pppd/lcp.c ppp-2.4.4/pppd/lcp.c
--- ppp-2.4.4.orig/pppd/lcp.c 2009-05-07 22:24:09.000000000 -0400
+++ ppp-2.4.4/pppd/lcp.c 2009-05-07 22:26:57.000000000 -0400
@@ -1904,12 +1904,12 @@
* the interface MTU is set to the lowest of that, the
* MTU we want to use, and our link MRU.
*/
- mtu = ho->neg_mru? ho->mru: PPP_MRU;
+ mtu = MIN(ho->neg_mru? ho->mru: PPP_MRU, ao->mru);
mru = go->neg_mru? MAX(wo->mru, go->mru): PPP_MRU;
#ifdef HAVE_MULTILINK
if (!(multilink && go->neg_mrru && ho->neg_mrru))
#endif /* HAVE_MULTILINK */
- netif_set_mtu(f->unit, MIN(MIN(mtu, mru), ao->mru));
+ netif_set_mtu(f->unit, MIN(mtu, mru));
ppp_send_config(f->unit, mtu,
(ho->neg_asyncmap? ho->asyncmap: 0xffffffff),
ho->neg_pcompression, ho->neg_accompression);

View file

@ -1,133 +0,0 @@
Index: ppp-2.4.3/pppd/auth.c
===================================================================
--- ppp-2.4.3.orig/pppd/auth.c 2007-06-04 13:22:07.941647968 +0200
+++ ppp-2.4.3/pppd/auth.c 2007-06-04 13:22:13.340827168 +0200
@@ -532,6 +532,12 @@
link_required(unit)
int unit;
{
+}
+
+void
+start_link(unit)
+ int unit;
+{
new_phase(PHASE_SERIALCONN);
devfd = the_channel->connect();
@@ -984,10 +990,12 @@
int unit, protocol, prot_flavor;
{
int bit;
+ const char *prot = "";
switch (protocol) {
case PPP_CHAP:
bit = CHAP_WITHPEER;
+ prot = "CHAP";
switch (prot_flavor) {
case CHAP_MD5:
bit |= CHAP_MD5_WITHPEER;
@@ -1006,15 +1014,19 @@
if (passwd_from_file)
BZERO(passwd, MAXSECRETLEN);
bit = PAP_WITHPEER;
+ prot = "PAP";
break;
case PPP_EAP:
bit = EAP_WITHPEER;
+ prot = "EAP";
break;
default:
warn("auth_withpeer_success: unknown protocol %x", protocol);
bit = 0;
}
+ notice("%s authentication succeeded", prot);
+
/* Save the authentication method for later. */
auth_done[unit] |= bit;
@@ -1648,6 +1660,7 @@
static void
plogout()
{
+ char *tty;
#ifdef USE_PAM
int pam_error;
@@ -1658,14 +1671,12 @@
}
/* Apparently the pam stuff does closelog(). */
reopen_log();
-#else /* ! USE_PAM */
- char *tty;
+#endif /* USE_PAM */
tty = devnam;
if (strncmp(tty, "/dev/", 5) == 0)
tty += 5;
logwtmp(tty, "", ""); /* Wipe out utmp logout entry */
-#endif /* ! USE_PAM */
logged_in = 0;
}
Index: ppp-2.4.3/pppd/main.c
===================================================================
--- ppp-2.4.3.orig/pppd/main.c 2007-06-04 13:22:10.548251704 +0200
+++ ppp-2.4.3/pppd/main.c 2007-06-04 13:22:13.340827168 +0200
@@ -537,6 +537,7 @@
script_unsetenv("BYTES_RCVD");
lcp_open(0); /* Start protocol */
+ start_link(0);
while (phase != PHASE_DEAD) {
handle_events();
get_input();
Index: ppp-2.4.3/pppd/pppd.h
===================================================================
--- ppp-2.4.3.orig/pppd/pppd.h 2007-06-04 13:22:11.615089520 +0200
+++ ppp-2.4.3/pppd/pppd.h 2007-06-04 13:22:13.341827016 +0200
@@ -526,6 +526,7 @@
/* Procedures exported from auth.c */
void link_required __P((int)); /* we are starting to use the link */
+void start_link __P((int)); /* bring the link up now */
void link_terminated __P((int)); /* we are finished with the link */
void link_down __P((int)); /* the LCP layer has left the Opened state */
void upper_layers_down __P((int));/* take all NCPs down */
Index: ppp-2.4.3/pppd/tty.c
===================================================================
--- ppp-2.4.3.orig/pppd/tty.c 2007-06-04 13:22:07.960645080 +0200
+++ ppp-2.4.3/pppd/tty.c 2007-06-04 13:22:13.341827016 +0200
@@ -755,14 +755,6 @@
close(pty_master);
pty_master = -1;
}
- if (pty_slave >= 0) {
- close(pty_slave);
- pty_slave = -1;
- }
- if (real_ttyfd >= 0) {
- close(real_ttyfd);
- real_ttyfd = -1;
- }
ttyfd = -1;
if (got_sigterm)
asked_to_quit = 1;
@@ -781,6 +773,7 @@
} else {
info("Serial link disconnected.");
}
+ stop_charshunt(NULL, 0);
}
void tty_close_fds()
@@ -944,7 +937,6 @@
exit(0);
}
charshunt_pid = cpid;
- add_notifier(&sigreceived, stop_charshunt, 0);
record_child(cpid, "pppd (charshunt)", charshunt_done, NULL);
return 1;
}

View file

@ -1,29 +0,0 @@
Index: ppp-2.4.3/pppd/plugins/rp-pppoe/discovery.c
===================================================================
--- ppp-2.4.3.orig/pppd/plugins/rp-pppoe/discovery.c 2007-06-04 13:22:09.414424072 +0200
+++ ppp-2.4.3/pppd/plugins/rp-pppoe/discovery.c 2007-06-04 13:22:13.567792664 +0200
@@ -593,12 +593,14 @@
conn->discoveryState = STATE_SENT_PADI;
waitForPADO(conn, timeout);
+#if 0
/* If we're just probing for access concentrators, don't do
exponential backoff. This reduces the time for an unsuccessful
probe to 15 seconds. */
if (!conn->printACNames) {
timeout *= 2;
}
+#endif
if (conn->printACNames && conn->numPADOs) {
break;
}
@@ -621,7 +623,9 @@
sendPADR(conn);
conn->discoveryState = STATE_SENT_PADR;
waitForPADS(conn, timeout);
+#if 0
timeout *= 2;
+#endif
} while (conn->discoveryState == STATE_SENT_PADR);
/* We're done. */

View file

@ -1,83 +0,0 @@
Index: ppp-2.4.3/pppd/main.c
===================================================================
--- ppp-2.4.3.orig/pppd/main.c 2007-06-04 13:22:13.340827168 +0200
+++ ppp-2.4.3/pppd/main.c 2007-06-04 13:22:13.755764088 +0200
@@ -90,6 +90,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <sys/sysinfo.h>
#include "pppd.h"
#include "magic.h"
@@ -227,6 +228,7 @@
/* Prototypes for procedures local to this file. */
+static void check_time(void);
static void setup_signals __P((void));
static void create_pidfile __P((int pid));
static void create_linkpidfile __P((int pid));
@@ -531,6 +533,7 @@
info("Starting link");
}
+ check_time();
gettimeofday(&start_time, NULL);
script_unsetenv("CONNECT_TIME");
script_unsetenv("BYTES_SENT");
@@ -1195,6 +1198,36 @@
static struct callout *callout = NULL; /* Callout list */
static struct timeval timenow; /* Current time */
+static long uptime_diff = 0;
+static int uptime_diff_set = 0;
+
+static void check_time(void)
+{
+ long new_diff;
+ struct timeval t;
+ struct sysinfo i;
+ struct callout *p;
+
+ gettimeofday(&t, NULL);
+ sysinfo(&i);
+ new_diff = t.tv_sec - i.uptime;
+
+ if (!uptime_diff_set) {
+ uptime_diff = new_diff;
+ uptime_diff_set = 1;
+ return;
+ }
+
+ if ((new_diff - 5 > uptime_diff) || (new_diff + 5 < uptime_diff)) {
+ /* system time has changed, update counters and timeouts */
+ info("System time change detected.");
+ start_time.tv_sec += new_diff - uptime_diff;
+
+ for (p = callout; p != NULL; p = p->c_next)
+ p->c_time.tv_sec += new_diff - uptime_diff;
+ }
+ uptime_diff = new_diff;
+}
/*
* timeout - Schedule a timeout.
@@ -1265,6 +1298,8 @@
{
struct callout *p;
+ check_time();
+
while (callout != NULL) {
p = callout;
@@ -1292,6 +1327,8 @@
{
if (callout == NULL)
return NULL;
+
+ check_time();
gettimeofday(&timenow, NULL);
tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec;

View file

@ -1,19 +0,0 @@
Index: ppp-2.4.3/pppd/lcp.c
===================================================================
--- ppp-2.4.3.orig/pppd/lcp.c 2007-06-04 13:22:07.874658152 +0200
+++ ppp-2.4.3/pppd/lcp.c 2007-06-04 13:22:13.945735208 +0200
@@ -1891,12 +1891,12 @@
* the interface MTU is set to the lowest of that, the
* MTU we want to use, and our link MRU.
*/
- mtu = ho->neg_mru? ho->mru: PPP_MRU;
+ mtu = MIN(ho->neg_mru? ho->mru: PPP_MRU, ao->mru);
mru = go->neg_mru? MAX(wo->mru, go->mru): PPP_MRU;
#ifdef HAVE_MULTILINK
if (!(multilink && go->neg_mrru && ho->neg_mrru))
#endif /* HAVE_MULTILINK */
- netif_set_mtu(f->unit, MIN(MIN(mtu, mru), ao->mru));
+ netif_set_mtu(f->unit, MIN(mtu, mru));
ppp_send_config(f->unit, mtu,
(ho->neg_asyncmap? ho->asyncmap: 0xffffffff),
ho->neg_pcompression, ho->neg_accompression);

View file

@ -1,8 +1,7 @@
Index: ppp-2.4.3/pppd/Makefile.linux diff -Naur ppp-2.4.4.orig/pppd/Makefile.linux ppp-2.4.4/pppd/Makefile.linux
=================================================================== --- ppp-2.4.4.orig/pppd/Makefile.linux 2009-05-07 22:25:24.000000000 -0400
--- ppp-2.4.3.orig/pppd/Makefile.linux 2007-06-04 13:22:12.463960472 +0200 +++ ppp-2.4.4/pppd/Makefile.linux 2009-05-07 22:28:44.000000000 -0400
+++ ppp-2.4.3/pppd/Makefile.linux 2007-06-04 13:22:14.133706632 +0200 @@ -170,8 +170,8 @@
@@ -172,8 +172,8 @@
ifdef FILTER ifdef FILTER
ifneq ($(wildcard /usr/include/pcap-bpf.h),) ifneq ($(wildcard /usr/include/pcap-bpf.h),)

View file

@ -0,0 +1,374 @@
diff -Naur ppp-2.4.4.orig/pppd/Makefile.linux ppp-2.4.4/pppd/Makefile.linux
--- ppp-2.4.4.orig/pppd/Makefile.linux 2009-05-07 22:31:54.000000000 -0400
+++ ppp-2.4.4/pppd/Makefile.linux 2009-05-07 22:33:12.000000000 -0400
@@ -50,6 +50,9 @@
# and that the kernel driver support PPP packet filtering.
#FILTER=y
+# Support for precompiled filters
+PRECOMPILED_FILTER=y
+
# Uncomment the next line to enable multilink PPP (enabled by default)
# Linux distributions: Please leave multilink ENABLED in your builds
# of pppd!
@@ -175,6 +178,14 @@
endif
endif
+ifdef PRECOMPILED_FILTER
+PPPDSRCS += pcap_pcc.c
+HEADERS += pcap_pcc.h
+PPPDOBJS += pcap_pcc.o
+LIBS += $(STAGING_DIR)/usr/lib/libpcap.a
+CFLAGS += -DPPP_FILTER -DPPP_PRECOMPILED_FILTER -I$(STAGING_DIR)/usr/include
+endif
+
ifdef HAVE_INET6
PPPDSRCS += ipv6cp.c eui64.c
HEADERS += ipv6cp.h eui64.h
diff -Naur ppp-2.4.4.orig/pppd/options.c ppp-2.4.4/pppd/options.c
--- ppp-2.4.4.orig/pppd/options.c 2009-05-07 22:25:24.000000000 -0400
+++ ppp-2.4.4/pppd/options.c 2009-05-07 22:38:28.000000000 -0400
@@ -57,6 +57,7 @@
#ifdef PPP_FILTER
#include <pcap.h>
+#include <pcap-bpf.h>
/*
* There have been 3 or 4 different names for this in libpcap CVS, but
* this seems to be what they have settled on...
@@ -160,6 +161,13 @@
static int loadplugin __P((char **));
#endif
+#ifdef PPP_PRECOMPILED_FILTER
+#include "pcap_pcc.h"
+static int setprecompiledpassfilter __P((char **));
+static int setprecompiledactivefilter __P((char **));
+#undef PPP_FILTER
+#endif
+
#ifdef PPP_FILTER
static int setpassfilter __P((char **));
static int setactivefilter __P((char **));
@@ -317,6 +325,14 @@
"set filter for active pkts", OPT_PRIO },
#endif
+#ifdef PPP_PRECOMPILED_FILTER
+ { "precompiled-pass-filter", 1, setprecompiledpassfilter,
+ "set precompiled filter for packets to pass", OPT_PRIO },
+
+ { "precompiled-active-filter", 1, setprecompiledactivefilter,
+ "set precompiled filter for active pkts", OPT_PRIO },
+#endif
+
#ifdef MAXOCTETS
{ "maxoctets", o_int, &maxoctets,
"Set connection traffic limit",
@@ -1456,6 +1472,29 @@
return ok;
}
+#ifdef PPP_PRECOMPILED_FILTER
+/*
+ * setprecompiledpassfilter - Set the pass filter for packets using a
+ * precompiled expression
+ */
+static int
+setprecompiledpassfilter(argv)
+ char **argv;
+{
+ return pcap_pre_compiled (*argv, &pass_filter);
+}
+
+/*
+ * setactivefilter - Set the active filter for packets
+ */
+static int
+setprecompiledactivefilter(argv)
+ char **argv;
+{
+ return pcap_pre_compiled (*argv, &active_filter);
+}
+#endif
+
#ifdef PPP_FILTER
/*
* setpassfilter - Set the pass filter for packets
diff -Naur ppp-2.4.4.orig/pppd/pcap_pcc.c ppp-2.4.4/pppd/pcap_pcc.c
--- ppp-2.4.4.orig/pppd/pcap_pcc.c 1969-12-31 19:00:00.000000000 -0500
+++ ppp-2.4.4/pppd/pcap_pcc.c 2009-05-07 22:33:12.000000000 -0400
@@ -0,0 +1,74 @@
+#include <pcap.h>
+#include <pcap-bpf.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "pppd.h"
+
+int pcap_pre_compiled (char * fname, struct bpf_program *p)
+{
+ char buf[128];
+ int line = 0, size = 0, index=0, ret=1;
+ FILE *f = fopen (fname, "r");
+ if (!f)
+ {
+ option_error("error opening precompiled active-filter '%s': %s",
+ fname, strerror (errno));
+ return 0;
+ }
+ while (fgets (buf, 127, f))
+ {
+ line++;
+ if (*buf == '#')
+ continue;
+ if (size)
+ {
+ /*
+ struct bpf_insn {
+ u_short code;
+ u_char jt;
+ u_char jf;
+ bpf_int32 k;
+ }
+ */
+ struct bpf_insn * insn = & p->bf_insns[index];
+ unsigned code, jt, jf, k;
+ if (sscanf (buf, "%u %u %u %u", &code, &jt, &jf, &k) != 4)
+ {
+ goto err;
+ }
+ insn->code = code;
+ insn->jt = jt;
+ insn->jf = jf;
+ insn->k = k;
+ index++;
+ }
+ else
+ {
+ if (sscanf (buf, "%u", &size) != 1)
+ {
+ goto err;
+ }
+ p->bf_len = size;
+ p->bf_insns = (struct bpf_insn *)
+ malloc (size * sizeof (struct bpf_insn));
+ }
+ }
+ if (size != index)
+ {
+ option_error("error in precompiled active-filter,"
+ " expected %d expressions, got %dn",
+ size, index);
+ ret = 0;
+ }
+ fclose(f);
+ return ret;
+
+err:
+ option_error("error in precompiled active-filter"
+ " expression line %s:%d (wrong size)\n",
+ fname, line);
+ fclose (f);
+ return 0;
+}
diff -Naur ppp-2.4.4.orig/pppd/pcap_pcc.h ppp-2.4.4/pppd/pcap_pcc.h
--- ppp-2.4.4.orig/pppd/pcap_pcc.h 1969-12-31 19:00:00.000000000 -0500
+++ ppp-2.4.4/pppd/pcap_pcc.h 2009-05-07 22:33:12.000000000 -0400
@@ -0,0 +1,7 @@
+#ifndef PCAP_PCC_H
+#define PCAP_PCC_H
+
+#include <pcap.h>
+
+int pcap_pre_compiled (char * fname, struct bpf_program *p);
+#endif /* PCAP_PCC_H */
diff -Naur ppp-2.4.4.orig/pppd/Makefile.linux ppp-2.4.4/pppd/Makefile.linux
--- ppp-2.4.4.orig/pppd/Makefile.linux 2009-05-07 22:31:54.000000000 -0400
+++ ppp-2.4.4/pppd/Makefile.linux 2009-05-07 22:33:12.000000000 -0400
@@ -50,6 +50,9 @@
# and that the kernel driver support PPP packet filtering.
#FILTER=y
+# Support for precompiled filters
+PRECOMPILED_FILTER=y
+
# Uncomment the next line to enable multilink PPP (enabled by default)
# Linux distributions: Please leave multilink ENABLED in your builds
# of pppd!
@@ -175,6 +178,14 @@
endif
endif
+ifdef PRECOMPILED_FILTER
+PPPDSRCS += pcap_pcc.c
+HEADERS += pcap_pcc.h
+PPPDOBJS += pcap_pcc.o
+LIBS += $(STAGING_DIR)/usr/lib/libpcap.a
+CFLAGS += -DPPP_FILTER -DPPP_PRECOMPILED_FILTER -I$(STAGING_DIR)/usr/include
+endif
+
ifdef HAVE_INET6
PPPDSRCS += ipv6cp.c eui64.c
HEADERS += ipv6cp.h eui64.h
diff -Naur ppp-2.4.4.orig/pppd/options.c ppp-2.4.4/pppd/options.c
--- ppp-2.4.4.orig/pppd/options.c 2009-05-07 22:25:24.000000000 -0400
+++ ppp-2.4.4/pppd/options.c 2009-05-07 22:38:28.000000000 -0400
@@ -57,6 +57,7 @@
#ifdef PPP_FILTER
#include <pcap.h>
+#include <pcap-bpf.h>
/*
* There have been 3 or 4 different names for this in libpcap CVS, but
* this seems to be what they have settled on...
@@ -160,6 +161,13 @@
static int loadplugin __P((char **));
#endif
+#ifdef PPP_PRECOMPILED_FILTER
+#include "pcap_pcc.h"
+static int setprecompiledpassfilter __P((char **));
+static int setprecompiledactivefilter __P((char **));
+#undef PPP_FILTER
+#endif
+
#ifdef PPP_FILTER
static int setpassfilter __P((char **));
static int setactivefilter __P((char **));
@@ -317,6 +325,14 @@
"set filter for active pkts", OPT_PRIO },
#endif
+#ifdef PPP_PRECOMPILED_FILTER
+ { "precompiled-pass-filter", 1, setprecompiledpassfilter,
+ "set precompiled filter for packets to pass", OPT_PRIO },
+
+ { "precompiled-active-filter", 1, setprecompiledactivefilter,
+ "set precompiled filter for active pkts", OPT_PRIO },
+#endif
+
#ifdef MAXOCTETS
{ "maxoctets", o_int, &maxoctets,
"Set connection traffic limit",
@@ -1456,6 +1472,29 @@
return ok;
}
+#ifdef PPP_PRECOMPILED_FILTER
+/*
+ * setprecompiledpassfilter - Set the pass filter for packets using a
+ * precompiled expression
+ */
+static int
+setprecompiledpassfilter(argv)
+ char **argv;
+{
+ return pcap_pre_compiled (*argv, &pass_filter);
+}
+
+/*
+ * setactivefilter - Set the active filter for packets
+ */
+static int
+setprecompiledactivefilter(argv)
+ char **argv;
+{
+ return pcap_pre_compiled (*argv, &active_filter);
+}
+#endif
+
#ifdef PPP_FILTER
/*
* setpassfilter - Set the pass filter for packets
diff -Naur ppp-2.4.4.orig/pppd/pcap_pcc.c ppp-2.4.4/pppd/pcap_pcc.c
--- ppp-2.4.4.orig/pppd/pcap_pcc.c 1969-12-31 19:00:00.000000000 -0500
+++ ppp-2.4.4/pppd/pcap_pcc.c 2009-05-07 22:33:12.000000000 -0400
@@ -0,0 +1,74 @@
+#include <pcap.h>
+#include <pcap-bpf.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "pppd.h"
+
+int pcap_pre_compiled (char * fname, struct bpf_program *p)
+{
+ char buf[128];
+ int line = 0, size = 0, index=0, ret=1;
+ FILE *f = fopen (fname, "r");
+ if (!f)
+ {
+ option_error("error opening precompiled active-filter '%s': %s",
+ fname, strerror (errno));
+ return 0;
+ }
+ while (fgets (buf, 127, f))
+ {
+ line++;
+ if (*buf == '#')
+ continue;
+ if (size)
+ {
+ /*
+ struct bpf_insn {
+ u_short code;
+ u_char jt;
+ u_char jf;
+ bpf_int32 k;
+ }
+ */
+ struct bpf_insn * insn = & p->bf_insns[index];
+ unsigned code, jt, jf, k;
+ if (sscanf (buf, "%u %u %u %u", &code, &jt, &jf, &k) != 4)
+ {
+ goto err;
+ }
+ insn->code = code;
+ insn->jt = jt;
+ insn->jf = jf;
+ insn->k = k;
+ index++;
+ }
+ else
+ {
+ if (sscanf (buf, "%u", &size) != 1)
+ {
+ goto err;
+ }
+ p->bf_len = size;
+ p->bf_insns = (struct bpf_insn *)
+ malloc (size * sizeof (struct bpf_insn));
+ }
+ }
+ if (size != index)
+ {
+ option_error("error in precompiled active-filter,"
+ " expected %d expressions, got %dn",
+ size, index);
+ ret = 0;
+ }
+ fclose(f);
+ return ret;
+
+err:
+ option_error("error in precompiled active-filter"
+ " expression line %s:%d (wrong size)\n",
+ fname, line);
+ fclose (f);
+ return 0;
+}
diff -Naur ppp-2.4.4.orig/pppd/pcap_pcc.h ppp-2.4.4/pppd/pcap_pcc.h
--- ppp-2.4.4.orig/pppd/pcap_pcc.h 1969-12-31 19:00:00.000000000 -0500
+++ ppp-2.4.4/pppd/pcap_pcc.h 2009-05-07 22:33:12.000000000 -0400
@@ -0,0 +1,7 @@
+#ifndef PCAP_PCC_H
+#define PCAP_PCC_H
+
+#include <pcap.h>
+
+int pcap_pre_compiled (char * fname, struct bpf_program *p);
+#endif /* PCAP_PCC_H */

View file

@ -1,236 +0,0 @@
Index: ppp-2.4.3/pppd/Makefile.linux
===================================================================
--- ppp-2.4.3.orig/pppd/Makefile.linux 2007-06-04 13:22:14.133706632 +0200
+++ ppp-2.4.3/pppd/Makefile.linux 2007-06-04 13:22:14.320678208 +0200
@@ -50,6 +50,9 @@
# and that the kernel driver support PPP packet filtering.
#FILTER=y
+# Support for precompiled filters
+PRECOMPILED_FILTER=y
+
# Uncomment the next line to enable multilink PPP (enabled by default)
# Linux distributions: Please leave multilink ENABLED in your builds
# of pppd!
@@ -177,6 +180,14 @@
endif
endif
+ifdef PRECOMPILED_FILTER
+PPPDSRCS += pcap_pcc.c
+HEADERS += pcap_pcc.h
+PPPDOBJS += pcap_pcc.o
+LIBS += $(STAGING_DIR)/usr/lib/libpcap.a
+CFLAGS += -DPPP_FILTER -DPPP_PRECOMPILED_FILTER -I$(STAGING_DIR)/usr/include
+endif
+
ifdef HAVE_INET6
PPPDSRCS += ipv6cp.c eui64.c
HEADERS += ipv6cp.h eui64.h
Index: ppp-2.4.3/pppd/demand.c
===================================================================
--- ppp-2.4.3.orig/pppd/demand.c 2007-06-04 13:22:11.613089824 +0200
+++ ppp-2.4.3/pppd/demand.c 2007-06-04 13:22:14.320678208 +0200
@@ -438,12 +438,14 @@
return 0;
proto = PPP_PROTOCOL(p);
#ifdef PPP_FILTER
+ *p = 1; /* set outbound for the filter rule */
if (pass_filter.bf_len != 0
&& bpf_filter(pass_filter.bf_insns, p, len, len) == 0)
return 0;
if (active_filter.bf_len != 0
&& bpf_filter(active_filter.bf_insns, p, len, len) == 0)
return 0;
+ *p = 0xff; /* restore original ppp header */
#endif
for (i = 0; (protp = protocols[i]) != NULL; ++i) {
if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) {
Index: ppp-2.4.3/pppd/options.c
===================================================================
--- ppp-2.4.3.orig/pppd/options.c 2007-06-04 13:22:09.005486240 +0200
+++ ppp-2.4.3/pppd/options.c 2007-06-04 13:22:14.321678056 +0200
@@ -57,14 +57,7 @@
#ifdef PPP_FILTER
#include <pcap.h>
-/*
- * DLT_PPP_WITH_DIRECTION is in current libpcap cvs, and should be in
- * libpcap-0.8.4. Until that is released, use DLT_PPP - but that means
- * we lose the inbound and outbound qualifiers.
- */
-#ifndef DLT_PPP_WITH_DIRECTION
-#define DLT_PPP_WITH_DIRECTION DLT_PPP
-#endif
+#include <pcap-bpf.h>
#endif
#include "pppd.h"
@@ -155,6 +148,13 @@
static int loadplugin __P((char **));
#endif
+#ifdef PPP_PRECOMPILED_FILTER
+#include "pcap_pcc.h"
+static int setprecompiledpassfilter __P((char **));
+static int setprecompiledactivefilter __P((char **));
+#undef PPP_FILTER
+#endif
+
#ifdef PPP_FILTER
static int setpassfilter __P((char **));
static int setactivefilter __P((char **));
@@ -312,6 +312,14 @@
"set filter for active pkts", OPT_PRIO },
#endif
+#ifdef PPP_PRECOMPILED_FILTER
+ { "precompiled-pass-filter", 1, setprecompiledpassfilter,
+ "set precompiled filter for packets to pass", OPT_PRIO },
+
+ { "precompiled-active-filter", 1, setprecompiledactivefilter,
+ "set precompiled filter for active pkts", OPT_PRIO },
+#endif
+
#ifdef MAXOCTETS
{ "maxoctets", o_int, &maxoctets,
"Set connection traffic limit",
@@ -1447,6 +1455,29 @@
return ok;
}
+#ifdef PPP_PRECOMPILED_FILTER
+/*
+ * setprecompiledpassfilter - Set the pass filter for packets using a
+ * precompiled expression
+ */
+static int
+setprecompiledpassfilter(argv)
+ char **argv;
+{
+ return pcap_pre_compiled (*argv, &pass_filter);
+}
+
+/*
+ * setactivefilter - Set the active filter for packets
+ */
+static int
+setprecompiledactivefilter(argv)
+ char **argv;
+{
+ return pcap_pre_compiled (*argv, &active_filter);
+}
+#endif
+
#ifdef PPP_FILTER
/*
* setpassfilter - Set the pass filter for packets
@@ -1458,7 +1489,7 @@
pcap_t *pc;
int ret = 0;
- pc = pcap_open_dead(DLT_PPP_WITH_DIRECTION, 65535);
+ pc = pcap_open_dead(DLT_PPP_PPPD, 65535);
if (pcap_compile(pc, &pass_filter, *argv, 1, netmask) == -1) {
option_error("error in pass-filter expression: %s\n",
pcap_geterr(pc));
@@ -1479,7 +1510,7 @@
pcap_t *pc;
int ret = 0;
- pc = pcap_open_dead(DLT_PPP_WITH_DIRECTION, 65535);
+ pc = pcap_open_dead(DLT_PPP_PPPD, 65535);
if (pcap_compile(pc, &active_filter, *argv, 1, netmask) == -1) {
option_error("error in active-filter expression: %s\n",
pcap_geterr(pc));
Index: ppp-2.4.3/pppd/pcap_pcc.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ppp-2.4.3/pppd/pcap_pcc.c 2007-06-04 13:22:14.321678056 +0200
@@ -0,0 +1,74 @@
+#include <pcap.h>
+#include <pcap-bpf.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "pppd.h"
+
+int pcap_pre_compiled (char * fname, struct bpf_program *p)
+{
+ char buf[128];
+ int line = 0, size = 0, index=0, ret=1;
+ FILE *f = fopen (fname, "r");
+ if (!f)
+ {
+ option_error("error opening precompiled active-filter '%s': %s",
+ fname, strerror (errno));
+ return 0;
+ }
+ while (fgets (buf, 127, f))
+ {
+ line++;
+ if (*buf == '#')
+ continue;
+ if (size)
+ {
+ /*
+ struct bpf_insn {
+ u_short code;
+ u_char jt;
+ u_char jf;
+ bpf_int32 k;
+ }
+ */
+ struct bpf_insn * insn = & p->bf_insns[index];
+ unsigned code, jt, jf, k;
+ if (sscanf (buf, "%u %u %u %u", &code, &jt, &jf, &k) != 4)
+ {
+ goto err;
+ }
+ insn->code = code;
+ insn->jt = jt;
+ insn->jf = jf;
+ insn->k = k;
+ index++;
+ }
+ else
+ {
+ if (sscanf (buf, "%u", &size) != 1)
+ {
+ goto err;
+ }
+ p->bf_len = size;
+ p->bf_insns = (struct bpf_insn *)
+ malloc (size * sizeof (struct bpf_insn));
+ }
+ }
+ if (size != index)
+ {
+ option_error("error in precompiled active-filter,"
+ " expected %d expressions, got %dn",
+ size, index);
+ ret = 0;
+ }
+ fclose(f);
+ return ret;
+
+err:
+ option_error("error in precompiled active-filter"
+ " expression line %s:%d (wrong size)\n",
+ fname, line);
+ fclose (f);
+ return 0;
+}
Index: ppp-2.4.3/pppd/pcap_pcc.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ppp-2.4.3/pppd/pcap_pcc.h 2007-06-04 13:22:14.321678056 +0200
@@ -0,0 +1,7 @@
+#ifndef PCAP_PCC_H
+#define PCAP_PCC_H
+
+#include <pcap.h>
+
+int pcap_pre_compiled (char * fname, struct bpf_program *p);
+#endif /* PCAP_PCC_H */