Package: rp-pppoe
When starting pppd, pppoe-server add local and remote address to it's
command line. But when I'm using pppd configuration for address
assigment (for ex. in pap-servrets or radius), then IP's specified in
command line of pppd by pppoe-server prevents normal working of address
configuration. There are no any way to turn off address assigment by
pppoe-server.
By analogy, pptpd daemon have configuration option 'delegate' which
delegate address assigment to pppd.
I created patch, which add new option "-D" to pppoe-server, which cause
pppoe-server to skip adding addresses to pppd's command line and
delegate it to pppd configuration (pap-secrets or radius server).
This working fine for me many years and I think it will be very usefull
to other ISP's like me. Please, consider to include this patch in
distribution.
diff -rubB rp-pppoe-3.10.orig/man/pppoe-server.8 rp-pppoe-3.10/man/pppoe-server.8
--- rp-pppoe-3.10.orig/man/pppoe-server.8 2008-06-30 17:00:42.000000000 +0300
+++ rp-pppoe-3.10/man/pppoe-server.8 2009-12-16 16:31:15.510557097 +0200
@@ -77,6 +77,11 @@
of 10.67.15.1 is used.
.TP
+.B \-D
+Delegate the allocation of IP addresses to \fBpppd\fR. If specified, no
+local and remote addresses passed to pppd.
+
+.TP
.B \-N \fInum\fR
Allows at most \fInum\fR concurrent PPPoE sessions. If not specified,
the default is 64.
diff -rubB rp-pppoe-3.10.orig/src/pppoe-server.c rp-pppoe-3.10/src/pppoe-server.c
--- rp-pppoe-3.10.orig/src/pppoe-server.c 2008-06-30 17:00:43.000000000 +0300
+++ rp-pppoe-3.10/src/pppoe-server.c 2009-12-16 16:30:39.614556323 +0200
@@ -163,6 +163,9 @@
unsigned char LocalIP[IPV4ALEN] = {10, 0, 0, 1}; /* Counter optionally STARTS here */
unsigned char RemoteIP[IPV4ALEN] = {10, 67, 15, 1}; /* Counter STARTS here */
+/* Delegates the allocation of IP addresses to pppd (as the pptpd doing) */
+int DelegateIPAllocation = 0;
+
/* Do we increment local IP for each connection? */
int IncrLocalIP = 0;
@@ -229,6 +232,7 @@
memset(&conn, 0, sizeof(conn));
conn.useHostUniq = 0;
+ if (!DelegateIPAllocation) {
syslog(LOG_INFO,
"Session %u closed for client "
"%02x:%02x:%02x:%02x:%02x:%02x (%d.%d.%d.%d) on %s",
@@ -238,6 +242,15 @@
(int) session->realpeerip[0], (int) session->realpeerip[1],
(int) session->realpeerip[2], (int) session->realpeerip[3],
session->ethif->name);
+ } else {
+ syslog(LOG_INFO,
+ "Session %u closed for client "
+ "%02x:%02x:%02x:%02x:%02x:%02x on %s",
+ (unsigned int) ntohs(session->sess),
+ session->eth[0], session->eth[1], session->eth[2],
+ session->eth[3], session->eth[4], session->eth[5],
+ session->ethif->name);
+ }
memcpy(conn.myEth, session->ethif->mac, ETH_ALEN);
conn.discoverySocket = session->ethif->sock;
conn.session = session->sess;
@@ -1044,6 +1057,7 @@
fprintf(stderr, " -L ip -- Set local IP address.\n");
fprintf(stderr, " -l -- Increment local IP address for each session.\n");
fprintf(stderr, " -R ip -- Set start address of remote IP pool.\n");
+ fprintf(stderr, " -D -- Delegates the allocation of IP addresses to pppd.\n");
fprintf(stderr, " -S name -- Advertise specified service-name.\n");
fprintf(stderr, " -O fname -- Use PPPD options from specified file\n");
fprintf(stderr, " (default %s).\n", PPPOE_SERVER_OPTIONS);
@@ -1103,9 +1117,9 @@
#endif
#ifndef HAVE_LINUX_KERNEL_PPPOE
- char *options = "x:hI:C:L:R:T:m:FN:f:O:o:sp:lrudPc:S:1";
+ char *options = "x:hI:C:L:R:DT:m:FN:f:O:o:sp:lrudPc:S:1";
#else
- char *options = "x:hI:C:L:R:T:m:FN:f:O:o:skp:lrudPc:S:1";
+ char *options = "x:hI:C:L:R:DT:m:FN:f:O:o:skp:lrudPc:S:1";
#endif
if (getuid() != geteuid() ||
@@ -1283,6 +1297,10 @@
}
break;
+ case 'D':
+ DelegateIPAllocation = 1;
+ break;
+
case 'T':
case 'm':
/* These just get passed to pppoe */
@@ -1719,6 +1737,7 @@
argv[c++] = "file";
argv[c++] = pppoptfile;
+ if (!DelegateIPAllocation) {
snprintf(buffer, SMALLBUF, "%d.%d.%d.%d:%d.%d.%d.%d",
(int) session->myip[0], (int) session->myip[1],
(int) session->myip[2], (int) session->myip[3],
@@ -1734,6 +1753,16 @@
session->ethif->name,
session->serviceName);
argv[c++] = strdup(buffer);
+ } else {
+ syslog(LOG_INFO,
+ "Session %u created for client %02x:%02x:%02x:%02x:%02x:%02x on %s using Service-Name '%s'",
+ (unsigned int) ntohs(session->sess),
+ session->eth[0], session->eth[1], session->eth[2],
+ session->eth[3], session->eth[4], session->eth[5],
+ session->ethif->name,
+ session->serviceName);
+ }
+
if (!argv[c-1]) {
/* TODO: Send a PADT */
exit(EXIT_FAILURE);
@@ -1805,6 +1834,7 @@
argv[c++] = "file";
argv[c++] = pppoptfile;
+ if (!DelegateIPAllocation) {
snprintf(buffer, SMALLBUF, "%d.%d.%d.%d:%d.%d.%d.%d",
(int) session->myip[0], (int) session->myip[1],
(int) session->myip[2], (int) session->myip[3],
@@ -1820,6 +1850,16 @@
session->ethif->name,
session->serviceName);
argv[c++] = strdup(buffer);
+ } else {
+ syslog(LOG_INFO,
+ "Session %u created for client %02x:%02x:%02x:%02x:%02x:%02x on %s using Service-Name '%s'",
+ (unsigned int) ntohs(session->sess),
+ session->eth[0], session->eth[1], session->eth[2],
+ session->eth[3], session->eth[4], session->eth[5],
+ session->ethif->name,
+ session->serviceName);
+ }
+
if (!argv[c-1]) {
/* TODO: Send a PADT */
exit(EXIT_FAILURE);