From 37c63e9b3d9b869728c1cc32ddcea37fa8a189f2 Mon Sep 17 00:00:00 2001 From: coolsnowwolf <coolsnowwolf@gmail.com> Date: Wed, 8 Jul 2020 14:45:43 +0800 Subject: [PATCH] ppp: add shellsync support --- feeds.conf.default | 2 +- package/network/services/ppp/Makefile | 11 +- package/network/services/ppp/files/ppp.sh | 19 +- .../ppp/patches/100-debian_ip-ip_option.patch | 2 +- .../ppp/patches/105-debian_demand.patch | 2 +- .../ppp/patches/110-debian_defaultroute.patch | 6 +- .../120-debian_ipv6_updown_option.patch | 2 +- .../121-debian_adaptive_lcp_echo.patch | 56 +++++ .../services/ppp/patches/200-makefile.patch | 2 +- .../services/ppp/patches/202-no_strip.patch | 4 +- .../patches/206-compensate_time_change.patch | 94 ++++++++ .../ppp/patches/208-fix_status_code.patch | 2 +- .../300-filter-pcap-includes-lib.patch | 2 +- .../ppp/patches/310-precompile_filter.patch | 4 +- .../ppp/patches/401-no_record_file.patch | 2 +- .../404-remove_obsolete_protocol_names.patch | 16 +- .../services/ppp/patches/511-syncppp.patch | 207 ++++++++++++++++++ ...openssl-for-the-DES-instead-of-the-l.patch | 4 +- ...-Prevent-buffer-overflow-in-rc_mksid.patch | 30 +++ ...01-pppd-Fix-bounds-check-in-EAP-code.patch | 37 ++++ ...ived-EAP-messages-when-not-doing-EAP.patch | 61 ++++++ package/network/services/shellsync/Makefile | 34 +++ .../services/shellsync/src/shellsync.c | 106 +++++++++ 23 files changed, 668 insertions(+), 37 deletions(-) create mode 100644 package/network/services/ppp/patches/121-debian_adaptive_lcp_echo.patch create mode 100644 package/network/services/ppp/patches/206-compensate_time_change.patch create mode 100644 package/network/services/ppp/patches/511-syncppp.patch create mode 100644 package/network/services/ppp/patches/700-radius-Prevent-buffer-overflow-in-rc_mksid.patch create mode 100644 package/network/services/ppp/patches/701-pppd-Fix-bounds-check-in-EAP-code.patch create mode 100644 package/network/services/ppp/patches/702-pppd-Ignore-received-EAP-messages-when-not-doing-EAP.patch create mode 100644 package/network/services/shellsync/Makefile create mode 100644 package/network/services/shellsync/src/shellsync.c diff --git a/feeds.conf.default b/feeds.conf.default index b63d8f2f1..bae9813cf 100644 --- a/feeds.conf.default +++ b/feeds.conf.default @@ -1,4 +1,4 @@ -src-git packages https://git.openwrt.org/feed/packages.git +src-git packages https://github.com/coolsnowwolf/packages src-git luci https://github.com/coolsnowwolf/luci src-git routing https://git.openwrt.org/feed/routing.git src-git telephony https://git.openwrt.org/feed/telephony.git diff --git a/package/network/services/ppp/Makefile b/package/network/services/ppp/Makefile index bc1eccacb..1fd280032 100644 --- a/package/network/services/ppp/Makefile +++ b/package/network/services/ppp/Makefile @@ -9,19 +9,18 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=ppp -PKG_RELEASE:=2 +PKG_RELEASE:=5 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/paulusmack/ppp -PKG_SOURCE_DATE:=2020-05-25 -PKG_SOURCE_VERSION:=ddd57c279f467e18c4fb3a661f21a069a5a37a1f -PKG_MIRROR_HASH:=aac65e65dd25eaf8978a7a0b3258c863d90e29e247dd33d95276c0c189bcd424 +PKG_SOURCE_VERSION:=78cd384ce0f48bb5edb84e4fe9a574eab4a4ad14 +PKG_MIRROR_HASH:=cf284c312b0c90974d11f8aeece173bcac8475f5b810911f4feb2c5a4db263fe PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> PKG_LICENSE:=BSD-4-Clause PKG_CPE_ID:=cpe:/a:samba:ppp PKG_RELEASE_VERSION:=2.4.8 -PKG_VERSION:=$(PKG_RELEASE_VERSION).git-$(PKG_SOURCE_DATE) +PKG_VERSION:=$(PKG_RELEASE_VERSION) PKG_BUILD_DEPENDS:=libpcap @@ -39,7 +38,7 @@ endef define Package/ppp $(call Package/ppp/Default) - DEPENDS:=+kmod-ppp + DEPENDS:=+kmod-ppp +libpthread +shellsync +kmod-mppe TITLE:=PPP daemon VARIANT:=default endef diff --git a/package/network/services/ppp/files/ppp.sh b/package/network/services/ppp/files/ppp.sh index b553effd8..78e8c3213 100755 --- a/package/network/services/ppp/files/ppp.sh +++ b/package/network/services/ppp/files/ppp.sh @@ -74,7 +74,7 @@ ppp_generic_init_config() { proto_config_add_string pppd_options proto_config_add_string 'connect:file' proto_config_add_string 'disconnect:file' - [ -e /proc/sys/net/ipv6 ] && proto_config_add_string ipv6 + proto_config_add_string ipv6 proto_config_add_boolean authfail proto_config_add_int mtu proto_config_add_string pppname @@ -88,9 +88,7 @@ ppp_generic_setup() { local config="$1"; shift local localip - json_get_vars ip6table demand keepalive keepalive_adaptive username password pppd_options pppname unnumbered persist maxfail holdoff peerdns - - [ ! -e /proc/sys/net/ipv6 ] && ipv6=0 || json_get_var ipv6 ipv6 + json_get_vars ipv6 ip6table demand keepalive keepalive_adaptive username password pppd_options pppname unnumbered persist maxfail holdoff peerdns if [ "$ipv6" = 0 ]; then ipv6="" @@ -151,9 +149,9 @@ ppp_generic_setup() { ${connect:+connect "$connect"} \ ${disconnect:+disconnect "$disconnect"} \ ip-up-script /lib/netifd/ppp-up \ - ${ipv6:+ipv6-up-script /lib/netifd/ppp6-up} \ + ipv6-up-script /lib/netifd/ppp6-up \ ip-down-script /lib/netifd/ppp-down \ - ${ipv6:+ipv6-down-script /lib/netifd/ppp-down} \ + ipv6-down-script /lib/netifd/ppp-down \ ${mtu:+mtu $mtu mru $mtu} \ "$@" $pppd_options } @@ -233,7 +231,16 @@ proto_pppoe_setup() { json_get_var padi_attempts padi_attempts json_get_var padi_timeout padi_timeout +#By 蝈蝈:并发拨号同步的前期准备 + syncppp_option="" + [ "$(uci get syncdial.config.enabled)" -eq "1" ] && { + ppp_if_cnt=$(uci show network | grep -c "\.proto=\'pppoe\'$") + syncppp_option="syncppp $ppp_if_cnt" + shellsync $ppp_if_cnt 10 + } + ppp_generic_setup "$config" \ + $syncppp_option \ plugin rp-pppoe.so \ ${ac:+rp_pppoe_ac "$ac"} \ ${service:+rp_pppoe_service "$service"} \ diff --git a/package/network/services/ppp/patches/100-debian_ip-ip_option.patch b/package/network/services/ppp/patches/100-debian_ip-ip_option.patch index a99662292..335ce72b0 100644 --- a/package/network/services/ppp/patches/100-debian_ip-ip_option.patch +++ b/package/network/services/ppp/patches/100-debian_ip-ip_option.patch @@ -85,7 +85,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> "Enable multilink operation", OPT_PRIO | 1 }, --- a/pppd/pppd.h +++ b/pppd/pppd.h -@@ -335,6 +335,8 @@ extern int connect_delay; /* Time to del +@@ -334,6 +334,8 @@ extern int connect_delay; /* Time to del extern int max_data_rate; /* max bytes/sec through charshunt */ extern int req_unit; /* interface unit number to use */ extern char req_ifname[MAXIFNAMELEN]; /* interface name to use */ diff --git a/package/network/services/ppp/patches/105-debian_demand.patch b/package/network/services/ppp/patches/105-debian_demand.patch index fb6f39f4b..c68bafa8d 100644 --- a/package/network/services/ppp/patches/105-debian_demand.patch +++ b/package/network/services/ppp/patches/105-debian_demand.patch @@ -161,7 +161,7 @@ } else { --- a/pppd/pppd.h +++ b/pppd/pppd.h -@@ -602,7 +602,7 @@ void demand_conf __P((void)); /* config +@@ -601,7 +601,7 @@ void demand_conf __P((void)); /* config 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 */ diff --git a/package/network/services/ppp/patches/110-debian_defaultroute.patch b/package/network/services/ppp/patches/110-debian_defaultroute.patch index e47457176..38739a524 100644 --- a/package/network/services/ppp/patches/110-debian_defaultroute.patch +++ b/package/network/services/ppp/patches/110-debian_defaultroute.patch @@ -137,7 +137,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> .B disconnect \fIscript Execute the command specified by \fIscript\fR, by passing it to a shell, after -@@ -751,7 +756,12 @@ disable both forms of hardware flow cont +@@ -746,7 +751,12 @@ disable both forms of hardware flow cont .TP .B nodefaultroute Disable the \fIdefaultroute\fR option. The system administrator who @@ -153,7 +153,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> .B nodefaultroute6 --- a/pppd/pppd.h +++ b/pppd/pppd.h -@@ -684,7 +684,7 @@ int sif6addr __P((int, eui64_t, eui64_t +@@ -683,7 +683,7 @@ int sif6addr __P((int, eui64_t, eui64_t int cif6addr __P((int, eui64_t, eui64_t)); /* Remove an IPv6 address from i/f */ #endif @@ -292,7 +292,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> } --- a/pppd/sys-solaris.c +++ b/pppd/sys-solaris.c -@@ -2120,12 +2120,18 @@ cifaddr(u, o, h) +@@ -2119,12 +2119,18 @@ cifaddr(u, o, h) * sifdefaultroute - assign a default route through the address given. */ int diff --git a/package/network/services/ppp/patches/120-debian_ipv6_updown_option.patch b/package/network/services/ppp/patches/120-debian_ipv6_updown_option.patch index 5ef09b3f3..4a9ca7d5e 100644 --- a/package/network/services/ppp/patches/120-debian_ipv6_updown_option.patch +++ b/package/network/services/ppp/patches/120-debian_ipv6_updown_option.patch @@ -84,7 +84,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> } --- a/pppd/pppd.h +++ b/pppd/pppd.h -@@ -337,6 +337,8 @@ extern int req_unit; /* interface unit n +@@ -336,6 +336,8 @@ extern int req_unit; /* interface unit n extern char req_ifname[MAXIFNAMELEN]; /* interface name to use */ extern char path_ipup[MAXPATHLEN]; /* pathname of ip-up script */ extern char path_ipdown[MAXPATHLEN]; /* pathname of ip-down script */ diff --git a/package/network/services/ppp/patches/121-debian_adaptive_lcp_echo.patch b/package/network/services/ppp/patches/121-debian_adaptive_lcp_echo.patch new file mode 100644 index 000000000..510c96ba9 --- /dev/null +++ b/package/network/services/ppp/patches/121-debian_adaptive_lcp_echo.patch @@ -0,0 +1,56 @@ +--- a/pppd/lcp.c ++++ b/pppd/lcp.c +@@ -72,6 +72,7 @@ static void lcp_delayed_up __P((void *)) + */ + int lcp_echo_interval = 0; /* Interval between LCP echo-requests */ + int lcp_echo_fails = 0; /* Tolerance to unanswered echo-requests */ ++bool lcp_echo_adaptive = 0; /* request echo only if the link was idle */ + bool lax_recv = 0; /* accept control chars in asyncmap */ + bool noendpoint = 0; /* don't send/accept endpoint discriminator */ + +@@ -150,6 +151,8 @@ static option_t lcp_option_list[] = { + OPT_PRIO }, + { "lcp-echo-interval", o_int, &lcp_echo_interval, + "Set time in seconds between LCP echo requests", OPT_PRIO }, ++ { "lcp-echo-adaptive", o_bool, &lcp_echo_adaptive, ++ "Suppress LCP echo requests if traffic was received", 1 }, + { "lcp-restart", o_int, &lcp_fsm[0].timeouttime, + "Set time in seconds between LCP retransmissions", OPT_PRIO }, + { "lcp-max-terminate", o_int, &lcp_fsm[0].maxtermtransmits, +@@ -2330,6 +2333,22 @@ LcpSendEchoRequest (f) + } + } + ++ /* ++ * If adaptive echos have been enabled, only send the echo request if ++ * no traffic was received since the last one. ++ */ ++ if (lcp_echo_adaptive) { ++ static unsigned int last_pkts_in = 0; ++ ++ update_link_stats(f->unit); ++ link_stats_valid = 0; ++ ++ if (link_stats.pkts_in != last_pkts_in) { ++ last_pkts_in = link_stats.pkts_in; ++ return; ++ } ++ } ++ + /* + * Make and send the echo request frame. + */ +--- a/pppd/pppd.8 ++++ b/pppd/pppd.8 +@@ -575,6 +575,11 @@ to 1) if the \fIproxyarp\fR option is us + dynamic IP address option (i.e. set /proc/sys/net/ipv4/ip_dynaddr to + 1) in demand mode if the local address changes. + .TP ++.B lcp\-echo\-adaptive ++If this option is used with the \fIlcp\-echo\-failure\fR option then ++pppd will send LCP echo\-request frames only if no traffic was received ++from the peer since the last echo\-request was sent. ++.TP + .B lcp\-echo\-failure \fIn + If this option is given, pppd will presume the peer to be dead + if \fIn\fR LCP echo\-requests are sent without receiving a valid LCP diff --git a/package/network/services/ppp/patches/200-makefile.patch b/package/network/services/ppp/patches/200-makefile.patch index 42351392d..82b1cc67b 100644 --- a/package/network/services/ppp/patches/200-makefile.patch +++ b/package/network/services/ppp/patches/200-makefile.patch @@ -34,7 +34,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> CFLAGS= $(COPTS) $(COMPILE_FLAGS) $(INCLUDE_DIRS) '-DDESTDIR="@DESTDIR@"' -@@ -126,10 +126,10 @@ CFLAGS += -DHAS_SHADOW +@@ -125,10 +125,10 @@ CFLAGS += -DHAS_SHADOW #LIBS += -lshadow $(LIBS) endif diff --git a/package/network/services/ppp/patches/202-no_strip.patch b/package/network/services/ppp/patches/202-no_strip.patch index 0af7b2b2a..436085f3b 100644 --- a/package/network/services/ppp/patches/202-no_strip.patch +++ b/package/network/services/ppp/patches/202-no_strip.patch @@ -19,7 +19,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> clean: --- a/pppd/Makefile.linux +++ b/pppd/Makefile.linux -@@ -108,7 +108,7 @@ ifdef USE_SRP +@@ -107,7 +107,7 @@ ifdef USE_SRP CFLAGS += -DUSE_SRP -DOPENSSL -I/usr/local/ssl/include LIBS += -lsrp -L/usr/local/ssl/lib -lcrypto TARGETS += srp-entry @@ -28,7 +28,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> MANPAGES += srp-entry.8 EXTRACLEAN += srp-entry.o NEEDDES=y -@@ -220,7 +220,7 @@ all: $(TARGETS) +@@ -219,7 +219,7 @@ all: $(TARGETS) install: pppd mkdir -p $(BINDIR) $(MANDIR) $(EXTRAINSTALL) diff --git a/package/network/services/ppp/patches/206-compensate_time_change.patch b/package/network/services/ppp/patches/206-compensate_time_change.patch new file mode 100644 index 000000000..a1eb6a716 --- /dev/null +++ b/package/network/services/ppp/patches/206-compensate_time_change.patch @@ -0,0 +1,94 @@ +pppd: Watch out for time warps + +On many embedded systems there is no battery backed RTC and a proper system +time only becomes available through NTP after establishing a connection. + +When the clock suddenly jumps forward, the internal accounting (connect time) +is confused resulting in unreliable data. + +This patch implements periodic clock checking to look for time warps, if one +is detected, the internal counters are adjusted accordingly. + +Signed-off-by: Jo-Philipp Wich <jo@mein.io> + +--- a/pppd/main.c ++++ b/pppd/main.c +@@ -89,6 +89,7 @@ + #include <sys/socket.h> + #include <netinet/in.h> + #include <arpa/inet.h> ++#include <sys/sysinfo.h> + + #include "pppd.h" + #include "magic.h" +@@ -226,6 +227,7 @@ static struct subprocess *children; + + /* 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)); +@@ -525,6 +527,7 @@ main(argc, argv) + info("Starting link"); + } + ++ check_time(); + gettimeofday(&start_time, NULL); + script_unsetenv("CONNECT_TIME"); + script_unsetenv("BYTES_SENT"); +@@ -1274,6 +1277,36 @@ struct callout { + + 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. +@@ -1344,6 +1377,8 @@ calltimeout() + { + struct callout *p; + ++ check_time(); ++ + while (callout != NULL) { + p = callout; + +@@ -1371,6 +1406,8 @@ timeleft(tvp) + { + if (callout == NULL) + return NULL; ++ ++ check_time(); + + gettimeofday(&timenow, NULL); + tvp->tv_sec = callout->c_time.tv_sec - timenow.tv_sec; diff --git a/package/network/services/ppp/patches/208-fix_status_code.patch b/package/network/services/ppp/patches/208-fix_status_code.patch index f1a12006a..31460148a 100644 --- a/package/network/services/ppp/patches/208-fix_status_code.patch +++ b/package/network/services/ppp/patches/208-fix_status_code.patch @@ -12,7 +12,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> --- a/pppd/main.c +++ b/pppd/main.c -@@ -1052,7 +1052,8 @@ get_input() +@@ -1055,7 +1055,8 @@ get_input() } notice("Modem hangup"); hungup = 1; diff --git a/package/network/services/ppp/patches/300-filter-pcap-includes-lib.patch b/package/network/services/ppp/patches/300-filter-pcap-includes-lib.patch index 40866132e..00fb83502 100644 --- a/package/network/services/ppp/patches/300-filter-pcap-includes-lib.patch +++ b/package/network/services/ppp/patches/300-filter-pcap-includes-lib.patch @@ -7,7 +7,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> --- a/pppd/Makefile.linux +++ b/pppd/Makefile.linux -@@ -190,8 +190,8 @@ endif +@@ -189,8 +189,8 @@ endif ifdef FILTER ifneq ($(wildcard /usr/include/pcap-bpf.h),) diff --git a/package/network/services/ppp/patches/310-precompile_filter.patch b/package/network/services/ppp/patches/310-precompile_filter.patch index ec6110442..a65c19cf1 100644 --- a/package/network/services/ppp/patches/310-precompile_filter.patch +++ b/package/network/services/ppp/patches/310-precompile_filter.patch @@ -23,7 +23,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> # Uncomment the next line to enable multilink PPP (enabled by default) # Linux distributions: Please leave multilink ENABLED in your builds # of pppd! -@@ -195,6 +198,14 @@ CFLAGS += -DPPP_FILTER -I$(STAGING_DIR) +@@ -194,6 +197,14 @@ CFLAGS += -DPPP_FILTER -I$(STAGING_DIR) endif endif @@ -77,7 +77,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> #ifdef MAXOCTETS { "maxoctets", o_int, &maxoctets, "Set connection traffic limit", -@@ -1516,6 +1532,29 @@ callfile(argv) +@@ -1511,6 +1527,29 @@ callfile(argv) return ok; } diff --git a/package/network/services/ppp/patches/401-no_record_file.patch b/package/network/services/ppp/patches/401-no_record_file.patch index f707fda8a..56a9f02eb 100644 --- a/package/network/services/ppp/patches/401-no_record_file.patch +++ b/package/network/services/ppp/patches/401-no_record_file.patch @@ -7,7 +7,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> --- a/pppd/pppd.h +++ b/pppd/pppd.h -@@ -326,7 +326,6 @@ extern int holdoff; /* Dead time before +@@ -325,7 +325,6 @@ extern int holdoff; /* Dead time before extern bool holdoff_specified; /* true if user gave a holdoff value */ extern bool notty; /* Stdin/out is not a tty */ extern char *pty_socket; /* Socket to connect to pty */ diff --git a/package/network/services/ppp/patches/404-remove_obsolete_protocol_names.patch b/package/network/services/ppp/patches/404-remove_obsolete_protocol_names.patch index d37fc0353..1d94873f3 100644 --- a/package/network/services/ppp/patches/404-remove_obsolete_protocol_names.patch +++ b/package/network/services/ppp/patches/404-remove_obsolete_protocol_names.patch @@ -7,7 +7,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> --- a/pppd/main.c +++ b/pppd/main.c -@@ -883,14 +883,17 @@ struct protocol_list { +@@ -886,14 +886,17 @@ struct protocol_list { const char *name; } protocol_list[] = { { 0x21, "IP" }, @@ -25,7 +25,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> { 0x33, "Stream Protocol ST-II" }, { 0x35, "Banyan Vines" }, { 0x39, "AppleTalk EDDP" }, -@@ -904,8 +907,11 @@ struct protocol_list { +@@ -907,8 +910,11 @@ struct protocol_list { { 0x49, "Serial Data Transport Protocol (PPP-SDTP)" }, { 0x4b, "SNA over 802.2" }, { 0x4d, "SNA" }, @@ -37,7 +37,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> { 0x53, "Encryption" }, { 0x55, "Individual Link Encryption" }, { 0x57, "IPv6" }, -@@ -916,12 +922,15 @@ struct protocol_list { +@@ -919,12 +925,15 @@ struct protocol_list { { 0x65, "RTP IPHC Compressed non-TCP" }, { 0x67, "RTP IPHC Compressed UDP 8" }, { 0x69, "RTP IPHC Compressed RTP 8" }, @@ -53,7 +53,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> { 0x0203, "IBM Source Routing BPDU" }, { 0x0205, "DEC LANBridge100 Spanning Tree" }, { 0x0207, "Cisco Discovery Protocol" }, -@@ -933,15 +942,19 @@ struct protocol_list { +@@ -936,15 +945,19 @@ struct protocol_list { { 0x0231, "Luxcom" }, { 0x0233, "Sigma Network Systems" }, { 0x0235, "Apple Client Server Protocol" }, @@ -73,7 +73,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> { 0x4001, "Cray Communications Control Protocol" }, { 0x4003, "CDPD Mobile Network Registration Protocol" }, { 0x4005, "Expand accelerator protocol" }, -@@ -952,8 +965,10 @@ struct protocol_list { +@@ -955,8 +968,10 @@ struct protocol_list { { 0x4023, "RefTek Protocol" }, { 0x4025, "Fibre Channel" }, { 0x4027, "EMIT Protocols" }, @@ -84,7 +84,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> { 0x8023, "OSI Network Layer Control Protocol" }, { 0x8025, "Xerox NS IDP Control Protocol" }, { 0x8027, "DECnet Phase IV Control Protocol" }, -@@ -962,7 +977,9 @@ struct protocol_list { +@@ -965,7 +980,9 @@ struct protocol_list { { 0x8031, "Bridging NCP" }, { 0x8033, "Stream Protocol Control Protocol" }, { 0x8035, "Banyan Vines Control Protocol" }, @@ -94,7 +94,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> { 0x803f, "NETBIOS Framing Control Protocol" }, { 0x8041, "Cisco Systems Control Protocol" }, { 0x8043, "Ascom Timeplex" }, -@@ -971,18 +988,24 @@ struct protocol_list { +@@ -974,18 +991,24 @@ struct protocol_list { { 0x8049, "Serial Data Control Protocol (PPP-SDCP)" }, { 0x804b, "SNA over 802.2 Control Protocol" }, { 0x804d, "SNA Control Protocol" }, @@ -119,7 +119,7 @@ Signed-off-by: Jo-Philipp Wich <jo@mein.io> { 0x8207, "Cisco Discovery Protocol Control" }, { 0x8209, "Netcs Twin Routing" }, { 0x820b, "STP - Control Protocol" }, -@@ -991,24 +1014,29 @@ struct protocol_list { +@@ -994,24 +1017,29 @@ struct protocol_list { { 0x8281, "MPLSCP" }, { 0x8285, "IEEE p1284.4 standard - Protocol Control" }, { 0x8287, "ETSI TETRA TNP1 Control Protocol" }, diff --git a/package/network/services/ppp/patches/511-syncppp.patch b/package/network/services/ppp/patches/511-syncppp.patch new file mode 100644 index 000000000..8b8b6cce6 --- /dev/null +++ b/package/network/services/ppp/patches/511-syncppp.patch @@ -0,0 +1,207 @@ +--- a/pppd/chap-new.c ++++ b/pppd/chap-new.c +@@ -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 @@ chap_respond(struct chap_client_state *c + 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); + } + +--- a/pppd/Makefile.linux ++++ b/pppd/Makefile.linux +@@ -13,16 +13,16 @@ TARGETS = pppd + + 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 @@ endif + # CC = gcc + # + COPTS = -O2 -pipe -Wall -g +-LIBS = ++LIBS = -lpthread + + # Uncomment the next line to include support for Microsoft's + # MS-CHAP authentication protocol. Also, edit plugins/radius/Makefile.linux. +--- a/pppd/options.c ++++ b/pppd/options.c +@@ -128,6 +128,7 @@ bool dump_options; /* print out option + 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 */ + int dfl_route_metric = -1; /* metric of the default route to set over the PPP link */ + +@@ -342,6 +343,10 @@ option_t general_options[] = { + "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 }, +--- a/pppd/pppd.h ++++ b/pppd/pppd.h +@@ -343,6 +343,7 @@ extern char *bundle_name; /* bundle name + 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) */ +--- /dev/null ++++ b/pppd/syncppp.c +@@ -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; ++} ++ +--- /dev/null ++++ b/pppd/syncppp.h +@@ -0,0 +1,3 @@ ++#define SEM_BLOCK_NAME "block" ++#define SEM_COUNT_NAME "count" ++#define SYNCPPP_TIMEOUT 5 +--- a/pppd/upap.c ++++ b/pppd/upap.c +@@ -52,6 +52,7 @@ + #include "pppd.h" + #include "upap.h" + ++#include "syncppp.h" + + static bool hide_password = 1; + +@@ -567,6 +568,18 @@ upap_sauthreq(u) + 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); + diff --git a/package/network/services/ppp/patches/600-Revert-pppd-Use-openssl-for-the-DES-instead-of-the-l.patch b/package/network/services/ppp/patches/600-Revert-pppd-Use-openssl-for-the-DES-instead-of-the-l.patch index 5802d6158..9676824f5 100644 --- a/package/network/services/ppp/patches/600-Revert-pppd-Use-openssl-for-the-DES-instead-of-the-l.patch +++ b/package/network/services/ppp/patches/600-Revert-pppd-Use-openssl-for-the-DES-instead-of-the-l.patch @@ -17,7 +17,7 @@ This reverts commit 3c7b86229f7bd2600d74db14b1fe5b3896be3875. +++ b/pppd/Makefile.linux @@ -35,10 +35,10 @@ endif COPTS = -O2 -pipe -Wall -g - LIBS = -lrt + LIBS = -# Uncomment the next line to include support for Microsoft's +# Uncomment the next 2 lines to include support for Microsoft's @@ -28,7 +28,7 @@ This reverts commit 3c7b86229f7bd2600d74db14b1fe5b3896be3875. # Don't use MSLANMAN unless you really know what you're doing. #MSLANMAN=y # Uncomment the next line to include support for MPPE. CHAPMS (above) must -@@ -141,8 +141,7 @@ endif +@@ -140,8 +140,7 @@ endif ifdef NEEDDES ifndef USE_CRYPT diff --git a/package/network/services/ppp/patches/700-radius-Prevent-buffer-overflow-in-rc_mksid.patch b/package/network/services/ppp/patches/700-radius-Prevent-buffer-overflow-in-rc_mksid.patch new file mode 100644 index 000000000..1c5722e6d --- /dev/null +++ b/package/network/services/ppp/patches/700-radius-Prevent-buffer-overflow-in-rc_mksid.patch @@ -0,0 +1,30 @@ +From 858976b1fc3107f1261aae337831959b511b83c2 Mon Sep 17 00:00:00 2001 +From: Paul Mackerras <paulus@ozlabs.org> +Date: Sat, 4 Jan 2020 12:01:32 +1100 +Subject: [PATCH] radius: Prevent buffer overflow in rc_mksid() + +On some systems getpid() can return a value greater than 65535. +Increase the size of buf[] to allow for this, and use slprintf() +to make sure we never overflow it. + +Signed-off-by: Paul Mackerras <paulus@ozlabs.org> +--- + pppd/plugins/radius/util.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pppd/plugins/radius/util.c b/pppd/plugins/radius/util.c +index 6f976a712951..740131e8377c 100644 +--- a/pppd/plugins/radius/util.c ++++ b/pppd/plugins/radius/util.c +@@ -73,9 +73,9 @@ void rc_mdelay(int msecs) + char * + rc_mksid (void) + { +- static char buf[15]; ++ static char buf[32]; + static unsigned short int cnt = 0; +- sprintf (buf, "%08lX%04X%02hX", ++ slprintf(buf, sizeof(buf), "%08lX%04X%02hX", + (unsigned long int) time (NULL), + (unsigned int) getpid (), + cnt & 0xFF); diff --git a/package/network/services/ppp/patches/701-pppd-Fix-bounds-check-in-EAP-code.patch b/package/network/services/ppp/patches/701-pppd-Fix-bounds-check-in-EAP-code.patch new file mode 100644 index 000000000..c2ca9729e --- /dev/null +++ b/package/network/services/ppp/patches/701-pppd-Fix-bounds-check-in-EAP-code.patch @@ -0,0 +1,37 @@ +From 8d7970b8f3db727fe798b65f3377fe6787575426 Mon Sep 17 00:00:00 2001 +From: Paul Mackerras <paulus@ozlabs.org> +Date: Mon, 3 Feb 2020 15:53:28 +1100 +Subject: [PATCH] pppd: Fix bounds check in EAP code + +Given that we have just checked vallen < len, it can never be the case +that vallen >= len + sizeof(rhostname). This fixes the check so we +actually avoid overflowing the rhostname array. + +Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com> +Signed-off-by: Paul Mackerras <paulus@ozlabs.org> +--- + pppd/eap.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pppd/eap.c b/pppd/eap.c +index 94407f56a336..1b93db01aebd 100644 +--- a/pppd/eap.c ++++ b/pppd/eap.c +@@ -1420,7 +1420,7 @@ int len; + } + + /* Not so likely to happen. */ +- if (vallen >= len + sizeof (rhostname)) { ++ if (len - vallen >= sizeof (rhostname)) { + dbglog("EAP: trimming really long peer name down"); + BCOPY(inp + vallen, rhostname, sizeof (rhostname) - 1); + rhostname[sizeof (rhostname) - 1] = '\0'; +@@ -1846,7 +1846,7 @@ int len; + } + + /* Not so likely to happen. */ +- if (vallen >= len + sizeof (rhostname)) { ++ if (len - vallen >= sizeof (rhostname)) { + dbglog("EAP: trimming really long peer name down"); + BCOPY(inp + vallen, rhostname, sizeof (rhostname) - 1); + rhostname[sizeof (rhostname) - 1] = '\0'; diff --git a/package/network/services/ppp/patches/702-pppd-Ignore-received-EAP-messages-when-not-doing-EAP.patch b/package/network/services/ppp/patches/702-pppd-Ignore-received-EAP-messages-when-not-doing-EAP.patch new file mode 100644 index 000000000..7286d81a5 --- /dev/null +++ b/package/network/services/ppp/patches/702-pppd-Ignore-received-EAP-messages-when-not-doing-EAP.patch @@ -0,0 +1,61 @@ +From 8d45443bb5c9372b4c6a362ba2f443d41c5636af Mon Sep 17 00:00:00 2001 +From: Paul Mackerras <paulus@ozlabs.org> +Date: Mon, 3 Feb 2020 16:31:42 +1100 +Subject: [PATCH] pppd: Ignore received EAP messages when not doing EAP + +This adds some basic checks to the subroutines of eap_input to check +that we have requested or agreed to doing EAP authentication before +doing any processing on the received packet. The motivation is to +make it harder for a malicious peer to disrupt the operation of pppd +by sending unsolicited EAP packets. Note that eap_success() already +has a check that the EAP client state is reasonable, and does nothing +(apart from possibly printing a debug message) if not. + +Signed-off-by: Paul Mackerras <paulus@ozlabs.org> +--- + pppd/eap.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/pppd/eap.c b/pppd/eap.c +index 1b93db01aebd..082e95343120 100644 +--- a/pppd/eap.c ++++ b/pppd/eap.c +@@ -1328,6 +1328,12 @@ int len; + int fd; + #endif /* USE_SRP */ + ++ /* ++ * Ignore requests if we're not open ++ */ ++ if (esp->es_client.ea_state <= eapClosed) ++ return; ++ + /* + * Note: we update es_client.ea_id *only if* a Response + * message is being generated. Otherwise, we leave it the +@@ -1736,6 +1742,12 @@ int len; + u_char dig[SHA_DIGESTSIZE]; + #endif /* USE_SRP */ + ++ /* ++ * Ignore responses if we're not open ++ */ ++ if (esp->es_server.ea_state <= eapClosed) ++ return; ++ + if (esp->es_server.ea_id != id) { + dbglog("EAP: discarding Response %d; expected ID %d", id, + esp->es_server.ea_id); +@@ -2047,6 +2059,12 @@ u_char *inp; + int id; + int len; + { ++ /* ++ * Ignore failure messages if we're not open ++ */ ++ if (esp->es_client.ea_state <= eapClosed) ++ return; ++ + if (!eap_client_active(esp)) { + dbglog("EAP unexpected failure message in state %s (%d)", + eap_state_name(esp->es_client.ea_state), diff --git a/package/network/services/shellsync/Makefile b/package/network/services/shellsync/Makefile new file mode 100644 index 000000000..dcbce1d21 --- /dev/null +++ b/package/network/services/shellsync/Makefile @@ -0,0 +1,34 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=shellsync +PKG_VERSION:=0.2 +PKG_RELEASE:=2 + +include $(INCLUDE_DIR)/package.mk + +define Package/shellsync + CATEGORY:=Utilities + TITLE:=shellsync + DEPENDS:=+libpthread +kmod-macvlan +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Package/shellsync/description +A tool to sync different shell scripts.Based on syncppp patch by morfast. +endef + +define Build/Compile + $(TARGET_CROSS)gcc -pthread -o $(PKG_BUILD_DIR)/shellsync $(PKG_BUILD_DIR)/shellsync.c +endef + +define Package/shellsync/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/shellsync $(1)/usr/bin +endef + + +$(eval $(call BuildPackage,shellsync)) diff --git a/package/network/services/shellsync/src/shellsync.c b/package/network/services/shellsync/src/shellsync.c new file mode 100644 index 000000000..4aef1e9ba --- /dev/null +++ b/package/network/services/shellsync/src/shellsync.c @@ -0,0 +1,106 @@ +/************************************************************************* + > File Name: shellsync.c + > Author: GuoGuo + > Mail: gch981213@gmail.com + > Created Time: 2014年11月06日 星期四 19时15分30秒 + ************************************************************************/ +#include<stdio.h> +#include<semaphore.h> +#include<fcntl.h> +#include<stdlib.h> +#include<time.h> +#include<errno.h> +#define SEM_BLOCK_NAME "SYNCSHELL_block" +#define SEM_COUNT_NAME "SYNCSHELL_count" +int wait_timeout; +int sync_wait(int nproc) +{ + int flags; + int value; + sem_t *block; + sem_t *count; + struct timespec ts; + + if (nproc <= 1) { + printf("sync_wait: number of processes should be larger than 1\n"); + return -1; + } + + if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { + printf("clock_gettime error\n"); + return -1; + } + ts.tv_sec += wait_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) { + printf("sync_wait: sem_open failed\n"); + return -1; + } + + if (sem_post(count) < 0) { + printf("sync_wait: sem_post failed\n"); + return -1; + } + if (sem_getvalue(count, &value) < 0) { + printf("sync_wait: sem_getvalue failed\n"); + return -1; + } + printf("%d processes have arrived, waiting for the left %d\n", value, nproc-value); + if (value >= nproc) { + while (nproc-1 > 0) { + if (sem_post(block) < 0) { + printf("sync_wait: sem_post failed\n"); + return -1; + } + nproc--; + } + } else { + if (sem_timedwait(block, &ts) < 0) { + if (errno == ETIMEDOUT) { + printf("sync_wait: sem_timewait time out\n"); + } else { + printf("sync_wait: sem_timewait error\n"); + } + return -1; + } + + } + + sem_close(count); + sem_close(block); + + sem_unlink(SEM_COUNT_NAME); + sem_unlink(SEM_BLOCK_NAME); + + return 0; +} + +int main(int argc,char *argv[]) +{ + if(argc!=3) + { + printf("Usage: shellsync <process num> <wait_timeout>\n"); + } + else + { + int proc_num; + sscanf(argv[1],"%d",&proc_num); + sscanf(argv[2],"%d",&wait_timeout); + if(sync_wait(proc_num)<0) + { + printf("Processes sync failed.\n"); + sem_unlink(SEM_COUNT_NAME); + sem_unlink(SEM_BLOCK_NAME); + return 1; + } + else + { + printf("Processes sync succeed.\n"); + return 0; + } + } +}