Created
August 29, 2014 04:29
-
-
Save fcicq/465740ee528175c9f973 to your computer and use it in GitHub Desktop.
pppd-2.4.6 syncppp patch, original ver by morfast, put under package/network/services/ppp/patches/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -urN ppp-2.4.6-bak/pppd/chap-new.c ppp-2.4.6/pppd/chap-new.c | |
--- ppp-2.4.6-bak/pppd/chap-new.c 2014-08-27 23:13:25.460914498 +0800 | |
+++ ppp-2.4.6/pppd/chap-new.c 2014-08-29 12:26:19.221812262 +0800 | |
@@ -37,6 +37,8 @@ | |
#include "chap-new.h" | |
#include "chap-md5.h" | |
+#include "syncppp.h" | |
+ | |
#ifdef CHAPMS | |
#include "chap_ms.h" | |
#define MDTYPE_ALL (MDTYPE_MICROSOFT_V2 | MDTYPE_MICROSOFT | MDTYPE_MD5) | |
@@ -492,6 +494,19 @@ | |
p[2] = len >> 8; | |
p[3] = len; | |
+ if (npppd > 1) { | |
+ if (syncppp(npppd) < 0) { | |
+ error("syncppp sync fail"); | |
+ sem_unlink(SEM_COUNT_NAME); | |
+ sem_unlink(SEM_BLOCK_NAME); | |
+ } else { | |
+ info("syncppp sync succeeded"); | |
+ } | |
+ } else { | |
+ info("syncppp not active"); | |
+ } | |
+ | |
+ | |
output(0, response, PPP_HDRLEN + len); | |
} | |
diff -urN ppp-2.4.6-bak/pppd/Makefile.linux ppp-2.4.6/pppd/Makefile.linux | |
--- ppp-2.4.6-bak/pppd/Makefile.linux 2014-08-27 23:13:25.572914709 +0800 | |
+++ ppp-2.4.6/pppd/Makefile.linux 2014-08-29 12:26:19.221812262 +0800 | |
@@ -13,16 +13,16 @@ | |
PPPDSRCS = main.c magic.c fsm.c lcp.c ipcp.c upap.c chap-new.c md5.c ccp.c \ | |
ecp.c ipxcp.c auth.c options.c sys-linux.c md4.c chap_ms.c \ | |
- demand.c utils.c tty.c eap.c chap-md5.c session.c | |
+ demand.c utils.c tty.c eap.c chap-md5.c session.c syncppp.c | |
HEADERS = ccp.h session.h chap-new.h ecp.h fsm.h ipcp.h \ | |
ipxcp.h lcp.h magic.h md5.h patchlevel.h pathnames.h pppd.h \ | |
- upap.h eap.h | |
+ upap.h eap.h syncppp.h | |
MANPAGES = pppd.8 | |
PPPDOBJS = main.o magic.o fsm.o lcp.o ipcp.o upap.o chap-new.o md5.o ccp.o \ | |
ecp.o auth.o options.o demand.o utils.o sys-linux.o ipxcp.o tty.o \ | |
- eap.o chap-md5.o session.o | |
+ eap.o chap-md5.o session.o syncppp.o | |
# | |
# include dependencies if present | |
@@ -33,7 +33,7 @@ | |
# CC = gcc | |
# | |
COPTS = -O2 -pipe -Wall -g | |
-LIBS = | |
+LIBS = -lpthread | |
# Uncomment the next 2 lines to include support for Microsoft's | |
# MS-CHAP authentication protocol. Also, edit plugins/radius/Makefile.linux. | |
diff -urN ppp-2.4.6-bak/pppd/options.c ppp-2.4.6/pppd/options.c | |
--- ppp-2.4.6-bak/pppd/options.c 2014-08-27 23:13:25.600914762 +0800 | |
+++ ppp-2.4.6/pppd/options.c 2014-08-29 12:26:55.021876324 +0800 | |
@@ -126,6 +126,7 @@ | |
bool dryrun; /* print out option values and exit */ | |
char *domain; /* domain name set by domain option */ | |
int child_wait = 5; /* # seconds to wait for children at exit */ | |
+int npppd = 0; /* synchronize between multiple pppd */ | |
struct userenv *userenv_list; /* user environment variables */ | |
#ifdef MAXOCTETS | |
@@ -329,6 +330,10 @@ | |
"Set pathname of ipv6-down script", | |
OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN }, | |
+ { "syncppp", o_int, &npppd, | |
+ "sync among multiple pppd when sending chap/pap respond", OPT_PRIO }, | |
+ | |
+ | |
#ifdef HAVE_MULTILINK | |
{ "multilink", o_bool, &multilink, | |
"Enable multilink operation", OPT_PRIO | 1 }, | |
diff -urN ppp-2.4.6-bak/pppd/pppd.h ppp-2.4.6/pppd/pppd.h | |
--- ppp-2.4.6-bak/pppd/pppd.h 2014-08-27 23:13:25.592914747 +0800 | |
+++ ppp-2.4.6/pppd/pppd.h 2014-08-29 12:26:19.225812176 +0800 | |
@@ -334,6 +334,7 @@ | |
extern bool dump_options; /* print out option values */ | |
extern bool dryrun; /* check everything, print options, exit */ | |
extern int child_wait; /* # seconds to wait for children at end */ | |
+extern int npppd; /* synchronize between multiple pppd */ | |
#ifdef MAXOCTETS | |
extern unsigned int maxoctets; /* Maximum octetes per session (in bytes) */ | |
diff -urN ppp-2.4.6-bak/pppd/syncppp.c ppp-2.4.6/pppd/syncppp.c | |
--- ppp-2.4.6-bak/pppd/syncppp.c 1970-01-01 08:00:00.000000000 +0800 | |
+++ ppp-2.4.6/pppd/syncppp.c 2014-08-29 12:26:19.225812176 +0800 | |
@@ -0,0 +1,75 @@ | |
+#include<stdio.h> | |
+#include<semaphore.h> | |
+#include<fcntl.h> | |
+#include<stdlib.h> | |
+#include<time.h> | |
+#include<errno.h> | |
+#include "pppd.h" | |
+#include "syncppp.h" | |
+ | |
+int syncppp(int nproc) | |
+{ | |
+ int flags; | |
+ int value; | |
+ sem_t *block; | |
+ sem_t *count; | |
+ struct timespec ts; | |
+ | |
+ if (nproc <= 1) { | |
+ error("syncppp: number of pppd should be larger than 1"); | |
+ return -1; | |
+ } | |
+ | |
+ if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { | |
+ error("clock_gettime error"); | |
+ return -1; | |
+ } | |
+ ts.tv_sec += SYNCPPP_TIMEOUT; | |
+ | |
+ | |
+ flags = O_RDWR | O_CREAT; | |
+ block = sem_open(SEM_BLOCK_NAME, flags, 0644, 0); | |
+ count = sem_open(SEM_COUNT_NAME, flags, 0644, 0); | |
+ if (block == SEM_FAILED || count == SEM_FAILED) { | |
+ error("syncppp: sem_open failed"); | |
+ return -1; | |
+ } | |
+ | |
+ if (sem_post(count) < 0) { | |
+ error("syncppp: sem_post failed"); | |
+ return -1; | |
+ } | |
+ if (sem_getvalue(count, &value) < 0) { | |
+ error("syncppp: sem_getvalue failed"); | |
+ return -1; | |
+ } | |
+ info("%d pppd have arrived, waiting for the left %d", value, nproc-value); | |
+ if (value >= nproc) { | |
+ while (nproc-1 > 0) { | |
+ if (sem_post(block) < 0) { | |
+ error("syncppp: sem_post failed"); | |
+ return -1; | |
+ } | |
+ nproc--; | |
+ } | |
+ } else { | |
+ if (sem_timedwait(block, &ts) < 0) { | |
+ if (errno == ETIMEDOUT) { | |
+ error("syncppp: sem_timewait time out"); | |
+ } else { | |
+ error("syncppp: sem_timewait error"); | |
+ } | |
+ return -1; | |
+ } | |
+ | |
+ } | |
+ | |
+ sem_close(count); | |
+ sem_close(block); | |
+ | |
+ sem_unlink(SEM_COUNT_NAME); | |
+ sem_unlink(SEM_BLOCK_NAME); | |
+ | |
+ return 0; | |
+} | |
+ | |
diff -urN ppp-2.4.6-bak/pppd/syncppp.h ppp-2.4.6/pppd/syncppp.h | |
--- ppp-2.4.6-bak/pppd/syncppp.h 1970-01-01 08:00:00.000000000 +0800 | |
+++ ppp-2.4.6/pppd/syncppp.h 2014-08-29 12:26:19.225812176 +0800 | |
@@ -0,0 +1,3 @@ | |
+#define SEM_BLOCK_NAME "block" | |
+#define SEM_COUNT_NAME "count" | |
+#define SYNCPPP_TIMEOUT 5 | |
diff -urN ppp-2.4.6-bak/pppd/upap.c ppp-2.4.6/pppd/upap.c | |
--- ppp-2.4.6-bak/pppd/upap.c 2014-01-02 12:42:08.000000000 +0800 | |
+++ ppp-2.4.6/pppd/upap.c 2014-08-29 12:26:19.225812176 +0800 | |
@@ -52,6 +52,8 @@ | |
#include "pppd.h" | |
#include "upap.h" | |
+#include "syncppp.h" | |
+ | |
static const char rcsid[] = RCSID; | |
static bool hide_password = 1; | |
@@ -568,6 +570,18 @@ | |
PUTCHAR(u->us_passwdlen, outp); | |
BCOPY(u->us_passwd, outp, u->us_passwdlen); | |
+ if (npppd > 1) { | |
+ if (syncppp(npppd) < 0) { | |
+ error("syncppp sync fail"); | |
+ sem_unlink(SEM_COUNT_NAME); | |
+ sem_unlink(SEM_BLOCK_NAME); | |
+ } else { | |
+ info("syncppp sync succeeded"); | |
+ } | |
+ } else { | |
+ info("syncppp not active"); | |
+ } | |
+ | |
output(u->us_unit, outpacket_buf, outlen + PPP_HDRLEN); | |
TIMEOUT(upap_timeout, u, u->us_timeouttime); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment