summaryrefslogtreecommitdiffstats
path: root/source/n/rp-pppoe/rp-pppoe-3.14-ip-allocation.patch
blob: 0fc03e753b8f72cd48b8d51b04356aa26fe5397f (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
--- ./man/pppoe-server.8.orig	2020-05-26 19:29:37.000000000 -0500
+++ ./man/pppoe-server.8	2020-05-27 17:54:43.214892590 -0500
@@ -96,6 +96,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.
--- ./src/pppoe-server.c.orig	2020-05-26 19:29:37.000000000 -0500
+++ ./src/pppoe-server.c	2020-05-27 17:56:43.228890338 -0500
@@ -182,6 +182,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;
 
@@ -247,8 +250,8 @@
 
     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),
@@ -257,6 +260,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;
@@ -1155,6 +1167,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);
@@ -1224,9 +1237,9 @@
 #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:H:M:";
+    char *options = "X:ix:hI:C:L:R:DT:m:FN:f:O:o:sp:lrudPc:S:1q:Q:H:M:";
 #else
-    char *options = "X:ix:hI:C:L:R:T:m:FN:f:O:o:skp:lrudPc:S:1q:Q:H:M:";
+    char *options = "X:ix:hI:C:L:R:DT:m:FN:f:O:o:skp:lrudPc:S:1q:Q:H:M:";
 #endif
 
     if (getuid() != geteuid() ||
@@ -1448,6 +1461,10 @@
 	    }
 	    break;
 
+	case 'D':
+	    DelegateIPAllocation = 1;
+	    break;
+
 	case 'T':
 	case 'm':
 	    /* These just get passed to pppoe */
@@ -2056,6 +2073,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],
@@ -2071,6 +2089,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);