summaryrefslogtreecommitdiffstats
path: root/source/n/rp-pppoe/rp-pppoe-3.12-ip-allocation.patch
blob: 512913745f461cda928fd3de063cb3f5c7a793ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
diff -up rp-pppoe-3.12/man/pppoe-server.8.ip-allocation rp-pppoe-3.12/man/pppoe-server.8
--- rp-pppoe-3.12/man/pppoe-server.8.ip-allocation	2015-11-11 16:10:01.000000000 +0100
+++ rp-pppoe-3.12/man/pppoe-server.8	2015-11-16 16:48:52.457927211 +0100
@@ -96,6 +96,11 @@ valid remote IP address to \fBpppd\fR.
 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 -up rp-pppoe-3.12/src/pppoe-server.c.ip-allocation rp-pppoe-3.12/src/pppoe-server.c
--- rp-pppoe-3.12/src/pppoe-server.c.ip-allocation	2015-11-11 16:10:04.000000000 +0100
+++ rp-pppoe-3.12/src/pppoe-server.c	2015-11-16 16:50:53.209195100 +0100
@@ -176,6 +176,9 @@ char PppoeOptions[SMALLBUF] = "";
 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;
 
@@ -241,8 +244,8 @@ childHandler(pid_t pid, int status, void
 
     memset(&conn, 0, sizeof(conn));
     conn.hostUniq = NULL;
-
-    syslog(LOG_INFO,
+    if (!DelegateIPAllocation) {
+     syslog(LOG_INFO,
 	   "Session %u closed for client "
 	   "%02x:%02x:%02x:%02x:%02x:%02x (%d.%d.%d.%d) on %s",
 	   (unsigned int) ntohs(session->sess),
@@ -251,6 +254,15 @@ childHandler(pid_t pid, int status, void
 	   (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;
@@ -1134,6 +1146,7 @@ usage(char const *argv0)
     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);
@@ -1200,9 +1213,9 @@ main(int argc, char **argv)
 #endif
 
 #ifndef HAVE_LINUX_KERNEL_PPPOE
-    char *options = "X:ix:hI:C:L:R:T:m:FN:f:O:o:sp:lrudPc:S:1q:Q:";
+    char *options = "X:ix:hI:C:L:R:DT:m:FN:f:O:o:sp:lrudPc:S:1q:Q:";
 #else
-    char *options = "X:ix:hI:C:L:R:T:m:FN:f:O:o:skp:lrudPc:S:1q:Q:";
+    char *options = "X:ix:hI:C:L:R:DT:m:FN:f:O:o:skp:lrudPc:S:1q:Q:";
 #endif
 
     if (getuid() != geteuid() ||
@@ -1401,6 +1414,10 @@ main(int argc, char **argv)
 	    }
 	    break;
 
+	case 'D':
+	    DelegateIPAllocation = 1;
+	    break;
+
 	case 'T':
 	case 'm':
 	    /* These just get passed to pppoe */
@@ -1915,6 +1932,7 @@ startPPPDUserMode(ClientSession *session
     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],
@@ -1930,6 +1948,16 @@ startPPPDUserMode(ClientSession *session
 	   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);