1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter-feeds.git synced 2025-02-15 03:51:51 +00:00
This commit is contained in:
suyuan 2024-05-24 02:09:38 +08:00 committed by GitHub
commit 003d429644
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 191 additions and 226 deletions

View file

@ -1,12 +1,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=bcm27xx-eeprom PKG_NAME:=bcm27xx-eeprom
PKG_VERSION:=v.2024.01.05-2712 PKG_VERSION:=v2024.04.20-2712
PKG_RELEASE:=2 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/raspberrypi/rpi-eeprom/tar.gz/$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/raspberrypi/rpi-eeprom/tar.gz/$(PKG_VERSION)?
PKG_HASH:=ae1d9f10e4383ee39b291b4b3be1be583f6f32f806f65a1431da65ca4ccffe39 PKG_HASH:=83ea92e64d9a620376ef081d69f3cdde5a8b376b4a56aeb685f8a56dd10e7b14
PKG_LICENSE:=BSD-3-Clause Custom PKG_LICENSE:=BSD-3-Clause Custom
PKG_LICENSE_FILES:=LICENSE PKG_LICENSE_FILES:=LICENSE
@ -74,21 +74,20 @@ endef
define Package/bcm2711-eeprom/install define Package/bcm2711-eeprom/install
$(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2711 $(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2711
$(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2711/default $(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2711/default
$(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2711/latest
$(CP) $(PKG_BUILD_DIR)/firmware-2711/release-notes.md $(1)/lib/firmware/raspberrypi/bootloader-2711 $(CP) $(PKG_BUILD_DIR)/firmware-2711/release-notes.md $(1)/lib/firmware/raspberrypi/bootloader-2711
$(CP) $(PKG_BUILD_DIR)/firmware-2711/default $(1)/lib/firmware/raspberrypi/bootloader-2711 $(CP) $(PKG_BUILD_DIR)/firmware-2711/default/pieeprom-2024-04-15.bin $(1)/lib/firmware/raspberrypi/bootloader-2711/default
$(CP) $(PKG_BUILD_DIR)/firmware-2711/latest $(1)/lib/firmware/raspberrypi/bootloader-2711 $(CP) $(PKG_BUILD_DIR)/firmware-2711/default/recovery.bin $(1)/lib/firmware/raspberrypi/bootloader-2711/default
$(CP) $(PKG_BUILD_DIR)/firmware-2711/default/vl805-000138c0.bin $(1)/lib/firmware/raspberrypi/bootloader-2711/default
endef endef
define Package/bcm2712-eeprom/install define Package/bcm2712-eeprom/install
$(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2712 $(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2712
$(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2712/default $(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2712/default
$(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader-2712/latest
$(CP) $(PKG_BUILD_DIR)/firmware-2712/release-notes.md $(1)/lib/firmware/raspberrypi/bootloader-2712 $(CP) $(PKG_BUILD_DIR)/firmware-2712/release-notes.md $(1)/lib/firmware/raspberrypi/bootloader-2712
$(CP) $(PKG_BUILD_DIR)/firmware-2712/default $(1)/lib/firmware/raspberrypi/bootloader-2712 $(CP) $(PKG_BUILD_DIR)/firmware-2712/default/pieeprom-2024-04-20.bin $(1)/lib/firmware/raspberrypi/bootloader-2712/default
$(CP) $(PKG_BUILD_DIR)/firmware-2712/latest $(1)/lib/firmware/raspberrypi/bootloader-2712 $(CP) $(PKG_BUILD_DIR)/firmware-2712/default/recovery.bin $(1)/lib/firmware/raspberrypi/bootloader-2712/default
endef endef
$(eval $(call BuildPackage,bcm27xx-eeprom)) $(eval $(call BuildPackage,bcm27xx-eeprom))

View file

@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=iperf PKG_NAME:=iperf
PKG_VERSION:=3.14 PKG_VERSION:=3.17.1
PKG_RELEASE:=10 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/esnet/iperf/archive/refs/tags/ PKG_SOURCE_URL:=https://github.com/esnet/iperf/archive/refs/tags/
PKG_HASH:=bbafa2c9687f0f7fe00947dc779b83c91663911e22460005c0ad4623797b3dbd PKG_HASH:=105b4fe7fbce31c9b94a3fec10c46e3b4b298adc076e1e3af52b990e1faf2db9
PKG_MAINTAINER:=Yannick Chabanois <ycarus@zugaina.org> PKG_MAINTAINER:=Yannick Chabanois <ycarus@zugaina.org>
PKG_LICENSE:=BSD-3-Clause PKG_LICENSE:=BSD-3-Clause

View file

@ -1,67 +1,86 @@
From 26b066b9d4e92442d55950689dbd9fd101b429a7 Mon Sep 17 00:00:00 2001 From 5f71968be8e8809e4e7b876ff04b4ef3f22eb141 Mon Sep 17 00:00:00 2001
From: Paolo Abeni <pabeni@redhat.com> From: Geliang Tang <geliang@kernel.org>
Date: Mon, 14 Jun 2021 16:13:02 +0200 Date: Wed, 6 Mar 2024 11:23:33 +0800
Subject: [PATCH] Add MPTCP support with the --multipath flag Subject: [PATCH] add MPTCPv1 support
Also available with the short option '-m'. The Multipath TCP (MPTCP) protocol (v1 / RFC 8684) has been added in
The MPTCP protocol is really a TCP variant, so this change the upstream Linux kernel since v5.6.
does not implement a new 'struct protocol'. Instead it just
extend the TCP support to optionally enable multipath.
The only required dependency is IPPROTO_MPTCP definition, MPTCP is strongly tied to TCP, and the kernel APIs are almost the same.
which should be provided by the netinet/in.h header. The only required dependency is the 'IPPROTO_MPTCP' protocol number
To keep things simple, just conditionally provide the required definition, which should be provided by the netinet/in.h header if it
protocol, if the system header does not have it yet is recent enough.
This patch adds a new flag '-m' or '--mptcp' to support MPTCPv1. It can
be used like this:
> iperf3 -m -s
> iperf3 -m -c 127.0.0.1
There is no need to check for IPPROTO_MPTCP support in configure.ac
at build time, it is at runtime we will see if the kernel being use
supports or not MPTCP.
If IPPROTO_MPTCP is not supported by the kernel being tested, it is
normal to fail because the feature is not available and the user
explicitly asked to use MPTCP.
Closes: https://github.com/esnet/iperf/pull/1659
Co-developed-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Geliang Tang <geliang@kernel.org>
--- ---
src/iperf.h | 1 + src/iperf.h | 1 +
src/iperf3.1 | 4 ++++ src/iperf3.1 | 4 ++++
src/iperf_api.c | 11 ++++++++++- src/iperf_api.c | 19 ++++++++++++++++++-
src/iperf_locale.c | 1 + src/iperf_locale.c | 3 +++
src/iperf_tcp.c | 18 +++++++++++++++--- src/iperf_tcp.c | 22 +++++++++++++++++++---
5 files changed, 31 insertions(+), 4 deletions(-) src/net.c | 10 +++++-----
src/net.h | 2 +-
7 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/src/iperf.h b/src/iperf.h diff --git a/src/iperf.h b/src/iperf.h
index 3fc91d0c0..e753df944 100644 index dc3c0d1df..cb821e1f7 100644
--- a/src/iperf.h --- a/src/iperf.h
+++ b/src/iperf.h +++ b/src/iperf.h
@@ -315,6 +315,7 @@ struct iperf_test @@ -342,6 +342,7 @@ struct iperf_test
int udp_counters_64bit; /* --use-64-bit-udp-counters */
int forceflush; /* --forceflush - flushing output at every interval */
int multisend;
+ int multipath; /* -m option - multi-path variant */
int repeating_payload; /* --repeating-payload */ int repeating_payload; /* --repeating-payload */
int timestamps; /* --timestamps */ int timestamps; /* --timestamps */
char *timestamp_format; char *timestamp_format;
+ int mptcp; /* -m, --mptcp */
char *json_output_string; /* rendered JSON output if json_output is set */
/* Select related parameters */
diff --git a/src/iperf3.1 b/src/iperf3.1 diff --git a/src/iperf3.1 b/src/iperf3.1
index f5eef6eb3..205a8337e 100644 index 2efd53dea..ebc603408 100644
--- a/src/iperf3.1 --- a/src/iperf3.1
+++ b/src/iperf3.1 +++ b/src/iperf3.1
@@ -228,6 +228,10 @@ run in client mode, connecting to the specified server. @@ -193,6 +193,10 @@ parameter is specified in ms, and defaults to the system settings.
By default, a test consists of sending data from the client to the This functionality depends on the TCP_USER_TIMEOUT socket option, and
server, unless the \-R flag is specified. will not work on systems that do not support it.
.TP .TP
+.BR -m ", " --multipath " " +.BR -m ", " --mptcp " "
+use multipath variant for the current protocol. This only applies to +use mptcp variant for the current protocol. This only applies to
+TCP and enables MPTCP usage. +TCP and enables MPTCP usage.
+.TP +.TP
.BR --sctp .BR -d ", " --debug " "
use SCTP rather than TCP (FreeBSD and Linux) emit debugging output.
.TP Primarily (perhaps exclusively) of use to developers.
diff --git a/src/iperf_api.c b/src/iperf_api.c diff --git a/src/iperf_api.c b/src/iperf_api.c
index f8f2321ec..bea53e397 100644 index 1dcfaabf5..f7f1fbfb8 100644
--- a/src/iperf_api.c --- a/src/iperf_api.c
+++ b/src/iperf_api.c +++ b/src/iperf_api.c
@@ -1007,7 +1007,8 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) @@ -1144,6 +1144,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
{"connect-timeout", required_argument, NULL, OPT_CONNECT_TIMEOUT},
{"idle-timeout", required_argument, NULL, OPT_IDLE_TIMEOUT}, {"idle-timeout", required_argument, NULL, OPT_IDLE_TIMEOUT},
{"rcv-timeout", required_argument, NULL, OPT_RCV_TIMEOUT}, {"rcv-timeout", required_argument, NULL, OPT_RCV_TIMEOUT},
{"snd-timeout", required_argument, NULL, OPT_SND_TIMEOUT}, {"snd-timeout", required_argument, NULL, OPT_SND_TIMEOUT},
+ {"multipath", no_argument, NULL, 'm'}, +#if defined(linux)
+ {"mptcp", no_argument, NULL, 'm'},
+#endif
{"debug", optional_argument, NULL, 'd'}, {"debug", optional_argument, NULL, 'd'},
{"help", no_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
@@ -1030,7 +1031,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) @@ -1169,7 +1172,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
char *client_username = NULL, *client_rsa_public_key = NULL, *server_rsa_private_key = NULL; FILE *ptr_file;
#endif /* HAVE_SSL */ #endif /* HAVE_SSL */
- while ((flag = getopt_long(argc, argv, "p:f:i:D1VJvsc:ub:t:n:k:l:P:Rw:B:M:N46S:L:ZO:F:A:T:C:dI:hX:", longopts, NULL)) != -1) { - while ((flag = getopt_long(argc, argv, "p:f:i:D1VJvsc:ub:t:n:k:l:P:Rw:B:M:N46S:L:ZO:F:A:T:C:dI:hX:", longopts, NULL)) != -1) {
@ -69,49 +88,59 @@ index f8f2321ec..bea53e397 100644
switch (flag) { switch (flag) {
case 'p': case 'p':
portno = atoi(optarg); portno = atoi(optarg);
@@ -1103,6 +1104,10 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) @@ -1639,6 +1642,12 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
iperf_set_test_role(test, 'c'); test->settings->connect_timeout = unit_atoi(optarg);
iperf_set_test_server_hostname(test, optarg);
break;
+ case 'm':
+ set_protocol(test, Ptcp);
+ test->multipath = 1;
+ break;
case 'u':
set_protocol(test, Pudp);
client_flag = 1; client_flag = 1;
@@ -2000,6 +2005,8 @@ send_parameters(struct iperf_test *test) break;
+#if defined(linux)
+ case 'm':
+ set_protocol(test, Ptcp);
+ test->mptcp = 1;
+ break;
+#endif
case 'h':
usage_long(stdout);
exit(0);
@@ -2216,6 +2225,10 @@ send_parameters(struct iperf_test *test)
cJSON_AddTrueToObject(j, "reverse"); cJSON_AddTrueToObject(j, "reverse");
if (test->bidirectional) if (test->bidirectional)
cJSON_AddTrueToObject(j, "bidirectional"); cJSON_AddTrueToObject(j, "bidirectional");
+ if (test->multipath) +#if defined(linux)
+ cJSON_AddTrueToObject(j, "multipath"); + if (test->mptcp)
+ cJSON_AddTrueToObject(j, "mptcp");
+#endif
if (test->settings->socket_bufsize) if (test->settings->socket_bufsize)
cJSON_AddNumberToObject(j, "window", test->settings->socket_bufsize); cJSON_AddNumberToObject(j, "window", test->settings->socket_bufsize);
if (test->settings->blksize) if (test->settings->blksize)
@@ -2112,6 +2119,8 @@ get_parameters(struct iperf_test *test) @@ -2332,6 +2345,10 @@ get_parameters(struct iperf_test *test)
iperf_set_test_reverse(test, 1); iperf_set_test_reverse(test, 1);
if ((j_p = cJSON_GetObjectItem(j, "bidirectional")) != NULL) if ((j_p = cJSON_GetObjectItem(j, "bidirectional")) != NULL)
iperf_set_test_bidirectional(test, 1); iperf_set_test_bidirectional(test, 1);
+ if ((j_p = cJSON_GetObjectItem(j, "multipath")) != NULL) +#if defined(linux)
+ test->multipath = 1; + if ((j_p = cJSON_GetObjectItem(j, "mptcp")) != NULL)
+ test->mptcp = 1;
+#endif
if ((j_p = cJSON_GetObjectItem(j, "window")) != NULL) if ((j_p = cJSON_GetObjectItem(j, "window")) != NULL)
test->settings->socket_bufsize = j_p->valueint; test->settings->socket_bufsize = j_p->valueint;
if ((j_p = cJSON_GetObjectItem(j, "len")) != NULL) if ((j_p = cJSON_GetObjectItem(j, "len")) != NULL)
diff --git a/src/iperf_locale.c b/src/iperf_locale.c diff --git a/src/iperf_locale.c b/src/iperf_locale.c
index e1e9dc5b6..a70bd73b9 100644 index ae0f63a41..d454af4f0 100644
--- a/src/iperf_locale.c --- a/src/iperf_locale.c
+++ b/src/iperf_locale.c +++ b/src/iperf_locale.c
@@ -146,6 +146,7 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n" @@ -128,6 +128,9 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n"
" --nstreams # number of SCTP streams\n" " --snd-timeout # timeout for unacknowledged TCP data\n"
#endif /* HAVE_SCTP_H */ " (in ms, default is system settings)\n"
" -u, --udp use UDP rather than TCP\n" #endif /* HAVE_TCP_USER_TIMEOUT */
+ " -m, --multipath use MPTCP rather than plain TCP\n" +#if defined(linux)
" --connect-timeout # timeout for control connection setup (ms)\n" + " -m, --mptcp use MPTCP rather than plain TCP\n"
" -b, --bitrate #[KMG][/#] target bitrate in bits/sec (0 for unlimited)\n" +#endif
" (default %d Mbit/sec for UDP, unlimited for TCP)\n" " -d, --debug[=#] emit debugging output\n"
--- a/src/iperf_tcp.c 2023-07-07 23:47:41.000000000 +0200 " (optional optional \"=\" and debug level: 1-4. Default is 4 - all messages)\n"
+++ b/src/iperf_tcp.c 2023-08-01 14:53:57.832072168 +0200 " -v, --version show version information and quit\n"
diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c
index 184a1955e..a10322b75 100644
--- a/src/iperf_tcp.c
+++ b/src/iperf_tcp.c
@@ -44,6 +44,10 @@ @@ -44,6 +44,10 @@
#include "net.h" #include "net.h"
#include "cjson.h" #include "cjson.h"
@ -123,86 +152,106 @@ index e1e9dc5b6..a70bd73b9 100644
#if defined(HAVE_FLOWLABEL) #if defined(HAVE_FLOWLABEL)
#include "flowlabel.h" #include "flowlabel.h"
#endif /* HAVE_FLOWLABEL */ #endif /* HAVE_FLOWLABEL */
@@ -154,6 +158,7 @@ @@ -182,9 +186,10 @@ iperf_tcp_listen(struct iperf_test *test)
socklen_t optlen;
int saved_errno;
int rcvbuf_actual, sndbuf_actual;
+ int protocol = 0;
s = test->listener;
@@ -166,7 +171,7 @@
* *
* It's not clear whether this is a requirement or a convenience. * It's not clear whether this is a requirement or a convenience.
*/ */
- if (test->no_delay || test->settings->mss || test->settings->socket_bufsize) { - if (test->no_delay || test->settings->mss || test->settings->socket_bufsize) {
+ if (test->multipath || test->no_delay || test->settings->mss || test->settings->socket_bufsize) { + if (test->no_delay || test->mptcp || test->settings->mss || test->settings->socket_bufsize) {
struct addrinfo hints, *res; struct addrinfo hints, *res;
char portstr[6]; char portstr[6];
+ int proto = 0;
@@ -194,7 +199,10 @@ FD_CLR(s, &test->read_set);
close(s);
@@ -210,7 +215,12 @@ iperf_tcp_listen(struct iperf_test *test)
return -1; return -1;
} }
- if ((s = socket(res->ai_family, SOCK_STREAM, 0)) < 0) { - if ((s = socket(res->ai_family, SOCK_STREAM, 0)) < 0) {
+ if (test->multipath) +#if defined(linux)
+ protocol = IPPROTO_MPTCP; + if (test->mptcp)
+ proto = IPPROTO_MPTCP;
+#endif
+ +
+ if ((s = socket(res->ai_family, SOCK_STREAM, protocol)) < 0) { + if ((s = socket(res->ai_family, SOCK_STREAM, proto)) < 0) {
freeaddrinfo(res); freeaddrinfo(res);
i_errno = IESTREAMLISTEN; i_errno = IESTREAMLISTEN;
return -1; return -1;
@@ -374,8 +382,12 @@ @@ -375,8 +385,14 @@ iperf_tcp_connect(struct iperf_test *test)
socklen_t optlen; socklen_t optlen;
int saved_errno; int saved_errno;
int rcvbuf_actual, sndbuf_actual; int rcvbuf_actual, sndbuf_actual;
+ int protocol = 0; + int proto = 0;
+ +
+ if (test->multipath) +#if defined(linux)
+ protocol = IPPROTO_MPTCP; + if (test->mptcp)
+ proto = IPPROTO_MPTCP;
+#endif
- s = create_socket(test->settings->domain, SOCK_STREAM, test->bind_address, test->bind_dev, test->bind_port, test->server_hostname, test->server_port, &server_res); - s = create_socket(test->settings->domain, SOCK_STREAM, test->bind_address, test->bind_dev, test->bind_port, test->server_hostname, test->server_port, &server_res);
+ s = create_socket(test->settings->domain, SOCK_STREAM, test->bind_address, test->bind_dev, test->bind_port, test->server_hostname, test->server_port, &server_res, protocol); + s = create_socket(test->settings->domain, SOCK_STREAM, proto, test->bind_address, test->bind_dev, test->bind_port, test->server_hostname, test->server_port, &server_res);
if (s < 0) { if (s < 0) {
i_errno = IESTREAMCONNECT; i_errno = IESTREAMCONNECT;
return -1; return -1;
--- a/src/net.c 2023-08-01 14:54:14.175802546 +0200 diff --git a/src/net.c b/src/net.c
+++ b/src/net.c 2023-08-01 14:54:40.831362812 +0200 index c82caff1b..849e919f2 100644
@@ -121,7 +121,7 @@ --- a/src/net.c
+++ b/src/net.c
@@ -124,7 +124,7 @@ timeout_connect(int s, const struct sockaddr *name, socklen_t namelen,
/* create a socket */ /* create a socket */
int int
-create_socket(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, struct addrinfo **server_res_out) -create_socket(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, struct addrinfo **server_res_out)
+create_socket(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, struct addrinfo **server_res_out, int protocol) +create_socket(int domain, int type, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, struct addrinfo **server_res_out)
{ {
struct addrinfo hints, *local_res = NULL, *server_res = NULL; struct addrinfo hints, *local_res = NULL, *server_res = NULL;
int s, saved_errno; int s, saved_errno;
@@ -145,7 +145,7 @@ @@ -133,14 +133,14 @@ create_socket(int domain, int proto, const char *local, const char *bind_dev, in
if (local) {
memset(&hints, 0, sizeof(hints));
hints.ai_family = domain;
- hints.ai_socktype = proto;
+ hints.ai_socktype = type;
if ((gerror = getaddrinfo(local, NULL, &hints, &local_res)) != 0)
return -1;
}
memset(&hints, 0, sizeof(hints));
hints.ai_family = domain;
- hints.ai_socktype = proto;
+ hints.ai_socktype = type;
snprintf(portstr, sizeof(portstr), "%d", port);
if ((gerror = getaddrinfo(server, portstr, &hints, &server_res)) != 0) {
if (local)
@@ -148,7 +148,7 @@ create_socket(int domain, int proto, const char *local, const char *bind_dev, in
return -1; return -1;
} }
- s = socket(server_res->ai_family, proto, 0); - s = socket(server_res->ai_family, proto, 0);
+ s = socket(server_res->ai_family, proto, protocol); + s = socket(server_res->ai_family, type, proto);
if (s < 0) { if (s < 0) {
if (local) if (local)
freeaddrinfo(local_res); freeaddrinfo(local_res);
@@ -235,7 +235,7 @@ @@ -238,7 +238,7 @@ netdial(int domain, int proto, const char *local, const char *bind_dev, int loca
struct addrinfo *server_res = NULL; struct addrinfo *server_res = NULL;
int s, saved_errno; int s, saved_errno;
- s = create_socket(domain, proto, local, bind_dev, local_port, server, port, &server_res); - s = create_socket(domain, proto, local, bind_dev, local_port, server, port, &server_res);
+ s = create_socket(domain, proto, local, bind_dev, local_port, server, port, &server_res, 0); + s = create_socket(domain, proto, 0, local, bind_dev, local_port, server, port, &server_res);
if (s < 0) { if (s < 0) {
return -1; return -1;
} }
--- a/src/net.h 2023-08-01 15:01:58.208159540 +0200 diff --git a/src/net.h b/src/net.h
+++ b/src/net.h 2023-08-01 15:00:46.521337885 +0200 index f0e1b4f98..1f5cc4d34 100644
--- a/src/net.h
+++ b/src/net.h
@@ -28,7 +28,7 @@ @@ -28,7 +28,7 @@
#define __NET_H #define __NET_H
int timeout_connect(int s, const struct sockaddr *name, socklen_t namelen, int timeout); int timeout_connect(int s, const struct sockaddr *name, socklen_t namelen, int timeout);
-int create_socket(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, struct addrinfo **server_res_out); -int create_socket(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, struct addrinfo **server_res_out);
+int create_socket(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, struct addrinfo **server_res_out, int protocol); +int create_socket(int domain, int type, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, struct addrinfo **server_res_out);
int netdial(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, int timeout); int netdial(int domain, int proto, const char *local, const char *bind_dev, int local_port, const char *server, int port, int timeout);
int netannounce(int domain, int proto, const char *local, const char *bind_dev, int port); int netannounce(int domain, int proto, const char *local, const char *bind_dev, int port);
int Nread(int fd, char *buf, size_t count, int prot); int Nread(int fd, char *buf, size_t count, int prot);

View file

@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=iproute2 PKG_NAME:=iproute2
PKG_VERSION:=6.7.0 PKG_VERSION:=6.9.0
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2 PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
PKG_HASH:=ff942dd9828d7d1f867f61fe72ce433078c31e5d8e4a78e20f02cb5892e8841d PKG_HASH:=2f643d09ea11a4a2a043c92e2b469b5f73228cbf241ae806760296ed0ec413d0
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1
PKG_BUILD_DEPENDS:=iptables PKG_BUILD_DEPENDS:=iptables
PKG_LICENSE:=GPL-2.0 PKG_LICENSE:=GPL-2.0

View file

@ -1,108 +0,0 @@
--- a/ip/Makefile
+++ b/ip/Makefile
@@ -19,6 +19,13 @@ RTMONOBJ=rtmon.o
include ../config.mk
+STATIC_SYM_FILTER:=
+ifeq ($(IP_CONFIG_TINY),y)
+ STATIC_SYM_FILTER:=iplink_can.c iplink_ipoib.c iplink_vxlan.c
+ CFLAGS += -DIPROUTE2_TINY
+endif
+STATIC_SYM_SOURCES:=$(filter-out $(STATIC_SYM_FILTER),$(wildcard *.c))
+
ALLOBJ=$(IPOBJ) $(RTMONOBJ)
SCRIPTS=routel
TARGETS=ip rtmon
@@ -48,7 +55,7 @@ else
ip: static-syms.o
static-syms.o: static-syms.h
-static-syms.h: $(wildcard *.c)
+static-syms.h: $(STATIC_SYM_SOURCES)
files="$^" ; \
for s in `grep -B 3 '\<dlsym' $$files | sed -n '/snprintf/{s:.*"\([^"]*\)".*:\1:;s:%s::;p}'` ; do \
sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \
--- a/ip/ip.c
+++ b/ip/ip.c
@@ -61,11 +61,17 @@ static void usage(void)
fprintf(stderr,
"Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n"
" ip [ -force ] -batch filename\n"
+#ifndef IPROUTE2_TINY
"where OBJECT := { address | addrlabel | amt | fou | help | ila | ioam | l2tp |\n"
" link | macsec | maddress | monitor | mptcp | mroute | mrule |\n"
" neighbor | neighbour | netconf | netns | nexthop | ntable |\n"
" ntbl | route | rule | sr | tap | tcpmetrics |\n"
" token | tunnel | tuntap | vrf | xfrm }\n"
+#else
+ "where OBJECT := { address | link | maddress | monitor |\n"
+ " neighbor | neighbour | netns | route |\n"
+ " rule | token | tunnel }\n"
+#endif
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n"
" -h[uman-readable] | -iec | -j[son] | -p[retty] |\n"
" -f[amily] { inet | inet6 | mpls | bridge | link } |\n"
@@ -88,37 +94,49 @@ static const struct cmd {
int (*func)(int argc, char **argv);
} cmds[] = {
{ "address", do_ipaddr },
+#ifndef IPROUTE2_TINY
{ "addrlabel", do_ipaddrlabel },
+#endif
{ "maddress", do_multiaddr },
{ "route", do_iproute },
{ "rule", do_iprule },
{ "neighbor", do_ipneigh },
{ "neighbour", do_ipneigh },
+#ifndef IPROUTE2_TINY
{ "ntable", do_ipntable },
{ "ntbl", do_ipntable },
+#endif
{ "link", do_iplink },
+#ifndef IPROUTE2_TINY
{ "l2tp", do_ipl2tp },
{ "fou", do_ipfou },
{ "ila", do_ipila },
{ "macsec", do_ipmacsec },
+#endif
{ "tunnel", do_iptunnel },
{ "tunl", do_iptunnel },
+#ifndef IPROUTE2_TINY
{ "tuntap", do_iptuntap },
{ "tap", do_iptuntap },
{ "token", do_iptoken },
{ "tcpmetrics", do_tcp_metrics },
{ "tcp_metrics", do_tcp_metrics },
+#endif
{ "monitor", do_ipmonitor },
+#ifndef IPROUTE2_TINY
{ "xfrm", do_xfrm },
{ "mroute", do_multiroute },
{ "mrule", do_multirule },
+#endif
{ "netns", do_netns },
+#ifndef IPROUTE2_TINY
{ "netconf", do_ipnetconf },
{ "vrf", do_ipvrf},
{ "sr", do_seg6 },
{ "nexthop", do_ipnh },
{ "mptcp", do_mptcp },
{ "ioam", do_ioam6 },
+#endif
{ "help", do_help },
{ "stats", do_ipstats },
{ 0 }
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -3,6 +3,10 @@ include ../config.mk
CFLAGS += $(FPIC)
+ifeq ($(IP_CONFIG_TINY),y)
+ CFLAGS += -DIPROUTE2_TINY
+endif
+
UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \
names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o ppp_proto.o

View file

@ -232,7 +232,7 @@ local statuslogo = ucic:get("openmptcprouter","settings","statuslogo") or "openm
if (mArray.openmptcprouter.tun6_state == "DOWN") if (mArray.openmptcprouter.tun6_state == "DOWN")
{ {
statusMessage += '<%:IPv6 tunnel DOWN%>' + '<br/>'; statusMessage += '<%:IPv6 tunnel DOWN%>' + '<br/>';
} else if (mArray.openmptcprouter.wan_addr6 == '') } else if (mArray.openmptcprouter.wan_addr6 == '' && mArray.openmptcprouter.dns_filter_aaaa == false)
{ {
statusMessage += '<%:No IPv6 access%>' + '<br/>'; statusMessage += '<%:No IPv6 access%>' + '<br/>';
} }

View file

@ -10,13 +10,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=net-tools PKG_NAME:=net-tools
PKG_SOURCE_DATE:=2018-11-03 PKG_SOURCE_DATE:=2023-06-29
PKG_SOURCE_VERSION:=0eebece8c964e3cfa8a018f42b2e7e751a7009a0 PKG_SOURCE_VERSION:=20a78e06a69bd9b6b4e15468201d5d3aa9c395db
PKG_RELEASE:=2 PKG_RELEASE:=2
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://git.code.sf.net/p/net-tools/code PKG_SOURCE_URL:=https://git.code.sf.net/p/net-tools/code
PKG_MIRROR_HASH:=9d978b9f8ccae4af623a299155c62d9b3d31213182c785f925bf8704d48a04c9
PKG_MAINTAINER:=Yannick Chabanois <ycarus@zugaina.org> PKG_MAINTAINER:=Yannick Chabanois <ycarus@zugaina.org>
PKG_LICENSE:=GPL-2.0-or-later PKG_LICENSE:=GPL-2.0-or-later

View file

@ -13,6 +13,9 @@
set_shadowsocks_address() { set_shadowsocks_address() {
uci -q set shadowsocks-libev.$1.local_address="$2" uci -q set shadowsocks-libev.$1.local_address="$2"
} }
set_shadowsocks_rust_address() {
uci -q set shadowsocks-rust.$1.local_address="$2"
}
set_ipv6_state() { set_ipv6_state() {
local disable_ipv6="$(uci -q get openmptcprouter.settings.disable_ipv6)" local disable_ipv6="$(uci -q get openmptcprouter.settings.disable_ipv6)"
@ -39,8 +42,11 @@ set_ipv6_state() {
EOF EOF
config_load shadowsocks-libev config_load shadowsocks-libev
config_foreach set_shadowsocks_address ss_redir "0.0.0.0" config_foreach set_shadowsocks_address ss_redir "0.0.0.0"
config_load shadowsocks-rust
config_foreach set_shadowsocks_rust_address ss_redir "0.0.0.0"
uci -q batch <<-EOF >/dev/null uci -q batch <<-EOF >/dev/null
commit shadowsocks-libev commit shadowsocks-libev
commit shadowsocks-rust
EOF EOF
[ ! -f /etc/wgetrc ] && cp /etc/wgetrc4 /etc/wgetrc [ ! -f /etc/wgetrc ] && cp /etc/wgetrc4 /etc/wgetrc
else else
@ -62,12 +68,16 @@ set_ipv6_state() {
config_load shadowsocks-libev config_load shadowsocks-libev
config_foreach set_shadowsocks_address ss_redir "::" config_foreach set_shadowsocks_address ss_redir "::"
config_load shadowsocks-rust
config_foreach set_shadowsocks_rust_address ss_redir "::"
uci -q batch <<-EOF >/dev/null uci -q batch <<-EOF >/dev/null
commit network commit network
commit dhcp commit dhcp
commit shadowsocks-libev commit shadowsocks-libev
commit shadowsocks-rust
EOF EOF
/etc/init.d/shadowsocks-libev restart /etc/init.d/shadowsocks-libev restart
/etc/init.d/shadowsocks-rust restart
if [ "$(uci -q get v2ray.main.inbounds | grep omr6)" = "" ]; then if [ "$(uci -q get v2ray.main.inbounds | grep omr6)" = "" ]; then
uci -q batch <<-EOF >/dev/null uci -q batch <<-EOF >/dev/null
add_list v2ray.main.inbounds="omr6" add_list v2ray.main.inbounds="omr6"

View file

@ -101,6 +101,10 @@ if [ -z "$(pgrep ModemManager)" ] && [ -f /etc/init.d/modemmanager ] && [ -n "$(
_log "Can't find ModemManager, restart it..." _log "Can't find ModemManager, restart it..."
/etc/init.d/modemmanager restart 2>&1 >/dev/null /etc/init.d/modemmanager restart 2>&1 >/dev/null
sleep 5 sleep 5
elif [ -n "$(pgrep ModemManager)" ] && [ -f /etc/init.d/modemmanager ] && [ -n "$(uci -q show network | grep modemmanager)" ] && [ -z "$(timeout 2 mmcli -L)" ]; then
_log "ModemManager doesn't answer, restart it..."
/etc/init.d/modemmanager restart 2>&1 >/dev/null
sleep 5
#elif [ -n "$(pgrep ModemManager)" ] && [ -f /etc/init.d/modemmanager ] && [ -z "$(uci -q show network | grep modemmanager)" ]; then #elif [ -n "$(pgrep ModemManager)" ] && [ -f /etc/init.d/modemmanager ] && [ -z "$(uci -q show network | grep modemmanager)" ]; then
# _log "ModemManager not used, stop it..." # _log "ModemManager not used, stop it..."
# /etc/init.d/modemmanager stop 2>&1 >/dev/null # /etc/init.d/modemmanager stop 2>&1 >/dev/null

View file

@ -793,6 +793,12 @@ function interfaces_status()
if net then if net then
ipaddr = net:ipaddr() ipaddr = net:ipaddr()
end end
if ipaddr == "" then
net = ntm:get_network("LAN")
if net then
ipaddr = net:ipaddr()
end
end
mArray.openmptcprouter["local_addr"] = ipaddr mArray.openmptcprouter["local_addr"] = ipaddr
--mArray.openmptcprouter["local_addr"] = uci:get("network", "lan", "ipaddr") --mArray.openmptcprouter["local_addr"] = uci:get("network", "lan", "ipaddr")
mArray.openmptcprouter["hostname"] = "OpenMPTCProuter" mArray.openmptcprouter["hostname"] = "OpenMPTCProuter"
@ -813,6 +819,12 @@ function interfaces_status()
if dns_test == "" then if dns_test == "" then
mArray.openmptcprouter["dns"] = true mArray.openmptcprouter["dns"] = true
end end
if uci:get("dhcp","dnsmasq1","filter_aaa") == "1" then
mArray.openmptcprouter["dns_filter_aaa"] = true
end
if uci:get("dhcp","dnsmasq1","filter_a") == "1" then
mArray.openmptcprouter["dns_filter_a"] = true
end
mArray.openmptcprouter["ipv6"] = "disabled" mArray.openmptcprouter["ipv6"] = "disabled"
if uci:get("openmptcprouter","settings","disable_ipv6") ~= "1" then if uci:get("openmptcprouter","settings","disable_ipv6") ~= "1" then

View file

@ -88,7 +88,7 @@ MY_DEPENDS := \
shadowsocks-rust-sslocal shadowsocks-rust-ssservice LINUX_5_4:shadowsocks-rust-config !LINUX_5_4:shadowsocks-rust-config-nft luci-app-shadowsocks-rust \ shadowsocks-rust-sslocal shadowsocks-rust-ssservice LINUX_5_4:shadowsocks-rust-config !LINUX_5_4:shadowsocks-rust-config-nft luci-app-shadowsocks-rust \
luci-proto-external omr-schedule jq luci-app-ddns \ luci-proto-external omr-schedule jq luci-app-ddns \
LINUX_6_6:mptcp-bpf-burst LINUX_6_6:mptcp-bpf-first LINUX_6_6:mptcp-bpf-red LINUX_6_6:mptcp-bpf-rr LINUX_6_6:bpftool-full \ LINUX_6_6:mptcp-bpf-burst LINUX_6_6:mptcp-bpf-first LINUX_6_6:mptcp-bpf-red LINUX_6_6:mptcp-bpf-rr LINUX_6_6:bpftool-full \
mbim-utils mbim-utils (TARGET_x86||TARGET_x86_64):kmod-r8169
# !TARGET_ipq40xx:kmod-rt2800-usb (TARGET_x86||TARGET_x86_64):kmod-iwlwifi (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl1000 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl100 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl105 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl135 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl2000 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl2030 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl3160 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl3168 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl5000 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl5150 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl6000g2 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl6000g2a (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl6000g2b (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl6050 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl7260 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl7265 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl7265d (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl8260c (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl8265 \ # !TARGET_ipq40xx:kmod-rt2800-usb (TARGET_x86||TARGET_x86_64):kmod-iwlwifi (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl1000 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl100 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl105 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl135 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl2000 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl2030 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl3160 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl3168 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl5000 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl5150 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl6000g2 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl6000g2a (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl6000g2b (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl6050 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl7260 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl7265 (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl7265d (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl8260c (TARGET_x86||TARGET_x86_64):iwlwifi-firmware-iwl8265 \
# !TARGET_ipq40xx:kmod-rtl8xxxu !TARGET_ipq40xx:kmod-rtl8192cu !TARGET_ipq40xx:kmod-net-rtl8192su !LINUX_6_1:kmod-rtl8812au-ct (TARGET_x86||TARGET_x86_64):kmod-r8169 (TARGET_x86||TARGET_x86_64):kmod-8139too (TARGET_x86||TARGET_x86_64):kmod-r8125 !TARGET_ipq40xx:kmod-rtl8187 kmod-rtl8xxxu (TARGET_x86||TARGET_x86_64):rtl8192eu-firmware # !TARGET_ipq40xx:kmod-rtl8xxxu !TARGET_ipq40xx:kmod-rtl8192cu !TARGET_ipq40xx:kmod-net-rtl8192su !LINUX_6_1:kmod-rtl8812au-ct (TARGET_x86||TARGET_x86_64):kmod-r8169 (TARGET_x86||TARGET_x86_64):kmod-8139too (TARGET_x86||TARGET_x86_64):kmod-r8125 !TARGET_ipq40xx:kmod-rtl8187 kmod-rtl8xxxu (TARGET_x86||TARGET_x86_64):rtl8192eu-firmware

View file

@ -10,7 +10,7 @@ PORTS=$(uci -q get iperf.$SERVER.ports | sed 's/,/ /g')
PORT="${PORTS%% *}" PORT="${PORTS%% *}"
echo $KEY | base64 -d > /tmp/iperf.pem echo $KEY | base64 -d > /tmp/iperf.pem
if [ -n "$PASSWORD" ] && [ -n "$USER" ] && [ -n "$KEY" ]; then if [ -n "$PASSWORD" ] && [ -n "$USER" ] && [ -n "$KEY" ]; then
IPERF3_PASSWORD=$PASSWORD iperf3 --username $USER --rsa-public-key-path /tmp/iperf.pem -c $HOST -p $PORT ${@} IPERF3_PASSWORD=$PASSWORD iperf3 --username $USER --rsa-public-key-path /tmp/iperf.pem --use-pkcs1-padding -c $HOST -p $PORT ${@}
else else
iperf3 -c $HOST -p $PORT ${@} iperf3 -c $HOST -p $PORT ${@}
fi fi

View file

@ -6,7 +6,7 @@ if [ "$(uci -q get omr-tracker.omrvpn)" = "" ]; then
set omr-tracker.omrvpn=interface set omr-tracker.omrvpn=interface
set omr-tracker.omrvpn.type="none" set omr-tracker.omrvpn.type="none"
set omr-tracker.omrvpn.timeout=10 set omr-tracker.omrvpn.timeout=10
set omr-tracker.omrvpn.tries=3 set omr-tracker.omrvpn.tries=2
set omr-tracker.omrvpn.interval=5 set omr-tracker.omrvpn.interval=5
set omr-tracker.omrvpn.mail_alert=0 set omr-tracker.omrvpn.mail_alert=0
set omr-tracker.omrvpn.enabled=1 set omr-tracker.omrvpn.enabled=1
@ -20,7 +20,7 @@ if [ "$(uci -q get omr-tracker.omrvpn)" = "" ]; then
set omr-tracker.omrvpn.reliability='1' set omr-tracker.omrvpn.reliability='1'
set omr-tracker.omrvpn.count='1' set omr-tracker.omrvpn.count='1'
set omr-tracker.omrvpn.failure_interval='3' set omr-tracker.omrvpn.failure_interval='3'
set omr-tracker.omrvpn.tries_up='3 set omr-tracker.omrvpn.tries_up='1'
commit omr-tracker commit omr-tracker
EOF EOF
fi fi

View file

@ -8,7 +8,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=xray PKG_NAME:=xray
PKG_VERSION:=1.8.11 PKG_VERSION:=1.8.13
PKG_RELEASE:=1 PKG_RELEASE:=1
PKG_LICENSE:=MPLv2 PKG_LICENSE:=MPLv2
@ -16,7 +16,7 @@ PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Yannick Chabanois <contact@openmptcprouter.com> PKG_MAINTAINER:=Yannick Chabanois <contact@openmptcprouter.com>
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/XTLS/Xray-core.git PKG_SOURCE_URL:=https://github.com/XTLS/Xray-core.git
PKG_SOURCE_VERSION:=b98d060ee0d709b069251c64543029020c87159b PKG_SOURCE_VERSION:=3120ca41210312c5c8b1795eaf3dbf54531e437e
PKG_BUILD_DEPENDS:=golang/host PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1