Compare commits
146 commits
openwrt-22
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
61f15a76a6 | ||
|
9090aefa69 | ||
|
6a7a1a5dab | ||
|
5b1caf1968 | ||
|
b40ad195c2 | ||
|
6f74738b72 | ||
|
96b5fa139c | ||
|
a5ec54aee3 | ||
|
f0f1b0a33e | ||
|
28b8a5eafe | ||
|
b69c62925f | ||
|
1bdab4b1b5 | ||
|
601bd6c045 | ||
|
2a725e7cbe | ||
|
49da9e9f46 | ||
|
fe1c67fb3d | ||
|
c2124dd2ad | ||
|
9fb9d9343e | ||
|
88c98c910a | ||
|
d86c0c24c8 | ||
|
364379c056 | ||
|
6f6bcba663 | ||
|
167d93cc32 | ||
|
8fd009ed71 | ||
|
e7ee4c55de | ||
|
5beb3be9b8 | ||
|
e4a53c1354 | ||
|
3eb9aa3056 | ||
|
967dde509b | ||
|
eb8978ebf7 | ||
|
91e07907fa | ||
|
0221a2a001 | ||
|
c7bc308c78 | ||
|
fa136b70df | ||
|
9e13652bbf | ||
|
26f5f0f812 | ||
|
bdf923742a | ||
|
04a287eea0 | ||
|
f165789ced | ||
|
06b7d9b665 | ||
|
5aa683be13 | ||
|
299ee2b1cf | ||
|
89cf0d5619 | ||
|
28d204148a | ||
|
61997c86b0 | ||
|
f818fe716e | ||
|
53a53b8ee3 | ||
|
7928f7d399 | ||
|
b3b01af314 | ||
|
c993ee8a89 | ||
|
7b1911020b | ||
|
aab3b64e09 | ||
|
dc5e428ee4 | ||
|
618e80a06a | ||
|
593a514ab5 | ||
|
04bbb0a87e | ||
|
3d6c7c64a9 | ||
|
b23dadccf2 | ||
|
6afc0452c2 | ||
|
e8856b93da | ||
|
c9a8f2d032 | ||
|
03ca0722f7 | ||
|
51c05a1030 | ||
|
3e96c851a7 | ||
|
a26e3441d8 | ||
|
e2eb84791c | ||
|
67ad3b9b96 | ||
|
9febc56a44 | ||
|
8fe743c2a1 | ||
|
2eb71d7d7a | ||
|
1b063f315e | ||
|
c37fbab8f5 | ||
|
d32f93e049 | ||
|
6697ca291f | ||
|
914c27aeb6 | ||
|
5d87b95697 | ||
|
3f74d8a16a | ||
|
521a4068de | ||
|
8a82f32d3f | ||
|
7d6f3c0492 | ||
|
14afd9b172 | ||
|
20e1b16a97 | ||
|
bb65c3a18d | ||
|
3d5c0b5532 | ||
|
64fbf9a16c | ||
|
b70ac8f9da | ||
|
b4034e4ae1 | ||
|
18168b3468 | ||
|
d27be8dad9 | ||
|
c8ba43a99b | ||
|
7d5e0de8a6 | ||
|
53ab677c9e | ||
|
b65ef40e46 | ||
|
c470bff2d8 | ||
|
a1d97192f8 | ||
|
7086d85595 | ||
|
d5c4ef98c9 | ||
|
6c31b5bd1c | ||
|
a3843dd321 | ||
|
5ca59df102 | ||
|
fb4beaee20 | ||
|
081291592e | ||
|
c2f9428ac5 | ||
|
079c922b54 | ||
|
88ee3e69d6 | ||
|
fb41ed5cc8 | ||
|
6cccf1fd65 | ||
|
290ed82bd8 | ||
|
b6f063dcca | ||
|
6af0f221b2 | ||
|
5db5b129f8 | ||
|
0e88798681 | ||
|
4a2b53b10d | ||
|
9abed61018 | ||
|
1fa9fa339c | ||
|
cfd82729a9 | ||
|
bb5bbc6afd | ||
|
d705f79890 | ||
|
217330bb5e | ||
|
09d5ceb923 | ||
|
e2d72c5775 | ||
|
80817c8d59 | ||
|
983096d308 | ||
|
9028f67afd | ||
|
50e02d4cff | ||
|
4216c909aa | ||
|
8770d8ffb6 | ||
|
b35766330b | ||
|
6a5c3db321 | ||
|
4868b8941c | ||
|
b65a8ca03a | ||
|
20621cf8a1 | ||
|
0fd4ed1d3e | ||
|
d929509b12 | ||
|
b1d9a55b49 | ||
|
500352d44f | ||
|
73195d63da | ||
|
8574cb411a | ||
|
65f747a8bc | ||
|
5702d2e40b | ||
|
2134c56d12 | ||
|
93efc5b8e1 | ||
|
dbff012a2f | ||
|
a618159d33 | ||
|
e3c6842923 | ||
|
d078190b84 |
130 changed files with 1702 additions and 10829 deletions
10
.github/workflows/multi-arch-test-build.yml
vendored
10
.github/workflows/multi-arch-test-build.yml
vendored
|
@ -15,12 +15,12 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- arch: aarch64_cortex-a53
|
||||
target: mvebu-cortexa53
|
||||
- arch: aarch64_generic
|
||||
target: armsr-armv8
|
||||
runtime_test: true
|
||||
|
||||
- arch: arm_cortex-a15_neon-vfpv4
|
||||
target: armvirt-32
|
||||
target: armsr-armv7
|
||||
runtime_test: true
|
||||
|
||||
- arch: arm_cortex-a9_vfpv3-d16
|
||||
|
@ -43,6 +43,10 @@ jobs:
|
|||
target: mpc85xx-p1010
|
||||
runtime_test: false
|
||||
|
||||
- arch: riscv64_riscv64
|
||||
target: sifiveu-generic
|
||||
runtime_test: false
|
||||
|
||||
- arch: x86_64
|
||||
target: x86-64
|
||||
runtime_test: true
|
||||
|
|
|
@ -3,18 +3,19 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=alfred
|
||||
PKG_VERSION:=2022.0
|
||||
PKG_RELEASE:=4
|
||||
PKG_VERSION:=2024.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_HASH:=abba1dac61eccfcd6329e7331d0555fecc937760fb36c6cf55ce6c1d751cfd98
|
||||
PKG_HASH:=d029a43638ab16771e5f71e134bc843d1713d74041c65bcda18a31d18f5531bd
|
||||
|
||||
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
PKG_LICENSE:=GPL-2.0-only MIT
|
||||
PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
PKG_BUILD_FLAGS:=gc-sections lto
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_ALFRED_NEEDS_lua \
|
||||
|
@ -67,9 +68,6 @@ MAKE_FLAGS += \
|
|||
LIBNL_GENL_NAME="libnl-tiny" \
|
||||
REVISION="$(PKG_VERSION)-openwrt-$(PKG_RELEASE)"
|
||||
|
||||
TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto
|
||||
TARGET_LDFLAGS += -Wl,--gc-sections -fuse-linker-plugin
|
||||
|
||||
define Package/alfred/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
cp -fpR $(PKG_BUILD_DIR)/alfred $(1)/usr/sbin/
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 19 Feb 2022 08:51:28 +0100
|
||||
Subject: alfred: Ensure processed change_iface packet is 0-terminated
|
||||
|
||||
A client sending a alfred_change_interface_v0 packet to the alfred server
|
||||
might have forgotten to 0-terminate the string. In this case, strstr in
|
||||
unix_sock_change_iface might read outside of the available buffer.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/alfred.git/commit/d2d27e4b9d697928d21dfa5c79908618ef8b56ac
|
||||
|
||||
--- a/unix_sock.c
|
||||
+++ b/unix_sock.c
|
||||
@@ -329,6 +329,8 @@ unix_sock_change_iface(struct globals *g
|
||||
if (len < (int)(sizeof(*change_iface) - sizeof(change_iface->header)))
|
||||
goto err;
|
||||
|
||||
+ change_iface->ifaces[sizeof(change_iface->ifaces) - 1] = '\0';
|
||||
+
|
||||
if (globals->opmode == OPMODE_SECONDARY) {
|
||||
if (strstr(change_iface->ifaces, ",") != NULL) {
|
||||
ret = -EINVAL;
|
|
@ -1,22 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 19 Feb 2022 08:51:28 +0100
|
||||
Subject: alfred: Ensure processed change_bat_iface packet is 0-terminated
|
||||
|
||||
A client sending a alfred_change_bat_iface_v0 packet to the alfred server
|
||||
might have forgotten to 0-terminate the string. In this case, strdup in
|
||||
alfred_change_bat_iface_v0 might read outside of the available buffer.
|
||||
|
||||
Fixes: b96cc742ef3e ("alfred: introduce 'change batman-adv interface' IPC call")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/alfred.git/commit/6beca03bdafd24cc46b4aa7ff2b87612471bdab0
|
||||
|
||||
--- a/unix_sock.c
|
||||
+++ b/unix_sock.c
|
||||
@@ -360,6 +360,7 @@ unix_sock_change_bat_iface(struct global
|
||||
goto err;
|
||||
|
||||
free(globals->mesh_iface);
|
||||
+ change_bat_iface->bat_iface[sizeof(change_bat_iface->bat_iface) - 1] = '\0';
|
||||
globals->mesh_iface = strdup(change_bat_iface->bat_iface);
|
||||
|
||||
ret = 0;
|
|
@ -6,12 +6,12 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=babeld
|
||||
PKG_VERSION:=1.12.2
|
||||
PKG_VERSION:=1.13.1
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://www.irif.fr/~jch/software/files/
|
||||
PKG_HASH:=1db22b6193070ea2450a1ab51196fd72f58a1329f780cb0388e2e4b2e7768cbb
|
||||
PKG_HASH:=15f24d26da0ccfc073abcdef0309f281e4684f2aa71126f826572c4c845e8dd9
|
||||
|
||||
PKG_MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>, \
|
||||
Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>, \
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
struct timeval now;
|
||||
|
||||
unsigned char myid[8];
|
||||
@@ -521,6 +523,9 @@ main(int argc, char **argv)
|
||||
@@ -505,6 +507,9 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
|||
init_signals();
|
||||
rc = resize_receive_buffer(1500);
|
||||
if(rc < 0)
|
||||
@@ -616,6 +621,8 @@ main(int argc, char **argv)
|
||||
@@ -597,6 +602,8 @@ main(int argc, char **argv)
|
||||
FD_SET(local_sockets[i].fd, &readfds);
|
||||
maxfd = MAX(maxfd, local_sockets[i].fd);
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
|||
rc = select(maxfd + 1, &readfds, NULL, NULL, &tv);
|
||||
if(rc < 0) {
|
||||
if(errno != EINTR) {
|
||||
@@ -684,6 +691,9 @@ main(int argc, char **argv)
|
||||
@@ -665,6 +672,9 @@ main(int argc, char **argv)
|
||||
i++;
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@
|
|||
static struct filter *input_filters = NULL;
|
||||
static struct filter *output_filters = NULL;
|
||||
static struct filter *redistribute_filters = NULL;
|
||||
@@ -1036,7 +1038,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
||||
@@ -1024,7 +1026,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
||||
strcmp(token, "daemonise") == 0 ||
|
||||
strcmp(token, "skip-kernel-setup") == 0 ||
|
||||
strcmp(token, "ipv6-subtrees") == 0 ||
|
||||
|
@ -67,7 +67,7 @@
|
|||
int b;
|
||||
c = getbool(c, &b, gnc, closure);
|
||||
if(c < -1)
|
||||
@@ -1054,6 +1057,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
||||
@@ -1042,6 +1045,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
||||
has_ipv6_subtrees = b;
|
||||
else if(strcmp(token, "reflect-kernel-metric") == 0)
|
||||
reflect_kernel_metric = b;
|
||||
|
|
|
@ -245,23 +245,6 @@ static int babeld_ubus_get_xroutes(struct ubus_context *ctx_local,
|
|||
static void babeld_add_route_buf(struct babel_route *route,
|
||||
struct blob_buf *b) {
|
||||
void *prefix;
|
||||
char channels[100];
|
||||
|
||||
if (route->channels_len == 0) {
|
||||
channels[0] = '\0';
|
||||
} else {
|
||||
int i, j = 0;
|
||||
snprintf(channels, sizeof(channels), " chan (");
|
||||
j = strlen(channels);
|
||||
for (i = 0; i < route->channels_len; i++) {
|
||||
if (i > 0)
|
||||
channels[j++] = ',';
|
||||
snprintf(channels + j, sizeof(channels) - j, "%u",
|
||||
(unsigned)route->channels[i]);
|
||||
j = strlen(channels);
|
||||
}
|
||||
snprintf(channels + j, sizeof(channels) - j, ")");
|
||||
}
|
||||
|
||||
prefix = blobmsg_open_table(
|
||||
b, format_prefix(route->src->prefix, route->src->plen));
|
||||
|
@ -274,7 +257,6 @@ static void babeld_add_route_buf(struct babel_route *route,
|
|||
blobmsg_add_u32(b, "refmetric", route->refmetric);
|
||||
blobmsg_add_string(b, "id", format_eui64(route->src->id));
|
||||
blobmsg_add_u32(b, "seqno", (uint32_t)route->seqno);
|
||||
blobmsg_add_string(b, "channels", channels);
|
||||
blobmsg_add_u32(b, "age", (int)(now.tv_sec - route->time));
|
||||
blobmsg_add_string(b, "via", format_address(route->neigh->address));
|
||||
if (memcmp(route->nexthop, route->neigh->address, 16) != 0)
|
||||
|
@ -357,7 +339,6 @@ static void babeld_add_neighbour_buf(struct neighbour *neigh,
|
|||
blobmsg_add_u32(b, "rxcost", neighbour_rxcost(neigh));
|
||||
blobmsg_add_u32(b, "txcost", neigh->txcost);
|
||||
blobmsg_add_string(b, "rtt", format_thousands(neigh->rtt));
|
||||
blobmsg_add_u32(b, "channel", neigh->ifp->channel);
|
||||
blobmsg_add_u8(b, "if_up", if_up(neigh->ifp));
|
||||
blobmsg_close_table(b, neighbour);
|
||||
}
|
||||
|
|
|
@ -3,12 +3,12 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=batctl
|
||||
PKG_VERSION:=2022.0
|
||||
PKG_RELEASE:=4
|
||||
PKG_VERSION:=2024.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_HASH:=893966f9a2d6a50721de124ce62da5d3de9c20e05576ca482bc5704cc5a6f73d
|
||||
PKG_HASH:=76853e87201af63c411db152fd0c625a729a9733115897d1331604e2c5a67c7d
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
@ -16,6 +16,7 @@ PKG_LICENSE:=GPL-2.0-only ISC MIT
|
|||
PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT LICENSES/deprecated/ISC
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
PKG_BUILD_FLAGS:=gc-sections lto
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
@ -70,20 +71,6 @@ $(Package/batctl/description)
|
|||
Subcommands for configuration, online and offline debugging are enabled.
|
||||
endef
|
||||
|
||||
# The linker can identify unused sections of a binary when each symbol is stored
|
||||
# in a separate section. This mostly removes unused linker sections and reduces
|
||||
# the size by ~3% on mipsel.
|
||||
|
||||
TARGET_CFLAGS += -ffunction-sections -fdata-sections
|
||||
TARGET_LDFLAGS += -Wl,--gc-sections
|
||||
|
||||
# Link-time optimization allows to move parts of the optimization from the single
|
||||
# source file to the global source view. This is done by emitting the GIMPLE
|
||||
# representation in each object file and analyzing it again during the link step.
|
||||
|
||||
TARGET_CFLAGS += -flto
|
||||
TARGET_LDFLAGS += -fuse-linker-plugin
|
||||
|
||||
MAKE_VARS += \
|
||||
LIBNL_NAME="libnl-tiny" \
|
||||
LIBNL_GENL_NAME="libnl-tiny"
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 22 Apr 2022 11:14:08 +0200
|
||||
Subject: batctl: ping: Skip sleep after last packet
|
||||
|
||||
The -i option for ping is documented as interval between ping requests. But
|
||||
the sleep was also applied after all the requested pings already sent out.
|
||||
As result, the user had to wait additional time until the statistics for
|
||||
the (limited) ping test was printed.
|
||||
|
||||
Just skip the last sleep in case there will be no next ping packet to avoid
|
||||
this problem.
|
||||
|
||||
Reported-by: Roman Le bg <roman@romanlebg.fr>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/47d063213d5843d1ca33c557bd4a874db3e90e9e)
|
||||
|
||||
--- a/ping.c
|
||||
+++ b/ping.c
|
||||
@@ -282,6 +282,10 @@ read_packet:
|
||||
}
|
||||
|
||||
sleep:
|
||||
+ /* skip last sleep in case no more packets will be sent out */
|
||||
+ if (loop_count == 0)
|
||||
+ continue;
|
||||
+
|
||||
if (loop_interval > 0)
|
||||
sleep(loop_interval);
|
||||
else if ((tv.tv_sec != 0) || (tv.tv_usec != 0))
|
|
@ -1,26 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 27 Jan 2024 13:48:59 +0100
|
||||
Subject: batctl: tcpdump: Fix missing sanity check for batman-adv header
|
||||
|
||||
parse_eth_hdr() is assuming that every ETH_P_BATMAN ethernet packet has a
|
||||
valid, minimal batman-adv header (packet_type, version, ttl) attached. But
|
||||
it doesn't actually check if the received buffer has enough bytes to access
|
||||
the two bytes packet_type + version. So it is possible that it tries to
|
||||
read outside of the received data.
|
||||
|
||||
Fixes: 3bdfc388e74b ("implement simple tcpdump, first only batman packets")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/7ae3bdb59a7501197e12d3a7ab0d9924341e9ca8
|
||||
|
||||
--- a/tcpdump.c
|
||||
+++ b/tcpdump.c
|
||||
@@ -1068,6 +1068,9 @@ static void parse_eth_hdr(unsigned char
|
||||
dump_vlan(packet_buff, buff_len, read_opt, time_printed);
|
||||
break;
|
||||
case ETH_P_BATMAN:
|
||||
+ /* check for batman-adv packet_type + version */
|
||||
+ LEN_CHECK(buff_len, sizeof(*eth_hdr) + 2, "BAT HEADER")
|
||||
+
|
||||
batman_ogm_packet = (struct batadv_ogm_packet *)(packet_buff + ETH_HLEN);
|
||||
|
||||
if ((read_opt & COMPAT_FILTER) &&
|
|
@ -1,34 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 27 Jan 2024 13:49:00 +0100
|
||||
Subject: batctl: tcpdump: Add missing throughput header length check
|
||||
|
||||
dump_batman_icmp() is only doing a length check for the original ICMP
|
||||
packet length. But the throughput packet (which is also handled by this
|
||||
function) is accessed without doing an additional length check. So it is
|
||||
possible that it tries to read outside of the received data.
|
||||
|
||||
Fixes: f109b3473f86 ("batctl: introduce throughput meter support")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/189b66496309bc1a54b4821292da2428de8ceb1c
|
||||
|
||||
--- a/tcpdump.c
|
||||
+++ b/tcpdump.c
|
||||
@@ -863,7 +863,6 @@ static void dump_batman_icmp(unsigned ch
|
||||
LEN_CHECK((size_t)buff_len - sizeof(struct ether_header), sizeof(struct batadv_icmp_packet), "BAT ICMP");
|
||||
|
||||
icmp_packet = (struct batadv_icmp_packet *)(packet_buff + sizeof(struct ether_header));
|
||||
- tp = (struct batadv_icmp_tp_packet *)icmp_packet;
|
||||
|
||||
if (!time_printed)
|
||||
print_time();
|
||||
@@ -894,6 +893,10 @@ static void dump_batman_icmp(unsigned ch
|
||||
(size_t)buff_len - sizeof(struct ether_header));
|
||||
break;
|
||||
case BATADV_TP:
|
||||
+ LEN_CHECK((size_t)buff_len - sizeof(struct ether_header), sizeof(*tp), "BAT TP");
|
||||
+
|
||||
+ tp = (struct batadv_icmp_tp_packet *)icmp_packet;
|
||||
+
|
||||
printf("%s: ICMP TP type %s (%hhu), id %hhu, seq %u, ttl %2d, v %d, length %zu\n",
|
||||
name, tp->subtype == BATADV_TP_MSG ? "MSG" :
|
||||
tp->subtype == BATADV_TP_ACK ? "ACK" : "N/A",
|
|
@ -1,27 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 27 Jan 2024 13:49:01 +0100
|
||||
Subject: batctl: tcpdump: Fix IPv4 header length check
|
||||
|
||||
dump_ip() is directly accessing the header in the header length check and
|
||||
assumes that ihl can be trusted. But when when ihl is set to something less
|
||||
than 5 then it would not even be possible to store the basic IPv4 header in
|
||||
it. But dump_ip would have still accepted it because it didn't check if
|
||||
there are at least enough bytes available to read the basic IPv4 header. So
|
||||
it is possible that it tries to read outside of the received data.
|
||||
|
||||
Fixes: 75d68356f3fa ("[batctl] tcpdump - add basic IPv4 support")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/ddb254bd51aa43d216159f3be9c575369b041d35
|
||||
|
||||
--- a/tcpdump.c
|
||||
+++ b/tcpdump.c
|
||||
@@ -646,7 +646,9 @@ static void dump_ip(unsigned char *packe
|
||||
struct icmphdr *icmphdr;
|
||||
|
||||
iphdr = (struct iphdr *)packet_buff;
|
||||
+ LEN_CHECK((size_t)buff_len, sizeof(*iphdr), ip_string);
|
||||
LEN_CHECK((size_t)buff_len, (size_t)(iphdr->ihl * 4), ip_string);
|
||||
+ LEN_CHECK((size_t)(iphdr->ihl * 4), sizeof(*iphdr), ip_string);
|
||||
|
||||
if (!time_printed)
|
||||
print_time();
|
|
@ -1,25 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 27 Jan 2024 13:49:02 +0100
|
||||
Subject: batctl: tcpdump: Add missing ICMPv6 Neighbor Advert length check
|
||||
|
||||
dump_ipv6() is doing a length check for the original ICMPv6 header length.
|
||||
But the neighbor advertisement (which is also handled by this function) is
|
||||
accessed without doing an additional length check. So it is possible that
|
||||
it tries to read outside of the received data.
|
||||
|
||||
Fixes: 35b37756f4a3 ("add IPv6 support to tcpdump parser")
|
||||
Cc: Marco Dalla Torre <marco.dallato@gmail.com>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/da75747d435ca8a32a74895655a1d5bff8b7709b
|
||||
|
||||
--- a/tcpdump.c
|
||||
+++ b/tcpdump.c
|
||||
@@ -611,6 +611,8 @@ static void dump_ipv6(unsigned char *pac
|
||||
nd_nas_target, buff_len);
|
||||
break;
|
||||
case ND_NEIGHBOR_ADVERT:
|
||||
+ LEN_CHECK((size_t)buff_len - (size_t)(sizeof(struct ip6_hdr)),
|
||||
+ sizeof(*nd_advert), "ICMPv6 Neighbor Advertisement");
|
||||
nd_advert = (struct nd_neighbor_advert *)icmphdr;
|
||||
inet_ntop(AF_INET6, &(nd_advert->nd_na_target),
|
||||
nd_nas_target, 40);
|
|
@ -1,25 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 27 Jan 2024 13:49:03 +0100
|
||||
Subject: batctl: tcpdump: Add missing ICMPv6 Neighbor Solicit length check
|
||||
|
||||
dump_ipv6() is doing a length check for the original ICMPv6 header length.
|
||||
But the neighbor solicitation (which is also handled by this function) is
|
||||
accessed without doing an additional length check. So it is possible that
|
||||
it tries to read outside of the received data.
|
||||
|
||||
Fixes: 35b37756f4a3 ("add IPv6 support to tcpdump parser")
|
||||
Cc: Marco Dalla Torre <marco.dallato@gmail.com>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/83025933cb502192d22edc89de3c57103968c4ed
|
||||
|
||||
--- a/tcpdump.c
|
||||
+++ b/tcpdump.c
|
||||
@@ -604,6 +604,8 @@ static void dump_ipv6(unsigned char *pac
|
||||
(size_t)buff_len - sizeof(struct icmp6_hdr));
|
||||
break;
|
||||
case ND_NEIGHBOR_SOLICIT:
|
||||
+ LEN_CHECK((size_t)buff_len - (size_t)(sizeof(struct ip6_hdr)),
|
||||
+ sizeof(*nd_neigh_sol), "ICMPv6 Neighbor Solicitation");
|
||||
nd_neigh_sol = (struct nd_neighbor_solicit *)icmphdr;
|
||||
inet_ntop(AF_INET6, &(nd_neigh_sol->nd_ns_target),
|
||||
nd_nas_target, 40);
|
|
@ -1,41 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 27 Jan 2024 13:49:04 +0100
|
||||
Subject: batctl: tcpdump: Fix ICMPv4 inner IPv4 header length check
|
||||
|
||||
dump_ip() is doing a length check for the inner (inside ICMP) IPv4 header
|
||||
length. But it is just assuming that the inner ICMPv4 header has ihl set to
|
||||
5 - without actually checking for this. The more complex IPv4 header length
|
||||
check for the outer IPv4 header is missing before it tries to access the
|
||||
UDP header using the inner ihl IPv4 header length information. So it is
|
||||
possible that it tries to read outside of the received data.
|
||||
|
||||
Fixes: 75d68356f3fa ("[batctl] tcpdump - add basic IPv4 support")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batctl.git/commit/fb7a51466bf46a4914a32edd8e1be6ba0733cd49
|
||||
|
||||
--- a/tcpdump.c
|
||||
+++ b/tcpdump.c
|
||||
@@ -682,12 +682,20 @@ static void dump_ip(unsigned char *packe
|
||||
(size_t)buff_len - (iphdr->ihl * 4));
|
||||
break;
|
||||
case ICMP_DEST_UNREACH:
|
||||
- LEN_CHECK((size_t)buff_len - (iphdr->ihl * 4) - sizeof(struct icmphdr),
|
||||
- sizeof(struct iphdr) + 8, "ICMP DEST_UNREACH");
|
||||
-
|
||||
switch (icmphdr->code) {
|
||||
case ICMP_PORT_UNREACH:
|
||||
+ LEN_CHECK((size_t)buff_len - (iphdr->ihl * 4) - sizeof(struct icmphdr),
|
||||
+ sizeof(struct iphdr), "ICMP DEST_UNREACH");
|
||||
+
|
||||
+ /* validate inner IP header information */
|
||||
tmp_iphdr = (struct iphdr *)(((char *)icmphdr) + sizeof(struct icmphdr));
|
||||
+ LEN_CHECK((size_t)buff_len - (iphdr->ihl * 4) - sizeof(struct icmphdr),
|
||||
+ (size_t)(tmp_iphdr->ihl * 4), "ICMP DEST_UNREACH");
|
||||
+ LEN_CHECK((size_t)(tmp_iphdr->ihl * 4), sizeof(*iphdr), "ICMP DEST_UNREACH");
|
||||
+
|
||||
+ LEN_CHECK((size_t)buff_len - (iphdr->ihl * 4) - sizeof(struct icmphdr) - (tmp_iphdr->ihl * 4),
|
||||
+ sizeof(*tmp_udphdr), "ICMP DEST_UNREACH");
|
||||
+
|
||||
tmp_udphdr = (struct udphdr *)(((char *)tmp_iphdr) + (tmp_iphdr->ihl * 4));
|
||||
|
||||
printf("%s: ICMP ", ipdst);
|
|
@ -3,12 +3,12 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=batman-adv
|
||||
PKG_VERSION:=2022.0
|
||||
PKG_RELEASE:=9
|
||||
PKG_VERSION:=2024.0
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_HASH:=49338705bc207709ac84d766688e702571009c827c0a320788ea51fb887714aa
|
||||
PKG_HASH:=61110697b5799f646a2a82a4dcf97faed4bb12a7cc43bf4683d2c4de4f6b40e7
|
||||
PKG_EXTMOD_SUBDIRS:=net/batman-adv
|
||||
|
||||
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
|
|
@ -0,0 +1,274 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 6 May 2022 22:03:29 +0200
|
||||
Subject: Revert "batman-adv: Migrate to linux/container_of.h"
|
||||
|
||||
The original patch requires Linux 5.16.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit 043ae5634bdfd4c4dd8b95a22890752495080bb5.
|
||||
|
||||
--- a/compat-include/linux/container_of.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 16, 0)
|
||||
-#include_next <linux/container_of.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_ */
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -13,13 +13,13 @@
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
--- a/net/batman-adv/bat_v_ogm.c
|
||||
+++ b/net/batman-adv/bat_v_ogm.c
|
||||
@@ -9,12 +9,12 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc16.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
@@ -21,6 +20,7 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netlink.h>
|
||||
--- a/net/batman-adv/gateway_client.c
|
||||
+++ b/net/batman-adv/gateway_client.c
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -10,12 +10,12 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/if_ether.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc32c.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
--- a/net/batman-adv/network-coding.c
|
||||
+++ b/net/batman-adv/network-coding.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/originator.c
|
||||
+++ b/net/batman-adv/originator.c
|
||||
@@ -8,11 +8,11 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/send.c
|
||||
+++ b/net/batman-adv/send.c
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netdevice.h>
|
||||
--- a/net/batman-adv/soft-interface.c
|
||||
+++ b/net/batman-adv/soft-interface.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/tp_meter.c
|
||||
+++ b/net/batman-adv/tp_meter.c
|
||||
@@ -12,13 +12,13 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/limits.h>
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc32c.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
@@ -22,6 +21,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/tvlv.c
|
||||
+++ b/net/batman-adv/tvlv.c
|
||||
@@ -7,10 +7,10 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
|
@ -1,128 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 24 Oct 2020 22:51:23 +0200
|
||||
Subject: Revert "batman-adv: genetlink: move to smaller ops wherever possible"
|
||||
|
||||
The netlink genl_ops interface was splitted into two parts for Linux 5.10.
|
||||
The batman-adv code changed to the new one because it doesn't use the more
|
||||
complex policy handling of genl_ops. But the backports-5.8-1 version in
|
||||
OpenWrt doesn't yet support the new genl_small_ops.
|
||||
|
||||
This patch must be dropped directly when OpenWrt switches to backports-5.10
|
||||
or newer - otherwise it will not work as expected.
|
||||
|
||||
This reverts commit 725b4ef5be840cfcd0ca33b9393c14dee40c10f7.
|
||||
|
||||
--- a/compat-include/net/genetlink.h
|
||||
+++ b/compat-include/net/genetlink.h
|
||||
@@ -31,17 +31,15 @@ void batadv_genl_dump_check_consistent(s
|
||||
#endif /* LINUX_VERSION_IS_LESS(4, 15, 0) */
|
||||
|
||||
|
||||
-#if LINUX_VERSION_IS_LESS(5, 10, 0)
|
||||
-
|
||||
#if LINUX_VERSION_IS_LESS(5, 2, 0)
|
||||
+
|
||||
enum genl_validate_flags {
|
||||
GENL_DONT_VALIDATE_STRICT = BIT(0),
|
||||
GENL_DONT_VALIDATE_DUMP = BIT(1),
|
||||
GENL_DONT_VALIDATE_DUMP_STRICT = BIT(2),
|
||||
};
|
||||
-#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */
|
||||
|
||||
-struct batadv_genl_small_ops {
|
||||
+struct batadv_genl_ops {
|
||||
int (*doit)(struct sk_buff *skb,
|
||||
struct genl_info *info);
|
||||
int (*dumpit)(struct sk_buff *skb,
|
||||
@@ -70,9 +68,9 @@ struct batadv_genl_family {
|
||||
struct genl_info *info);
|
||||
void (*post_doit)(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
struct genl_info *info);
|
||||
- const struct batadv_genl_small_ops *small_ops;
|
||||
+ const struct batadv_genl_ops *ops;
|
||||
const struct genl_multicast_group *mcgrps;
|
||||
- unsigned int n_small_ops;
|
||||
+ unsigned int n_ops;
|
||||
unsigned int n_mcgrps;
|
||||
struct module *module;
|
||||
|
||||
@@ -96,32 +94,24 @@ static inline int batadv_genl_register_f
|
||||
family->family.pre_doit = family->pre_doit;
|
||||
family->family.post_doit = family->post_doit;
|
||||
family->family.mcgrps = family->mcgrps;
|
||||
- family->family.n_ops = family->n_small_ops;
|
||||
+ family->family.n_ops = family->n_ops;
|
||||
family->family.n_mcgrps = family->n_mcgrps;
|
||||
family->family.module = family->module;
|
||||
|
||||
- ops = kzalloc(sizeof(*ops) * family->n_small_ops, GFP_KERNEL);
|
||||
+ ops = kzalloc(sizeof(*ops) * family->n_ops, GFP_KERNEL);
|
||||
if (!ops)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < family->family.n_ops; i++) {
|
||||
- ops[i].doit = family->small_ops[i].doit;
|
||||
- ops[i].dumpit = family->small_ops[i].dumpit;
|
||||
- ops[i].done = family->small_ops[i].done;
|
||||
- ops[i].cmd = family->small_ops[i].cmd;
|
||||
- ops[i].internal_flags = family->small_ops[i].internal_flags;
|
||||
- ops[i].flags = family->small_ops[i].flags;
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 2, 0)
|
||||
- ops[i].validate = family->small_ops[i].validate;
|
||||
-#else
|
||||
+ ops[i].doit = family->ops[i].doit;
|
||||
+ ops[i].dumpit = family->ops[i].dumpit;
|
||||
+ ops[i].done = family->ops[i].done;
|
||||
+ ops[i].cmd = family->ops[i].cmd;
|
||||
+ ops[i].internal_flags = family->ops[i].internal_flags;
|
||||
+ ops[i].flags = family->ops[i].flags;
|
||||
ops[i].policy = family->policy;
|
||||
-#endif
|
||||
}
|
||||
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 2, 0)
|
||||
- family->family.policy = family->policy;
|
||||
-#endif
|
||||
-
|
||||
family->family.ops = ops;
|
||||
family->copy_ops = ops;
|
||||
|
||||
@@ -136,7 +126,7 @@ typedef struct genl_ops batadv_genl_ops_
|
||||
#define batadv_post_doit(__x, __y, __z) \
|
||||
batadv_post_doit(const batadv_genl_ops_old *ops, __y, __z)
|
||||
|
||||
-#define genl_small_ops batadv_genl_small_ops
|
||||
+#define genl_ops batadv_genl_ops
|
||||
#define genl_family batadv_genl_family
|
||||
|
||||
#define genl_register_family(family) \
|
||||
@@ -160,6 +150,6 @@ batadv_genl_unregister_family(struct bat
|
||||
genlmsg_multicast_netns(&(_family)->family, _net, _skb, _portid, \
|
||||
_group, _flags)
|
||||
|
||||
-#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */
|
||||
+#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_COMPAT_NET_GENETLINK_H_ */
|
||||
--- a/net/batman-adv/netlink.c
|
||||
+++ b/net/batman-adv/netlink.c
|
||||
@@ -1357,7 +1357,7 @@ static void batadv_post_doit(const struc
|
||||
}
|
||||
}
|
||||
|
||||
-static const struct genl_small_ops batadv_netlink_ops[] = {
|
||||
+static const struct genl_ops batadv_netlink_ops[] = {
|
||||
{
|
||||
.cmd = BATADV_CMD_GET_MESH,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
@@ -1491,8 +1491,8 @@ struct genl_family batadv_netlink_family
|
||||
.pre_doit = batadv_pre_doit,
|
||||
.post_doit = batadv_post_doit,
|
||||
.module = THIS_MODULE,
|
||||
- .small_ops = batadv_netlink_ops,
|
||||
- .n_small_ops = ARRAY_SIZE(batadv_netlink_ops),
|
||||
+ .ops = batadv_netlink_ops,
|
||||
+ .n_ops = ARRAY_SIZE(batadv_netlink_ops),
|
||||
.mcgrps = batadv_netlink_mcgrps,
|
||||
.n_mcgrps = ARRAY_SIZE(batadv_netlink_mcgrps),
|
||||
};
|
|
@ -1,116 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Thu, 28 Jan 2021 21:06:51 +0100
|
||||
Subject: Revert "batman-adv: Add new include for min/max helpers"
|
||||
|
||||
The OpenWrt kernel sources and backports sources are currently missing this
|
||||
header.
|
||||
|
||||
This reverts commit 1810de05310d5c5e9140f870ac21052f38bc06b8.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
--- a/compat-include/linux/minmax.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 10, 0)
|
||||
-#include_next <linux/minmax.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ */
|
||||
--- a/net/batman-adv/bat_v.c
|
||||
+++ b/net/batman-adv/bat_v.c
|
||||
@@ -15,7 +15,6 @@
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rculist.h>
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/prandom.h>
|
||||
--- a/net/batman-adv/bat_v_ogm.c
|
||||
+++ b/net/batman-adv/bat_v_ogm.c
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/prandom.h>
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -14,8 +14,8 @@
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/lockdep.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <linux/kref.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/printk.h>
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/printk.h>
|
||||
--- a/net/batman-adv/netlink.c
|
||||
+++ b/net/batman-adv/netlink.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/printk.h>
|
||||
--- a/net/batman-adv/tp_meter.c
|
||||
+++ b/net/batman-adv/tp_meter.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/printk.h>
|
19
batman-adv/patches/0002-fix-batadv_is_cfg80211_netdev.patch
Normal file
19
batman-adv/patches/0002-fix-batadv_is_cfg80211_netdev.patch
Normal file
|
@ -0,0 +1,19 @@
|
|||
From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Date: Thu, 6 Apr 2023 18:05:50 -0500
|
||||
Subject: fix batadv_is_cfg80211_netdev
|
||||
|
||||
Replace CONFIG_CFG80211 with CPTCFG_CFG80211, which is the correct
|
||||
macro to use when building under backports.
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -308,8 +308,7 @@ static bool batadv_is_cfg80211_netdev(st
|
||||
{
|
||||
if (!net_device)
|
||||
return false;
|
||||
-
|
||||
-#if IS_ENABLED(CONFIG_CFG80211)
|
||||
+#if IS_ENABLED(CPTCFG_CFG80211)
|
||||
/* cfg80211 drivers have to set ieee80211_ptr */
|
||||
if (net_device->ieee80211_ptr)
|
||||
return true;
|
|
@ -0,0 +1,97 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 2 Feb 2024 22:49:00 +0100
|
||||
Subject: Revert "batman-adv: Switch to linux/sprintf.h"
|
||||
|
||||
The original patch requires Linux 6.6.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit f0fb49c5ab70dfa064f0aa8d1c5d84f65e8cbc86.
|
||||
|
||||
--- a/compat-include/linux/sprintf.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(6, 6, 0)
|
||||
-#include_next <linux/sprintf.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_ */
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
@@ -29,7 +30,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/workqueue.h>
|
||||
--- a/net/batman-adv/gateway_client.c
|
||||
+++ b/net/batman-adv/gateway_client.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
@@ -27,7 +28,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/udp.h>
|
||||
#include <net/sock.h>
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/workqueue.h>
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/netdevice.h>
|
||||
@@ -34,7 +35,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
|
@ -1,34 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 14 May 2021 19:34:35 +0200
|
||||
Subject: batman-adv: Fix build of multicast code against Linux < 5.13
|
||||
|
||||
Fixes: 007b4c4b031f ("batman-adv: convert ifmcaddr6 to RCU")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -422,9 +422,14 @@ batadv_mcast_mla_softif_get_ipv6(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(5, 13, 0)
|
||||
+ read_lock_bh(&in6_dev->lock);
|
||||
+ for (pmc6 = in6_dev->mc_list; pmc6; pmc6 = pmc6->next) {
|
||||
+#else
|
||||
for (pmc6 = rcu_dereference(in6_dev->mc_list);
|
||||
pmc6;
|
||||
pmc6 = rcu_dereference(pmc6->next)) {
|
||||
+#endif
|
||||
if (IPV6_ADDR_MC_SCOPE(&pmc6->mca_addr) <
|
||||
IPV6_ADDR_SCOPE_LINKLOCAL)
|
||||
continue;
|
||||
@@ -453,6 +458,9 @@ batadv_mcast_mla_softif_get_ipv6(struct
|
||||
hlist_add_head(&new->list, mcast_list);
|
||||
ret++;
|
||||
}
|
||||
+#if LINUX_VERSION_IS_LESS(5, 13, 0)
|
||||
+ read_unlock_bh(&in6_dev->lock);
|
||||
+#endif
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
|
@ -1,19 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Tue, 14 Sep 2021 21:02:10 +0200
|
||||
Subject: Revert "batman-adv: Switch to kstrtox.h for kstrtou64"
|
||||
|
||||
This header is only available after Linux 5.14
|
||||
|
||||
This reverts commit c9a69cb4048ebef3a4d91835669011a26d9b7dab.
|
||||
|
||||
--- a/net/batman-adv/gateway_common.c
|
||||
+++ b/net/batman-adv/gateway_common.c
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/errno.h>
|
||||
-#include <linux/kstrtox.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/math64.h>
|
||||
#include <linux/netdevice.h>
|
|
@ -0,0 +1,69 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 2 Feb 2024 22:49:48 +0100
|
||||
Subject: Revert "batman-adv: Switch to linux/array_size.h"
|
||||
|
||||
The original patch requires Linux 6.7.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit f33d7f724675544a36b24c77f8d4b95d41252ae2.
|
||||
|
||||
--- a/compat-include/linux/array_size.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(6, 7, 0)
|
||||
-#include_next <linux/array_size.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_ */
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
-#include <linux/array_size.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
--- a/net/batman-adv/netlink.c
|
||||
+++ b/net/batman-adv/netlink.c
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "netlink.h"
|
||||
#include "main.h"
|
||||
|
||||
-#include <linux/array_size.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
@@ -21,6 +20,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/init.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/minmax.h>
|
|
@ -1,19 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Tue, 14 Sep 2021 21:07:34 +0200
|
||||
Subject: Revert "batman-adv: use Linux's stdarg.h"
|
||||
|
||||
This header is only available since Linux 5.15
|
||||
|
||||
This reverts commit 36d059797a14f0e373fdc3c79df7b467435925ad.
|
||||
|
||||
--- a/net/batman-adv/log.c
|
||||
+++ b/net/batman-adv/log.c
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "log.h"
|
||||
#include "main.h"
|
||||
|
||||
-#include <linux/stdarg.h>
|
||||
+#include <stdarg.h>
|
||||
|
||||
#include "trace.h"
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
From: Eric Dumazet <edumazet@google.com>
|
||||
Date: Wed, 2 Mar 2022 20:05:13 +0100
|
||||
Subject: batman-adv: make mc_forwarding atomic
|
||||
|
||||
This fixes minor data-races in ip6_mc_input() and
|
||||
batadv_mcast_mla_rtr_flags_softif_get_ipv6()
|
||||
|
||||
Signed-off-by: Eric Dumazet <edumazet@google.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
[sven@narfation.org: Add ugly hack to get it building with old kernels]
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/56db7c0540e733a1f063ccd6bab1b537a80857eb
|
||||
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -134,7 +134,11 @@ static u8 batadv_mcast_mla_rtr_flags_sof
|
||||
{
|
||||
struct inet6_dev *in6_dev = __in6_dev_get(dev);
|
||||
|
||||
+#if LINUX_VERSION_IS_GEQ(5, 18, 0) // UGLY_HACK_NEW
|
||||
+ if (in6_dev && atomic_read(&in6_dev->cnf.mc_forwarding))
|
||||
+#else // UGLY_HACK_OLD
|
||||
if (in6_dev && in6_dev->cnf.mc_forwarding)
|
||||
+#endif // UGLY_HACK_STOP
|
||||
return BATADV_NO_FLAGS;
|
||||
else
|
||||
return BATADV_MCAST_WANT_NO_RTR6;
|
|
@ -1,23 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 15 Apr 2022 15:12:45 +0200
|
||||
Subject: batman-adv: compat: Add atomic mc_fowarding support for stable kernels
|
||||
|
||||
Fixes: 56db7c0540e7 ("batman-adv: make mc_forwarding atomic")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/350adcaec82fbaa358a2406343b6130ac8dad126
|
||||
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -134,7 +134,11 @@ static u8 batadv_mcast_mla_rtr_flags_sof
|
||||
{
|
||||
struct inet6_dev *in6_dev = __in6_dev_get(dev);
|
||||
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 18, 0) // UGLY_HACK_NEW
|
||||
+#if (LINUX_VERSION_IS_GEQ(5, 4, 189) && LINUX_VERSION_IS_LESS(5, 5, 0)) || /* UGLY_HACK */ \
|
||||
+ (LINUX_VERSION_IS_GEQ(5, 10, 111) && LINUX_VERSION_IS_LESS(5, 11, 0)) || /* UGLY_HACK */ \
|
||||
+ (LINUX_VERSION_IS_GEQ(5, 15, 34) && LINUX_VERSION_IS_LESS(5, 16, 0)) || /* UGLY_HACK */ \
|
||||
+ (LINUX_VERSION_IS_GEQ(5, 16, 20) && LINUX_VERSION_IS_LESS(5, 17, 0)) || /* UGLY_HACK */ \
|
||||
+ LINUX_VERSION_IS_GEQ(5, 17, 3) // UGLY_HACK_NEW
|
||||
if (in6_dev && atomic_read(&in6_dev->cnf.mc_forwarding))
|
||||
#else // UGLY_HACK_OLD
|
||||
if (in6_dev && in6_dev->cnf.mc_forwarding)
|
|
@ -1,44 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 2 Mar 2022 19:49:44 +0100
|
||||
Subject: batman-adv: Request iflink once in batadv-on-batadv check
|
||||
|
||||
There is no need to call dev_get_iflink multiple times for the same
|
||||
net_device in batadv_is_on_batman_iface. And since some of the
|
||||
.ndo_get_iflink callbacks are dynamic (for example via RCUs like in
|
||||
vxcan_get_iflink), it could easily happen that the returned values are not
|
||||
stable. The pre-checks before __dev_get_by_index are then of course bogus.
|
||||
|
||||
Fixes: 3d48811b27f5 ("batman-adv: prevent using any virtual device created on batman-adv as hard-interface")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/f6c0c45356fe3ab9c5e01b81d060f8a436658037
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -148,22 +148,23 @@ static bool batadv_is_on_batman_iface(co
|
||||
struct net *net = dev_net(net_dev);
|
||||
struct net_device *parent_dev;
|
||||
struct net *parent_net;
|
||||
+ int iflink;
|
||||
bool ret;
|
||||
|
||||
/* check if this is a batman-adv mesh interface */
|
||||
if (batadv_softif_is_valid(net_dev))
|
||||
return true;
|
||||
|
||||
+ iflink = dev_get_iflink(net_dev);
|
||||
+
|
||||
/* no more parents..stop recursion */
|
||||
- if (dev_get_iflink(net_dev) == 0 ||
|
||||
- dev_get_iflink(net_dev) == net_dev->ifindex)
|
||||
+ if (iflink == 0 || iflink == net_dev->ifindex)
|
||||
return false;
|
||||
|
||||
parent_net = batadv_getlink_net(net_dev, net);
|
||||
|
||||
/* recurse over the parent device */
|
||||
- parent_dev = __dev_get_by_index((struct net *)parent_net,
|
||||
- dev_get_iflink(net_dev));
|
||||
+ parent_dev = __dev_get_by_index((struct net *)parent_net, iflink);
|
||||
/* if we got a NULL parent_dev there is something broken.. */
|
||||
if (!parent_dev) {
|
||||
pr_err("Cannot find parent device\n");
|
|
@ -1,46 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 2 Mar 2022 19:49:45 +0100
|
||||
Subject: batman-adv: Request iflink once in batadv_get_real_netdevice
|
||||
|
||||
There is no need to call dev_get_iflink multiple times for the same
|
||||
net_device in batadv_get_real_netdevice. And since some of the
|
||||
ndo_get_iflink callbacks are dynamic (for example via RCUs like in
|
||||
vxcan_get_iflink), it could easily happen that the returned values are not
|
||||
stable. The pre-checks before __dev_get_by_index are then of course bogus.
|
||||
|
||||
Fixes: 2b45bb6c3aad ("batman-adv: additional checks for virtual interfaces on top of WiFi")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/445f477ec3e805425186f5fbe8ed0fe89cc226b6
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -214,14 +214,16 @@ static struct net_device *batadv_get_rea
|
||||
struct net_device *real_netdev = NULL;
|
||||
struct net *real_net;
|
||||
struct net *net;
|
||||
- int ifindex;
|
||||
+ int iflink;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (!netdev)
|
||||
return NULL;
|
||||
|
||||
- if (netdev->ifindex == dev_get_iflink(netdev)) {
|
||||
+ iflink = dev_get_iflink(netdev);
|
||||
+
|
||||
+ if (netdev->ifindex == iflink) {
|
||||
dev_hold(netdev);
|
||||
return netdev;
|
||||
}
|
||||
@@ -231,9 +233,8 @@ static struct net_device *batadv_get_rea
|
||||
goto out;
|
||||
|
||||
net = dev_net(hard_iface->soft_iface);
|
||||
- ifindex = dev_get_iflink(netdev);
|
||||
real_net = batadv_getlink_net(netdev, net);
|
||||
- real_netdev = dev_get_by_index(real_net, ifindex);
|
||||
+ real_netdev = dev_get_by_index(real_net, iflink);
|
||||
|
||||
out:
|
||||
batadv_hardif_put(hard_iface);
|
|
@ -1,86 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 2 Mar 2022 19:49:46 +0100
|
||||
Subject: batman-adv: Don't expect inter-netns unique iflink indices
|
||||
|
||||
The ifindex doesn't have to be unique for multiple network namespaces on
|
||||
the same machine.
|
||||
|
||||
$ ip netns add test1
|
||||
$ ip -net test1 link add dummy1 type dummy
|
||||
$ ip netns add test2
|
||||
$ ip -net test2 link add dummy2 type dummy
|
||||
|
||||
$ ip -net test1 link show dev dummy1
|
||||
6: dummy1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
|
||||
link/ether 96:81:55:1e:dd:85 brd ff:ff:ff:ff:ff:ff
|
||||
$ ip -net test2 link show dev dummy2
|
||||
6: dummy2: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
|
||||
link/ether 5a:3c:af:35:07:c3 brd ff:ff:ff:ff:ff:ff
|
||||
|
||||
But the batman-adv code to walk through the various layers of virtual
|
||||
interfaces uses this assumption because dev_get_iflink handles it
|
||||
internally and doesn't return the actual netns of the iflink. And
|
||||
dev_get_iflink only documents the situation where ifindex == iflink for
|
||||
physical devices.
|
||||
|
||||
But only checking for dev->netdev_ops->ndo_get_iflink is also not an option
|
||||
because ipoib_get_iflink implements it even when it sometimes returns an
|
||||
iflink != ifindex and sometimes iflink == ifindex. The caller must
|
||||
therefore make sure itself to check both netns and iflink + ifindex for
|
||||
equality. Only when they are equal, a "physical" interface was detected
|
||||
which should stop the traversal. On the other hand, vxcan_get_iflink can
|
||||
also return 0 in case there was currently no valid peer. In this case, it
|
||||
is still necessary to stop.
|
||||
|
||||
Fixes: 3d48811b27f5 ("batman-adv: prevent using any virtual device created on batman-adv as hard-interface")
|
||||
Fixes: 2b45bb6c3aad ("batman-adv: additional checks for virtual interfaces on top of WiFi")
|
||||
Reported-by: Sabrina Dubroca <sd@queasysnail.net>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0aac7a9fbbbeec25f2f54a9e6d53ea91217ba720
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -156,13 +156,15 @@ static bool batadv_is_on_batman_iface(co
|
||||
return true;
|
||||
|
||||
iflink = dev_get_iflink(net_dev);
|
||||
-
|
||||
- /* no more parents..stop recursion */
|
||||
- if (iflink == 0 || iflink == net_dev->ifindex)
|
||||
+ if (iflink == 0)
|
||||
return false;
|
||||
|
||||
parent_net = batadv_getlink_net(net_dev, net);
|
||||
|
||||
+ /* iflink to itself, most likely physical device */
|
||||
+ if (net == parent_net && iflink == net_dev->ifindex)
|
||||
+ return false;
|
||||
+
|
||||
/* recurse over the parent device */
|
||||
parent_dev = __dev_get_by_index((struct net *)parent_net, iflink);
|
||||
/* if we got a NULL parent_dev there is something broken.. */
|
||||
@@ -222,8 +224,7 @@ static struct net_device *batadv_get_rea
|
||||
return NULL;
|
||||
|
||||
iflink = dev_get_iflink(netdev);
|
||||
-
|
||||
- if (netdev->ifindex == iflink) {
|
||||
+ if (iflink == 0) {
|
||||
dev_hold(netdev);
|
||||
return netdev;
|
||||
}
|
||||
@@ -234,6 +235,14 @@ static struct net_device *batadv_get_rea
|
||||
|
||||
net = dev_net(hard_iface->soft_iface);
|
||||
real_net = batadv_getlink_net(netdev, net);
|
||||
+
|
||||
+ /* iflink to itself, most likely physical device */
|
||||
+ if (net == real_net && netdev->ifindex == iflink) {
|
||||
+ real_netdev = netdev;
|
||||
+ dev_hold(real_netdev);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
real_netdev = dev_get_by_index(real_net, iflink);
|
||||
|
||||
out:
|
|
@ -1,46 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 16 Apr 2022 14:24:34 +0200
|
||||
Subject: batman-adv: Don't skb_split skbuffs with frag_list
|
||||
|
||||
The receiving interface might have used GRO to receive more fragments than
|
||||
MAX_SKB_FRAGS fragments. In this case, these will not be stored in
|
||||
skb_shinfo(skb)->frags but merged into the frag list.
|
||||
|
||||
batman-adv relies on the function skb_split to split packets up into
|
||||
multiple smaller packets which are not larger than the MTU on the outgoing
|
||||
interface. But this function cannot handle frag_list entries and is only
|
||||
operating on skb_shinfo(skb)->frags. If it is still trying to split such an
|
||||
skb and xmit'ing it on an interface without support for NETIF_F_FRAGLIST,
|
||||
then validate_xmit_skb() will try to linearize it. But this fails due to
|
||||
inconsistent information. And __pskb_pull_tail will trigger a BUG_ON after
|
||||
skb_copy_bits() returns an error.
|
||||
|
||||
In case of entries in frag_list, just linearize the skb before operating on
|
||||
it with skb_split().
|
||||
|
||||
Reported-by: Felix Kaechele <felix@kaechele.ca>
|
||||
Tested-by: Felix Kaechele <felix@kaechele.ca>
|
||||
Fixes: 9de347143505 ("batman-adv: layer2 unicast packet fragmentation")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d467720acaf1b22b0cee58144eeaf9ef6c5e285c
|
||||
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -475,6 +475,17 @@ int batadv_frag_send_packet(struct sk_bu
|
||||
goto free_skb;
|
||||
}
|
||||
|
||||
+ /* GRO might have added fragments to the fragment list instead of
|
||||
+ * frags[]. But this is not handled by skb_split and must be
|
||||
+ * linearized to avoid incorrect length information after all
|
||||
+ * batman-adv fragments were created and submitted to the
|
||||
+ * hard-interface
|
||||
+ */
|
||||
+ if (skb_has_frag_list(skb) && __skb_linearize(skb)) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto free_skb;
|
||||
+ }
|
||||
+
|
||||
/* Create one header to be copied to all fragments */
|
||||
frag_header.packet_type = BATADV_UNICAST_FRAG;
|
||||
frag_header.version = BATADV_COMPAT_VERSION;
|
|
@ -1,43 +0,0 @@
|
|||
From: Shigeru Yoshida <syoshida@redhat.com>
|
||||
Date: Sat, 20 Aug 2022 12:25:16 +0900
|
||||
Subject: batman-adv: Fix hang up with small MTU hard-interface
|
||||
|
||||
The system hangs up when batman-adv soft-interface is created on
|
||||
hard-interface with small MTU. For example, the following commands
|
||||
create batman-adv soft-interface on dummy interface with zero MTU:
|
||||
|
||||
# ip link add name dummy0 type dummy
|
||||
# ip link set mtu 0 dev dummy0
|
||||
# ip link set up dev dummy0
|
||||
# ip link add name bat0 type batadv
|
||||
# ip link set dev dummy0 master bat0
|
||||
|
||||
These commands cause the system hang up with the following messages:
|
||||
|
||||
[ 90.578925][ T6689] batman_adv: bat0: Adding interface: dummy0
|
||||
[ 90.580884][ T6689] batman_adv: bat0: The MTU of interface dummy0 is too small (0) to handle the transport of batman-adv packets. Packets going over this interface will be fragmented on layer2 which could impact the performance. Setting the MTU to 1560 would solve the problem.
|
||||
[ 90.586264][ T6689] batman_adv: bat0: Interface activated: dummy0
|
||||
[ 90.590061][ T6689] batman_adv: bat0: Forced to purge local tt entries to fit new maximum fragment MTU (-320)
|
||||
[ 90.595517][ T6689] batman_adv: bat0: Forced to purge local tt entries to fit new maximum fragment MTU (-320)
|
||||
[ 90.598499][ T6689] batman_adv: bat0: Forced to purge local tt entries to fit new maximum fragment MTU (-320)
|
||||
|
||||
This patch fixes this issue by returning error when enabling
|
||||
hard-interface with small MTU size.
|
||||
|
||||
Fixes: 29a2a3dc52f4 ("hard interface rewrite")
|
||||
Signed-off-by: Shigeru Yoshida <syoshida@redhat.com>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/a124b52ebab91ac416cf7ba05e671cbb860f30e8
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -697,6 +697,9 @@ int batadv_hardif_enable_interface(struc
|
||||
int max_header_len = batadv_max_header_len();
|
||||
int ret;
|
||||
|
||||
+ if (hard_iface->net_dev->mtu < ETH_MIN_MTU + max_header_len)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
|
||||
goto out;
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
From: Vladislav Efanov <VEfanov@ispras.ru>
|
||||
Date: Fri, 26 May 2023 19:16:32 +0300
|
||||
Subject: batman-adv: Broken sync while rescheduling delayed work
|
||||
|
||||
Syzkaller got a lot of crashes like:
|
||||
KASAN: use-after-free Write in *_timers*
|
||||
|
||||
All of these crashes point to the same memory area:
|
||||
|
||||
The buggy address belongs to the object at ffff88801f870000
|
||||
which belongs to the cache kmalloc-8k of size 8192
|
||||
The buggy address is located 5320 bytes inside of
|
||||
8192-byte region [ffff88801f870000, ffff88801f872000)
|
||||
|
||||
This area belongs to :
|
||||
batadv_priv->batadv_priv_dat->delayed_work->timer_list
|
||||
|
||||
The reason for these issues is the lack of synchronization. Delayed
|
||||
work (batadv_dat_purge) schedules new timer/work while the device
|
||||
is being deleted. As the result new timer/delayed work is set after
|
||||
cancel_delayed_work_sync() was called. So after the device is freed
|
||||
the timer list contains pointer to already freed memory.
|
||||
|
||||
Found by Linux Verification Center (linuxtesting.org) with syzkaller.
|
||||
|
||||
Fixes: f6badf9eb582 ("batman-adv: Distributed ARP Table - implement local storage")
|
||||
Signed-off-by: Vladislav Efanov <VEfanov@ispras.ru>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/177ba85fb2d4ca2ecd30ca16803560e80e916fac
|
||||
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -101,7 +101,6 @@ static void batadv_dat_purge(struct work
|
||||
*/
|
||||
static void batadv_dat_start_timer(struct batadv_priv *bat_priv)
|
||||
{
|
||||
- INIT_DELAYED_WORK(&bat_priv->dat.work, batadv_dat_purge);
|
||||
queue_delayed_work(batadv_event_workqueue, &bat_priv->dat.work,
|
||||
msecs_to_jiffies(10000));
|
||||
}
|
||||
@@ -819,6 +818,7 @@ int batadv_dat_init(struct batadv_priv *
|
||||
if (!bat_priv->dat.hash)
|
||||
return -ENOMEM;
|
||||
|
||||
+ INIT_DELAYED_WORK(&bat_priv->dat.work, batadv_dat_purge);
|
||||
batadv_dat_start_timer(bat_priv);
|
||||
|
||||
batadv_tvlv_handler_register(bat_priv, batadv_dat_tvlv_ogm_handler_v1,
|
|
@ -1,29 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Tue, 11 Jul 2023 11:46:30 +0200
|
||||
Subject: batman-adv: compat: Use native kstrtox.h for 5.10.185
|
||||
|
||||
Upstream stable commit 6e2e551e39fd ("kernel.h: split out kstrtox() and
|
||||
simple_strtox() to a separate header") backported the support for
|
||||
linux/kstrtox.h. Unfortunately, the compat support via linux/kernel.h was
|
||||
dropped and thus references to kstrtou64 caused build errors
|
||||
|
||||
batman-adv/net/batman-adv/gateway_common.c: In function ‘batadv_parse_throughput’:
|
||||
batman-adv/net/batman-adv/gateway_common.c:55:15: error: implicit declaration of function ‘kstrtou64’ [-Werror=implicit-function-declaration]
|
||||
55 | ret = kstrtou64(buff, 10, <hroughput);
|
||||
| ^~~~~~~~~
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/8924adbdf993cd0521f9d0024b43e3b23af5114f
|
||||
|
||||
--- a/compat-include/linux/kstrtox.h
|
||||
+++ b/compat-include/linux/kstrtox.h
|
||||
@@ -11,7 +11,8 @@
|
||||
#define _NET_BATMAN_ADV_COMPAT_LINUX_KSTRTOX_H_
|
||||
|
||||
#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 14, 0)
|
||||
+#if (LINUX_VERSION_IS_GEQ(5, 10, 185) && LINUX_VERSION_IS_LESS(5, 11, 0)) || \
|
||||
+ LINUX_VERSION_IS_GEQ(5, 14, 0)
|
||||
#include_next <linux/kstrtox.h>
|
||||
#else
|
||||
#include <linux/kernel.h>
|
|
@ -1,111 +0,0 @@
|
|||
From: Remi Pommarel <repk@triplefau.lt>
|
||||
Date: Fri, 28 Jul 2023 15:38:50 +0200
|
||||
Subject: batman-adv: Do not get eth header before batadv_check_management_packet
|
||||
|
||||
If received skb in batadv_v_elp_packet_recv or batadv_v_ogm_packet_recv
|
||||
is either cloned or non linearized then its data buffer will be
|
||||
reallocated by batadv_check_management_packet when skb_cow or
|
||||
skb_linearize get called. Thus geting ethernet header address inside
|
||||
skb data buffer before batadv_check_management_packet had any chance to
|
||||
reallocate it could lead to the following kernel panic:
|
||||
|
||||
Unable to handle kernel paging request at virtual address ffffff8020ab069a
|
||||
Mem abort info:
|
||||
ESR = 0x96000007
|
||||
EC = 0x25: DABT (current EL), IL = 32 bits
|
||||
SET = 0, FnV = 0
|
||||
EA = 0, S1PTW = 0
|
||||
FSC = 0x07: level 3 translation fault
|
||||
Data abort info:
|
||||
ISV = 0, ISS = 0x00000007
|
||||
CM = 0, WnR = 0
|
||||
swapper pgtable: 4k pages, 39-bit VAs, pgdp=0000000040f45000
|
||||
[ffffff8020ab069a] pgd=180000007fffa003, p4d=180000007fffa003, pud=180000007fffa003, pmd=180000007fefe003, pte=0068000020ab0706
|
||||
Internal error: Oops: 96000007 [#1] SMP
|
||||
Modules linked in: ahci_mvebu libahci_platform libahci dvb_usb_af9035 dvb_usb_dib0700 dib0070 dib7000m dibx000_common ath11k_pci ath10k_pci ath10k_core mwl8k_new nf_nat_sip nf_conntrack_sip xhci_plat_hcd xhci_hcd nf_nat_pptp nf_conntrack_pptp at24 sbsa_gwdt
|
||||
CPU: 1 PID: 16 Comm: ksoftirqd/1 Not tainted 5.15.42-00066-g3242268d425c-dirty #550
|
||||
Hardware name: A8k (DT)
|
||||
pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
|
||||
pc : batadv_is_my_mac+0x60/0xc0
|
||||
lr : batadv_v_ogm_packet_recv+0x98/0x5d0
|
||||
sp : ffffff8000183820
|
||||
x29: ffffff8000183820 x28: 0000000000000001 x27: ffffff8014f9af00
|
||||
x26: 0000000000000000 x25: 0000000000000543 x24: 0000000000000003
|
||||
x23: ffffff8020ab0580 x22: 0000000000000110 x21: ffffff80168ae880
|
||||
x20: 0000000000000000 x19: ffffff800b561000 x18: 0000000000000000
|
||||
x17: 0000000000000000 x16: 0000000000000000 x15: 00dc098924ae0032
|
||||
x14: 0f0405433e0054b0 x13: ffffffff00000080 x12: 0000004000000001
|
||||
x11: 0000000000000000 x10: 0000000000000000 x9 : 0000000000000000
|
||||
x8 : 0000000000000000 x7 : ffffffc076dae000 x6 : ffffff8000183700
|
||||
x5 : ffffffc00955e698 x4 : ffffff80168ae000 x3 : ffffff80059cf000
|
||||
x2 : ffffff800b561000 x1 : ffffff8020ab0696 x0 : ffffff80168ae880
|
||||
Call trace:
|
||||
batadv_is_my_mac+0x60/0xc0
|
||||
batadv_v_ogm_packet_recv+0x98/0x5d0
|
||||
batadv_batman_skb_recv+0x1b8/0x244
|
||||
__netif_receive_skb_core.isra.0+0x440/0xc74
|
||||
__netif_receive_skb_one_core+0x14/0x20
|
||||
netif_receive_skb+0x68/0x140
|
||||
br_pass_frame_up+0x70/0x80
|
||||
br_handle_frame_finish+0x108/0x284
|
||||
br_handle_frame+0x190/0x250
|
||||
__netif_receive_skb_core.isra.0+0x240/0xc74
|
||||
__netif_receive_skb_list_core+0x6c/0x90
|
||||
netif_receive_skb_list_internal+0x1f4/0x310
|
||||
napi_complete_done+0x64/0x1d0
|
||||
gro_cell_poll+0x7c/0xa0
|
||||
__napi_poll+0x34/0x174
|
||||
net_rx_action+0xf8/0x2a0
|
||||
_stext+0x12c/0x2ac
|
||||
run_ksoftirqd+0x4c/0x7c
|
||||
smpboot_thread_fn+0x120/0x210
|
||||
kthread+0x140/0x150
|
||||
ret_from_fork+0x10/0x20
|
||||
Code: f9403844 eb03009f 54fffee1 f94
|
||||
|
||||
Thus ethernet header address should only be fetched after
|
||||
batadv_check_management_packet has been called.
|
||||
|
||||
Fixes: 632835348e65 ("batman-adv: OGMv2 - add basic infrastructure")
|
||||
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/670971ac7e9a47ee952848e0ea9128180e8fb991
|
||||
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -506,7 +506,7 @@ int batadv_v_elp_packet_recv(struct sk_b
|
||||
struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
|
||||
struct batadv_elp_packet *elp_packet;
|
||||
struct batadv_hard_iface *primary_if;
|
||||
- struct ethhdr *ethhdr = (struct ethhdr *)skb_mac_header(skb);
|
||||
+ struct ethhdr *ethhdr;
|
||||
bool res;
|
||||
int ret = NET_RX_DROP;
|
||||
|
||||
@@ -514,6 +514,7 @@ int batadv_v_elp_packet_recv(struct sk_b
|
||||
if (!res)
|
||||
goto free_skb;
|
||||
|
||||
+ ethhdr = eth_hdr(skb);
|
||||
if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
|
||||
goto free_skb;
|
||||
|
||||
--- a/net/batman-adv/bat_v_ogm.c
|
||||
+++ b/net/batman-adv/bat_v_ogm.c
|
||||
@@ -985,7 +985,7 @@ int batadv_v_ogm_packet_recv(struct sk_b
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
|
||||
struct batadv_ogm2_packet *ogm_packet;
|
||||
- struct ethhdr *ethhdr = eth_hdr(skb);
|
||||
+ struct ethhdr *ethhdr;
|
||||
int ogm_offset;
|
||||
u8 *packet_pos;
|
||||
int ret = NET_RX_DROP;
|
||||
@@ -999,6 +999,7 @@ int batadv_v_ogm_packet_recv(struct sk_b
|
||||
if (!batadv_check_management_packet(skb, if_incoming, BATADV_OGM2_HLEN))
|
||||
goto free_skb;
|
||||
|
||||
+ ethhdr = eth_hdr(skb);
|
||||
if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
|
||||
goto free_skb;
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 19 Jul 2023 10:15:05 +0200
|
||||
Subject: batman-adv: Trigger events for auto adjusted MTU
|
||||
|
||||
If an interface changes the MTU, it is expected that an NETDEV_PRECHANGEMTU
|
||||
and NETDEV_CHANGEMTU notification events is triggered. This worked fine for
|
||||
.ndo_change_mtu based changes because core networking code took care of it.
|
||||
But for auto-adjustments after hard-interfaces changes, these events were
|
||||
simply missing.
|
||||
|
||||
Due to this problem, non-batman-adv components weren't aware of MTU changes
|
||||
and thus couldn't perform their own tasks correctly.
|
||||
|
||||
Fixes: 8009e9f7ac4f ("set bat0 MTU according to the MTUs of the hard interfaces")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/27c4d7c1c7fa39d71ea6ccf1c23bcb4773243800
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -626,7 +626,7 @@ out:
|
||||
*/
|
||||
void batadv_update_min_mtu(struct net_device *soft_iface)
|
||||
{
|
||||
- soft_iface->mtu = batadv_hardif_min_mtu(soft_iface);
|
||||
+ dev_set_mtu(soft_iface, batadv_hardif_min_mtu(soft_iface));
|
||||
|
||||
/* Check if the local translate table should be cleaned up to match a
|
||||
* new (and smaller) MTU.
|
|
@ -1,71 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 19 Jul 2023 10:15:06 +0200
|
||||
Subject: batman-adv: Don't increase MTU when set by user
|
||||
|
||||
If the user set an MTU value, it usually means that there are special
|
||||
requirements for the MTU. But if an interface gots activated, the MTU was
|
||||
always recalculated and then the user set value was overwritten.
|
||||
|
||||
The only reason why this user set value has to be overwritten, is when the
|
||||
MTU has to be decreased because batman-adv is not able to transfer packets
|
||||
with the user specified size.
|
||||
|
||||
Fixes: 88861ea9acb7 ("[batman-adv] replacing if up/down timer with kernel notifications")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/2745af592150b758ee96abf9329dd5f42cf22c25
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -626,7 +626,19 @@ out:
|
||||
*/
|
||||
void batadv_update_min_mtu(struct net_device *soft_iface)
|
||||
{
|
||||
- dev_set_mtu(soft_iface, batadv_hardif_min_mtu(soft_iface));
|
||||
+ struct batadv_priv *bat_priv = netdev_priv(soft_iface);
|
||||
+ int limit_mtu;
|
||||
+ int mtu;
|
||||
+
|
||||
+ mtu = batadv_hardif_min_mtu(soft_iface);
|
||||
+
|
||||
+ if (bat_priv->mtu_set_by_user)
|
||||
+ limit_mtu = bat_priv->mtu_set_by_user;
|
||||
+ else
|
||||
+ limit_mtu = ETH_DATA_LEN;
|
||||
+
|
||||
+ mtu = min(mtu, limit_mtu);
|
||||
+ dev_set_mtu(soft_iface, mtu);
|
||||
|
||||
/* Check if the local translate table should be cleaned up to match a
|
||||
* new (and smaller) MTU.
|
||||
--- a/net/batman-adv/soft-interface.c
|
||||
+++ b/net/batman-adv/soft-interface.c
|
||||
@@ -154,11 +154,14 @@ static int batadv_interface_set_mac_addr
|
||||
|
||||
static int batadv_interface_change_mtu(struct net_device *dev, int new_mtu)
|
||||
{
|
||||
+ struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
+
|
||||
/* check ranges */
|
||||
if (new_mtu < 68 || new_mtu > batadv_hardif_min_mtu(dev))
|
||||
return -EINVAL;
|
||||
|
||||
dev->mtu = new_mtu;
|
||||
+ bat_priv->mtu_set_by_user = new_mtu;
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/net/batman-adv/types.h
|
||||
+++ b/net/batman-adv/types.h
|
||||
@@ -1547,6 +1547,12 @@ struct batadv_priv {
|
||||
struct net_device *soft_iface;
|
||||
|
||||
/**
|
||||
+ * @mtu_set_by_user: MTU was set once by user
|
||||
+ * protected by rtnl_lock
|
||||
+ */
|
||||
+ int mtu_set_by_user;
|
||||
+
|
||||
+ /**
|
||||
* @bat_counters: mesh internal traffic statistic counters (see
|
||||
* batadv_counters)
|
||||
*/
|
|
@ -1,76 +0,0 @@
|
|||
From: Remi Pommarel <repk@triplefau.lt>
|
||||
Date: Fri, 4 Aug 2023 11:39:36 +0200
|
||||
Subject: batman-adv: Fix TT global entry leak when client roamed back
|
||||
|
||||
When a client roamed back to a node before it got time to destroy the
|
||||
pending local entry (i.e. within the same originator interval) the old
|
||||
global one is directly removed from hash table and left as such.
|
||||
|
||||
But because this entry had an extra reference taken at lookup (i.e using
|
||||
batadv_tt_global_hash_find) there is no way its memory will be reclaimed
|
||||
at any time causing the following memory leak:
|
||||
|
||||
unreferenced object 0xffff0000073c8000 (size 18560):
|
||||
comm "softirq", pid 0, jiffies 4294907738 (age 228.644s)
|
||||
hex dump (first 32 bytes):
|
||||
06 31 ac 12 c7 7a 05 00 01 00 00 00 00 00 00 00 .1...z..........
|
||||
2c ad be 08 00 80 ff ff 6c b6 be 08 00 80 ff ff ,.......l.......
|
||||
backtrace:
|
||||
[<00000000ee6e0ffa>] kmem_cache_alloc+0x1b4/0x300
|
||||
[<000000000ff2fdbc>] batadv_tt_global_add+0x700/0xe20
|
||||
[<00000000443897c7>] _batadv_tt_update_changes+0x21c/0x790
|
||||
[<000000005dd90463>] batadv_tt_update_changes+0x3c/0x110
|
||||
[<00000000a2d7fc57>] batadv_tt_tvlv_unicast_handler_v1+0xafc/0xe10
|
||||
[<0000000011793f2a>] batadv_tvlv_containers_process+0x168/0x2b0
|
||||
[<00000000b7cbe2ef>] batadv_recv_unicast_tvlv+0xec/0x1f4
|
||||
[<0000000042aef1d8>] batadv_batman_skb_recv+0x25c/0x3a0
|
||||
[<00000000bbd8b0a2>] __netif_receive_skb_core.isra.0+0x7a8/0xe90
|
||||
[<000000004033d428>] __netif_receive_skb_one_core+0x64/0x74
|
||||
[<000000000f39a009>] __netif_receive_skb+0x48/0xe0
|
||||
[<00000000f2cd8888>] process_backlog+0x174/0x344
|
||||
[<00000000507d6564>] __napi_poll+0x58/0x1f4
|
||||
[<00000000b64ef9eb>] net_rx_action+0x504/0x590
|
||||
[<00000000056fa5e4>] _stext+0x1b8/0x418
|
||||
[<00000000878879d6>] run_ksoftirqd+0x74/0xa4
|
||||
unreferenced object 0xffff00000bae1a80 (size 56):
|
||||
comm "softirq", pid 0, jiffies 4294910888 (age 216.092s)
|
||||
hex dump (first 32 bytes):
|
||||
00 78 b1 0b 00 00 ff ff 0d 50 00 00 00 00 00 00 .x.......P......
|
||||
00 00 00 00 00 00 00 00 50 c8 3c 07 00 00 ff ff ........P.<.....
|
||||
backtrace:
|
||||
[<00000000ee6e0ffa>] kmem_cache_alloc+0x1b4/0x300
|
||||
[<00000000d9aaa49e>] batadv_tt_global_add+0x53c/0xe20
|
||||
[<00000000443897c7>] _batadv_tt_update_changes+0x21c/0x790
|
||||
[<000000005dd90463>] batadv_tt_update_changes+0x3c/0x110
|
||||
[<00000000a2d7fc57>] batadv_tt_tvlv_unicast_handler_v1+0xafc/0xe10
|
||||
[<0000000011793f2a>] batadv_tvlv_containers_process+0x168/0x2b0
|
||||
[<00000000b7cbe2ef>] batadv_recv_unicast_tvlv+0xec/0x1f4
|
||||
[<0000000042aef1d8>] batadv_batman_skb_recv+0x25c/0x3a0
|
||||
[<00000000bbd8b0a2>] __netif_receive_skb_core.isra.0+0x7a8/0xe90
|
||||
[<000000004033d428>] __netif_receive_skb_one_core+0x64/0x74
|
||||
[<000000000f39a009>] __netif_receive_skb+0x48/0xe0
|
||||
[<00000000f2cd8888>] process_backlog+0x174/0x344
|
||||
[<00000000507d6564>] __napi_poll+0x58/0x1f4
|
||||
[<00000000b64ef9eb>] net_rx_action+0x504/0x590
|
||||
[<00000000056fa5e4>] _stext+0x1b8/0x418
|
||||
[<00000000878879d6>] run_ksoftirqd+0x74/0xa4
|
||||
|
||||
Releasing the extra reference from batadv_tt_global_hash_find even at
|
||||
roam back when batadv_tt_global_free is called fixes this memory leak.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 2443ba383c7d ("batman-adv: roaming handling mechanism redesign")
|
||||
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/26fce59c70729e07034de966ac5fd2d5c1f2d597
|
||||
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -774,7 +774,6 @@ check_roaming:
|
||||
if (roamed_back) {
|
||||
batadv_tt_global_free(bat_priv, tt_global,
|
||||
"Roaming canceled");
|
||||
- tt_global = NULL;
|
||||
} else {
|
||||
/* The global entry has to be marked as ROAMING and
|
||||
* has to be kept for consistency purpose
|
|
@ -1,47 +0,0 @@
|
|||
From: Remi Pommarel <repk@triplefau.lt>
|
||||
Date: Wed, 9 Aug 2023 17:29:13 +0200
|
||||
Subject: batman-adv: Fix batadv_v_ogm_aggr_send memory leak
|
||||
|
||||
When batadv_v_ogm_aggr_send is called for an inactive interface, the skb
|
||||
is silently dropped by batadv_v_ogm_send_to_if() but never freed causing
|
||||
the following memory leak:
|
||||
|
||||
unreferenced object 0xffff00000c164800 (size 512):
|
||||
comm "kworker/u8:1", pid 2648, jiffies 4295122303 (age 97.656s)
|
||||
hex dump (first 32 bytes):
|
||||
00 80 af 09 00 00 ff ff e1 09 00 00 75 01 60 83 ............u.`.
|
||||
1f 00 00 00 b8 00 00 00 15 00 05 00 da e3 d3 64 ...............d
|
||||
backtrace:
|
||||
[<0000000007ad20f6>] __kmalloc_track_caller+0x1a8/0x310
|
||||
[<00000000d1029e55>] kmalloc_reserve.constprop.0+0x70/0x13c
|
||||
[<000000008b9d4183>] __alloc_skb+0xec/0x1fc
|
||||
[<00000000c7af5051>] __netdev_alloc_skb+0x48/0x23c
|
||||
[<00000000642ee5f5>] batadv_v_ogm_aggr_send+0x50/0x36c
|
||||
[<0000000088660bd7>] batadv_v_ogm_aggr_work+0x24/0x40
|
||||
[<0000000042fc2606>] process_one_work+0x3b0/0x610
|
||||
[<000000002f2a0b1c>] worker_thread+0xa0/0x690
|
||||
[<0000000059fae5d4>] kthread+0x1fc/0x210
|
||||
[<000000000c587d3a>] ret_from_fork+0x10/0x20
|
||||
|
||||
Free the skb in that case to fix this leak.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 632835348e65 ("batman-adv: OGMv2 - add basic infrastructure")
|
||||
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/9024db261180f73fc687a9ecc7e79e3b0ccf50dc
|
||||
|
||||
--- a/net/batman-adv/bat_v_ogm.c
|
||||
+++ b/net/batman-adv/bat_v_ogm.c
|
||||
@@ -123,8 +123,10 @@ static void batadv_v_ogm_send_to_if(stru
|
||||
{
|
||||
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||
|
||||
- if (hard_iface->if_status != BATADV_IF_ACTIVE)
|
||||
+ if (hard_iface->if_status != BATADV_IF_ACTIVE) {
|
||||
+ kfree_skb(skb);
|
||||
return;
|
||||
+ }
|
||||
|
||||
batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_TX);
|
||||
batadv_add_counter(bat_priv, BATADV_CNT_MGMT_TX_BYTES,
|
|
@ -1,35 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Mon, 21 Aug 2023 21:48:48 +0200
|
||||
Subject: batman-adv: Hold rtnl lock during MTU update via netlink
|
||||
|
||||
The automatic recalculation of the maximum allowed MTU is usually triggered
|
||||
by code sections which are already rtnl lock protected by callers outside
|
||||
of batman-adv. But when the fragmentation setting is changed via
|
||||
batman-adv's own batadv genl family, then the rtnl lock is not yet taken.
|
||||
|
||||
But dev_set_mtu requires that the caller holds the rtnl lock because it
|
||||
uses netdevice notifiers. And this code will then fail the check for this
|
||||
lock:
|
||||
|
||||
RTNL: assertion failed at net/core/dev.c (1953)
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Reported-by: syzbot+f8812454d9b3ac00d282@syzkaller.appspotmail.com
|
||||
Fixes: 27c4d7c1c7fa ("batman-adv: Trigger events for auto adjusted MTU")
|
||||
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/aeb35331aa9a17f9affd84c1a5b020aeb4a976f4
|
||||
|
||||
--- a/net/batman-adv/netlink.c
|
||||
+++ b/net/batman-adv/netlink.c
|
||||
@@ -494,7 +494,10 @@ static int batadv_netlink_set_mesh(struc
|
||||
attr = info->attrs[BATADV_ATTR_FRAGMENTATION_ENABLED];
|
||||
|
||||
atomic_set(&bat_priv->fragmentation, !!nla_get_u8(attr));
|
||||
+
|
||||
+ rtnl_lock();
|
||||
batadv_update_min_mtu(bat_priv->soft_iface);
|
||||
+ rtnl_unlock();
|
||||
}
|
||||
|
||||
if (info->attrs[BATADV_ATTR_GW_BANDWIDTH_DOWN]) {
|
|
@ -5,103 +5,45 @@
|
|||
#include <linux/version.h> /* LINUX_VERSION_CODE */
|
||||
#include <linux/types.h>
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(5, 10, 0)
|
||||
#if LINUX_VERSION_IS_LESS(6, 0, 0)
|
||||
|
||||
#include <linux/if_bridge.h>
|
||||
#define __vstring(item, fmt, ap) __dynamic_array(char, item, 256)
|
||||
#define __assign_vstr(dst, fmt, va) \
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(dst), 256, fmt, *va) >= 256)
|
||||
|
||||
struct batadv_br_ip {
|
||||
union {
|
||||
__be32 ip4;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
struct in6_addr ip6;
|
||||
#endif
|
||||
} dst;
|
||||
__be16 proto;
|
||||
__u16 vid;
|
||||
};
|
||||
#endif /* LINUX_VERSION_IS_LESS(6, 0, 0) */
|
||||
|
||||
struct batadv_br_ip_list {
|
||||
struct list_head list;
|
||||
struct batadv_br_ip addr;
|
||||
};
|
||||
#if LINUX_VERSION_IS_LESS(6, 2, 0)
|
||||
|
||||
#if 0
|
||||
/* "static" dropped to force compiler to evaluate it as part of multicast.c
|
||||
* might need to be added again and then called in some kind of dummy
|
||||
* compat.c in case this header is included in multiple files.
|
||||
#include <linux/random.h>
|
||||
|
||||
#define genl_split_ops genl_ops
|
||||
|
||||
static inline u32 batadv_get_random_u32_below(u32 ep_ro)
|
||||
{
|
||||
return prandom_u32_max(ep_ro);
|
||||
}
|
||||
|
||||
#define get_random_u32_below batadv_get_random_u32_below
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(6, 2, 0) */
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(6, 4, 0) && \
|
||||
!(LINUX_VERSION_IS_GEQ(5, 10, 205) && LINUX_VERSION_IS_LESS(5, 11, 0)) && \
|
||||
!(LINUX_VERSION_IS_GEQ(5, 15, 144) && LINUX_VERSION_IS_LESS(5, 16, 0)) && \
|
||||
!(LINUX_VERSION_IS_GEQ(6, 1, 69) && LINUX_VERSION_IS_LESS(6, 2, 0))
|
||||
|
||||
#include <linux/if_vlan.h>
|
||||
|
||||
/* Prefer this version in TX path, instead of
|
||||
* skb_reset_mac_header() + vlan_eth_hdr()
|
||||
*/
|
||||
inline void __batadv_br_ip_list_check(void)
|
||||
static inline struct vlan_ethhdr *skb_vlan_eth_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
BUILD_BUG_ON(sizeof(struct batadv_br_ip_list) != sizeof(struct br_ip_list));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, list) != offsetof(struct br_ip_list, list));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, addr) != offsetof(struct br_ip_list, addr));
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct batadv_br_ip) != sizeof(struct br_ip));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip4) != offsetof(struct br_ip, u.ip4));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip6) != offsetof(struct br_ip, u.ip6));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip, proto) != offsetof(struct br_ip, proto));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip, vid) != offsetof(struct br_ip, vid));
|
||||
return (struct vlan_ethhdr *)skb->data;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define br_ip batadv_br_ip
|
||||
#define br_ip_list batadv_br_ip_list
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(5, 14, 0)
|
||||
|
||||
#include <linux/if_bridge.h>
|
||||
#include <net/addrconf.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
static inline bool
|
||||
br_multicast_has_router_adjacent(struct net_device *dev, int proto)
|
||||
{
|
||||
struct list_head bridge_mcast_list = LIST_HEAD_INIT(bridge_mcast_list);
|
||||
struct br_ip_list *br_ip_entry, *tmp;
|
||||
int ret;
|
||||
|
||||
if (proto != ETH_P_IPV6)
|
||||
return true;
|
||||
|
||||
ret = br_multicast_list_adjacent(dev, &bridge_mcast_list);
|
||||
if (ret < 0)
|
||||
return true;
|
||||
|
||||
ret = false;
|
||||
|
||||
list_for_each_entry_safe(br_ip_entry, tmp, &bridge_mcast_list, list) {
|
||||
if (br_ip_entry->addr.proto == htons(ETH_P_IPV6) &&
|
||||
ipv6_addr_is_ll_all_routers(&br_ip_entry->addr.dst.ip6))
|
||||
ret = true;
|
||||
|
||||
list_del(&br_ip_entry->list);
|
||||
kfree(br_ip_entry);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
static inline bool
|
||||
br_multicast_has_router_adjacent(struct net_device *dev, int proto)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(5, 14, 0) */
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(5, 15, 0)
|
||||
|
||||
static inline void batadv_eth_hw_addr_set(struct net_device *dev,
|
||||
const u8 *addr)
|
||||
{
|
||||
ether_addr_copy(dev->dev_addr, addr);
|
||||
}
|
||||
#define eth_hw_addr_set batadv_eth_hw_addr_set
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(5, 15, 0) */
|
||||
#endif /* LINUX_VERSION_IS_LESS(6, 4, 0) */
|
||||
|
||||
/* <DECLARE_EWMA> */
|
||||
|
||||
|
|
|
@ -1,342 +0,0 @@
|
|||
<!--
|
||||
---------------------------------------------------------------------
|
||||
(C) 2014 - 2017 Eloi Carbo <eloicaso@openmailbox.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
---------------------------------------------------------------------
|
||||
-->
|
||||
|
||||
# LUCI Bird{4|6} v0.3 Packages Documentation
|
||||
* BIRD Daemon's official documentation: http://bird.network.cz/?get_doc
|
||||
* Extra documentation in English & Catalan: https://github.com/eloicaso/bgp-bmx6-bird-docn
|
||||
* If you want to add new options to bird*-openwrt packages add a pull request or issue in: https://github.com/eloicaso/bird-openwrt
|
||||
|
||||
> *Clarification*: This documentation covers luci-app-bird{4|6} as both are completely aligned and only those IPv4/6-specific options will be covered separately.
|
||||
>
|
||||
> Bird v1.6.3 has been used to test luci-app-bird{4|6}. Using newer versions of the Daemon might change the behaviour or messages documented here. Create an issue or pull request if you spot any mismatch in this document to address it.
|
||||
|
||||
# Table of contents
|
||||
1. [Status Page](#status)
|
||||
2. [Log Page](#log)
|
||||
3. [Overview Page](#overview)
|
||||
4. [General Protocols Page](#general)
|
||||
5. [BGP Portocol](#bgp)
|
||||
6. [Filters and Functions](#fnf)
|
||||
|
||||
|
||||
## Status Page <a name="status"></a>
|
||||
The Status Page allows you to Start, Stop and restart the service as well as to check the result of these operations.
|
||||
|
||||
#### Components
|
||||
- *Button* **Start**: Execute a Bird Daemon Service Start call. Operation's result is shown in the *Service Status* Text Box.
|
||||
- *Button* **Stop**: Execute a Bird Daemon Service Stop call. Operation's result is shown in the *Service Status* Text Box.
|
||||
- *Button* **Restart**: Execute a Bird Daemon Service Restart call. Operation's result is shown in the *Service Status* Text Box.
|
||||
- *Text Box* **Service Status**: Executes a Bird Daemon Service Status call. Operation's result is shown as plain text.
|
||||
|
||||
#### Service Status common messages
|
||||
* *Running*: Service is running with no issues
|
||||
* *Already started*: You have clicked *Start* when the service was already running. No action taken.
|
||||
* *Stopped*: You have clicked *Stop* when the service was running. Service has been stopped.
|
||||
* *Already stopped*: You have clicked *Stop* when the service was already stopped. No action taken.
|
||||
* *Stopped ... Started*: You have pressed *Restart* when the service was running. The service has been restarted.
|
||||
* *Already stopped .. Started*: You have pressed *Restart* when the service was already stopped. The service has been started.
|
||||
* *Failed - ERROR MESSAGE*: There is a configuration or validation issue that prevents Bird to start. Check the *Error Message* and the Log Page to debug it and fix it.
|
||||
|
||||
#### Error Examples
|
||||
1. Validation issues:
|
||||
`bird4: Failed - bird: /tmp/bird4.conf, line 65: syntax error`
|
||||
|
||||
If we check the file shown: `/tmp/bird4.conf` :
|
||||
```
|
||||
protocol bgp BGPExample {
|
||||
import Filter NonExistingFilter;
|
||||
}
|
||||
```
|
||||
We have entered an invalid (non-existent in this case) filter name. In order to fix this, write the correct Filter Name or remove its reference from the BGP Protocol Configuration Page and start the service again.
|
||||
|
||||
2. Configuration issues:
|
||||
` bird4: Failed - bird: /tmp/bird4.conf, line 76: Only internal neighbor can be RR client`
|
||||
|
||||
In this case, it is easy to spot that we have incorrectly selected the *Route Reflector Server* option incorrectly and we only need to untick it and start the service to solve it.
|
||||
|
||||
Usuarlly, any configuration issue will be flagged appropiately through Bird service messages. However, in the event where you do not have enough information, please look for advice in either Bird's documentation or in the affected Protocol's documentation.
|
||||
|
||||
## Log Page <a name="log"></a>
|
||||
The Log Page shows the last 30 lines of the configured Bird Daemon Log file. This information is automatically refreshed each second.
|
||||
|
||||
#### Components
|
||||
- *Text Area* **Log File**: 30 lines text area that shows the Log file information
|
||||
- *Text* **Using Log File** and **File Size**: The first line of the Text Area is fixed and shows the file being used and its current size. **Please**, check this size information regularly to avoid letting the Log information overflow your Storage as it will make your service stop and prevent it to start until you fix it.
|
||||
- *Text* **File Contents**: The next 30 lines show information about the events and debug information happening live. Main information are state changes and *info, warning, fatal or trace*. If you hit any issue starting the service, you can investigate the issue from this page.
|
||||
|
||||
|
||||
## Overview Page <a name="overview"></a>
|
||||
The Overview Page includes the configuration of basic Bird Daemon settings such as UCI usage, Routing Tables definition and Global Options.
|
||||
|
||||
### Bird File Settings (UCI Usage)
|
||||
This section enables/disables the use of this package's capabilities.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Use UCI configuration**:
|
||||
- If enabled, the package will use the UCI configuration generated by this web settings and translate it into a Bird Daemon configuration file.
|
||||
- If disabled, the package will do nothing and you will have to manually edit a Bird Daemon configuration file.
|
||||
- *Text Box* **UCI File**: This file specifies the selected location for the translated Bird Daemon configuration file. Do not leave blank.
|
||||
|
||||
### Tables Configuration
|
||||
This section allows you to set the Routing tables that will be used later in the different protocols. You can *Add* as many instances as required.
|
||||
|
||||
#### Components
|
||||
- *Text Box* **Table Name**: Set an unique (meaningful) routing table name.
|
||||
> In some instances or protocols, you may want or be required to set a specific ID to a Table. In order to do this, please, follow this -right now- [manual procedure](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md).
|
||||
|
||||
|
||||
### Global Options
|
||||
This section allows you to configure basic Bird Daemon settings.
|
||||
|
||||
#### Components
|
||||
- *Text Box* **Router ID**: Set the Identificator to be used in this Bird Daemon instance. This option must be:
|
||||
> IPv4, this option will be set by default to the lowest IP Address configured. Otherwise, the identificator must be an IPv4 address.
|
||||
|
||||
> IPv6, this option is **mandatory** and must be a HEX value (Hexadecimal). This package (bird6-uci), provides the HEX value *0xCAFEBABE* as a default value to avoid initial crashes.
|
||||
|
||||
- *Text Box* **Log File**: Set the Name and Location of the Log file. By default, its location will be /tmp/bird{4|6}.log as the non-persistent partition.
|
||||
- *Mutiple Value* **Log**: Set which elements you want Bird Daemon to log in the configured file.
|
||||
> *Caution I*: if you select *All*, the other selected options will have no validity as, by definition, they are already included.
|
||||
> *Caution II*: Take into consideration that the more elements Bird has to log, the more space you will require to store this log file. If your storage is full, Bird will fail to start until you free some space to store its Log data.
|
||||
|
||||
- *Multi Value* **Debug**: Set which Debug information elements you want Bird Daemon to log in the configured file.
|
||||
> *Caution I*: if you select *All*, the other selected options will have no validity as, by definition, they are already included.
|
||||
> *Caution II*: Take into consideration that the more elements Bird has to log, the more space you will require to store this log file (this is particularly critical in Debug as it can log MegaBytes of data quickly). If your storage is full, Bird will fail to start until you free some space to store its Log data.
|
||||
|
||||
## General Protocols <a name="general"></a>
|
||||
The General Protocols Page includes the configuration of key OS Protocols or Network Basic Settings such as Kernel, Device or Static Routes.
|
||||
|
||||
### Kernel Options
|
||||
This section allows you to set all the Kernel Protocols required to do Networking.
|
||||
> The first Kernel instance is the Primary one and must be left by default for OS usage. Do not set its "Table" or "Kernel Table" options.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *List Value* **Table**: Select the Routing Table to be used in the Kernel Protocol instance.
|
||||
> The Primary Kernel Protocol cannot be empty.
|
||||
|
||||
- *Text Box* **Import**: Set if the protocol must import routes and which ones.
|
||||
- **all**: Accept all the incoming routes.
|
||||
- **none**: Reject all the incoming routes.
|
||||
- **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
|
||||
- *Text Box* **Export**: Set if the protocol must export routes and which ones.
|
||||
- **all**: Accept all the outgoing routes.
|
||||
- **none**: Reject all the outgoing routes.
|
||||
- **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
|
||||
- *Text Box* **Scan time**: Set the time between Kernel Routing Table scans. This value must be the same for all the Kernel Protocols.
|
||||
- *Check Box* **Learn**: Set this option to allow the Kernel Protocol to learn Routes form other routing daemons or manually added by an admin.
|
||||
- *Check Box* **Persist**: Set this option to store the routes learnt in the table until it is removed. Unset this option if you want to clean the routes on the fly.
|
||||
- *Text Box* **Kernel Table**: Select the specific exitisting Routing Table for this Protocol instance.
|
||||
> The Kernel Table ID must be previously set by the administrator during the Routing Table configuration. Currently (v0.3), this process is done manually. Please, follow this [manual procedure](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md).
|
||||
|
||||
### Device Options
|
||||
This section allows you to set all the Device *Protocol*. The Device *Protocol* is just a mechanism to bound the interfaces and Kernel tables in order to get its information.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *Text Box* **Scan Time**: Set the time between Kernel Routing Table scans. This value must be the same for all the Kernel Protocols.
|
||||
|
||||
### Static Options
|
||||
This section allows you to create the container for Routes definition. Static protocol instances allows you to manually create Routes that Bird will use and which Routing Table should hold this information. It also helps to manage routes by marking them (i.e. *Unreachable*, *Blocked*, ...).
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *List Value* **Table**: Select the Routing Table to be used in the Static Protocol instance.
|
||||
|
||||
### Routes
|
||||
This section allows to set which Routes will be set in a specific Static Protocol and how these should be handled.
|
||||
|
||||
#### Components
|
||||
- *List Value* **Route Instance**: Set which Static Protocol instance will contain this route infromation.
|
||||
> Routes require an existing Static Protocol as parent.
|
||||
|
||||
- *Text Box* **Route Prefix**: Set the Route instance to be defined.
|
||||
> Examples of routes are:. 10.0.0.0/8 (IPv4) or 2001:DB8:3000:0/16 (IPv6)
|
||||
|
||||
- *List Value* **Type Of Route**: This value will set the conditional settings. Options are:
|
||||
- **Router**: Classic routes going through specific IP Addresses.
|
||||
- *Text Box* **Via**: Set the target IP Address to be used for Routing
|
||||
> I.e. 10.0.0.0/8 via 10.1.1.1
|
||||
|
||||
- **MultiPath**: Multiple paths Route.
|
||||
- *List of Text Box* **Via**: Set the target Route to be used for Routing. This option allows several instances of **Via** elements.
|
||||
> I.e. 10.0.0.0/8 via 10.1.1.1
|
||||
> via 10.1.1.100
|
||||
> via 10.1.1.200
|
||||
|
||||
- **Special**: Special treated Route.
|
||||
- *Text Box* **Attribute**: Block special consideration of routes.
|
||||
> **unreachable**: Return route cannot be reached.
|
||||
> **prohibit**: Return route has been administratively blocked.
|
||||
> **blackhole**: Silently drop the route.
|
||||
|
||||
- **Iface**: Classic routes going through specific interfaces.
|
||||
- *List Value* **Interface**: Select the target interface to route.
|
||||
|
||||
- **Recursive**: Set a static recursive route. Its next hope will depen on the table's lookup for each target IP Address.
|
||||
|
||||
### Direct Protocol
|
||||
This section allows to set pools of *directly* connected interfaces. Direct Protocol instances will make use of the *Device* Protocol in order to generate routes between the selected interfaces.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *Text Box* **Interfaces**: This is the key option allowing to *tie* the interfaces and create direct routes between different sides. Enter each interface's name you want to couple.
|
||||
- If you leave this option empty, it will tie all the interfaces together.
|
||||
- Each interface must be quoted: i.e. `"eth0"`
|
||||
- Several interfaces must be entered comma-separated: i.e. `"eth0", "wlan0"`
|
||||
- If you want to restrict this to specific interfaces, you have to enter them using its name or a pattern: i.e. All the ethernet interfaces `"eth*"`
|
||||
- You are allowed to **exclude** specific interfaces by adding `-` before the interface name: i.e. Exclude all the Wireless interfaces `"-wlan*"`
|
||||
> Example: All the wired interfaces (eth and em) but exclude all the wireless and point-to-point interfaces: `"eth*", "em*", "-wlan*", "-ptp_*"`
|
||||
|
||||
> Current version 0.3 requires you to enter each interface you want to **include** or **exclude** manually. This will be enhanced in future versions.
|
||||
|
||||
### Pipe Protocol
|
||||
This section allows to set instances of *linked* routing tables. Each instance will allow you to share the routes from a primary table to a secondary one.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *List Value* **Table**: Select the **Primary** Routing Table to be used.
|
||||
- *List Value* **Peer Table**: Select the **Secondary** Routing Table to be used.
|
||||
- *List Value* **Mode**: Set if you want to work in *transparent* or *opaque* mode.
|
||||
- **Transparent**: Retransmits all the routes and its attributes. Therefore, you get two identical routing tables. This is the default behaviour.
|
||||
- **Opaque**: This mode is not recommended for new configurations and it is not recommended. Tables will only share the optimal routes and overwrite route's attributes with new ones (Pipe).
|
||||
- *Text Box* **Import**: Set if the protocol must import routes and which ones.
|
||||
- **all**: Accept all the incoming routes.
|
||||
- **none**: Reject all the incoming routes.
|
||||
- **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
|
||||
- *Text Box* **Export**: Set if the protocol must export routes and which ones.
|
||||
- **all**: Accept all the outgoing routes.
|
||||
- **none**: Reject all the outgoing routes.
|
||||
- **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
|
||||
|
||||
|
||||
## BGP Protocol<a name="bgp"></a>
|
||||
The BGP Protocol Page includes all the settings to configure BGP Templates and BGP instances.
|
||||
BGP Templates and Instances share most of the options as Templates are meant to diminish the requirements on Instances.
|
||||
> An extreme example case could be the Template holding all the options and the Instance only referencing to the Template as the only option..
|
||||
|
||||
### BGP Templates
|
||||
This section allows you to set BGP Templates, which are commonly used BGP configuration*themes* to reduce the number of repeated settings while adding BGP Instances.
|
||||
|
||||
### BGP Instances
|
||||
This section allows you to set BGP Instances. The Instances are the ones starting the BGP Protocol and can, or not, use a BGP Template to re-use the common properties.
|
||||
> **Caution**: Any duplicated option between an Instance and a Template will resolve by using the Instance option and dismissing the Template one. **Instance** > *Template*.
|
||||
|
||||
#### BGP Instance Specific Option
|
||||
- *List Value* **Templates**: Set the BGP Template that will feed the instance. Any option in the Template will be inherited.
|
||||
|
||||
#### Common Options
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *Text Area* **Description**: Set a descriptive text to identify this protocol and what it does.
|
||||
- *Text Box* **Import**: Set if the protocol must import routes and which ones.
|
||||
- **all**: Accept all the incoming routes.
|
||||
- **none**: Reject all the incoming routes.
|
||||
- **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
|
||||
- *Text Box* **Export**: Set if the protocol must export routes and which ones.
|
||||
- **all**: Accept all the outgoing routes.
|
||||
- **none**: Reject all the outgoing routes.
|
||||
- **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
|
||||
- *List Value* **Table**: Select the Routing Table to be used.
|
||||
- *List Value* **IGP Table**: Set the IGP Routing Table (Internal BGP). Bird uses the same Routing Table for both External BGP and Internal BGP by default.
|
||||
- *Text Area* **Source Address**: Set the local IP Address. By default the Router ID will be used.
|
||||
- *Text Area* **Local AS**: Set the local BGP Autonomous System ID.
|
||||
- *Text Area* **Local BGP Address**: Set the local BGP Autonomous System IP Address.
|
||||
- *Text Area* **Neighbor IP Address**: Set BGP neighbour's IP Address.
|
||||
- *Text Area* **Neighbor AS**: Set BGP neighbour's Autonomous System ID.
|
||||
- *Check Box* **Next Hop Self**: Overwrite Next Hop cost attributes with its own source address as next hop. Disabled by default as it is only used in some specific instances.
|
||||
- *Check Box* **Next Hop Keep**: Forward the same Next Hop information even in situations where the system would use its own source address instead. Disabled by default.
|
||||
- *Check Box* **Route Reflector Server**: Set if BGP instance must act as a Route Reflector Server and expect neighbours AS to act as clients
|
||||
- *Text Value* **Route Reflector Cluster ID**: Route Reflector service ID to avoid loops. This options is only allowed in the Server (not clients) and it is Router's ID by default.
|
||||
- *Text Box* **Routes Import Limit**: Set the maximum number of routes the protocol will import.
|
||||
- *List Value* **Routes Import Limit Action**: Set the action to apply if the *Routes Import Limit* is exceeded. Options are:
|
||||
- **block**: Block any route exceeding the limit.
|
||||
- **disable**: Stop the protocol.
|
||||
- **warn**: Print Log warnings.
|
||||
- **restart**: Restart the protocol.
|
||||
- *Text Box* **Routes Export Limit**: Set the maximum number of routes the protocol will export.
|
||||
- *List Value* **Routes Export Limit Action**: Set the action to apply if the *Routes Export Limit* is exceeded. Options are:
|
||||
- **block**: Block any route exceeding the limit.
|
||||
- **disable**: Stop BGP protocol.
|
||||
- **warn**: Print Log warnings.
|
||||
- **restart**: Restart BGP protocol.
|
||||
- *Text Box* **Routes Received Limit**: Set the maximum number of shared routes the Protocol must accept and remember (the **number** of imported routes is not affected by this option).
|
||||
- *List Value* **Routes Received Limit Action**: Set the action to apply if the *Routes Received Limit* is exceeded. Options are:
|
||||
- **block**: Block any route exceeding the limit.
|
||||
- **disable**: Stop BGP protocol.
|
||||
- **warn**: Print Log warnings.
|
||||
- **restart**: Restart BGP protocol.
|
||||
|
||||
|
||||
## Filters and Functions<a name="fnf"></a>
|
||||
The Filters and the Functions Page allows you to edit Bird Daemon Filter and Functions files without requiring you to go to command line. Both Pages share the same code base and the only main change is where they are getting the files from. Therefore, and for documentation simplicity sake, both pages will be covered in this section.
|
||||
> From version 0.3 onwards:
|
||||
> The default and supported place to store filter files is under `/etc/bird{4|6}/filters`.
|
||||
> The default and supported place to store function files is under `/etc/bird{4|6}/functions`.
|
||||
|
||||
> Current version 0.3 does not allow changing file names. You will have to change the default filenames through SSH. This will be enhanced in future versions.
|
||||
|
||||
#### Components
|
||||
- *List Value* **Filter Files** / **Function Files**: Set the Filter or Function file to edit from the ones under `/etc/bird{4|6}/filters` / `/etc/bird{4|6}/functions`.
|
||||
> If you want to create a new Filter or Function file, use the **New File** element in the list.
|
||||
|
||||
> The default behaviour is to allow administrators to create new files using this scheme:
|
||||
> */etc/bird{4|6}/filters/filter*-**TIMESTAMP**. *Timestamp* is: YYYYMMDD-HHMM. I.e. */etc/bird4/filters/filter-20170705-2030*
|
||||
> */etc/bird{4|6}/functions/function*-**TIMESTAMP**. *Timestamp* is: YYYYMMDD-HHMM. I.e. */etc/bird4/functions/function-20170705-2030*
|
||||
|
||||
- *Button* **Load File**: Click this button to Load the file selected in the *{filter|function} Files* list. This button **must** be pressed in order to edit the target file.
|
||||
- *Read Only Text Box* **Editing File**: This Read-Only field is empty by default. It will get populated with the target file to edit.
|
||||
> **Caution**: Only if this field shows a file path, the contents of the target file can be edited and saved.
|
||||
|
||||
- *Text Area* **File Contents**: This text area will show the contents of the file shown in the *Editting File*. Save the contents of this text area by pressing the Button **Submit**
|
||||
> Use **spaces** instead of **tabs** for indentation.
|
||||
|
||||
> **Caveat**: If you save your filter or function using the *New File* option, until you refresh the page, the **saved** file will still appear as *New File*. However, the file will be created and correctly stored and you will be able to edit it with no problems.
|
||||
> After refreshing the page, your file will appear normally together with a new *New File* option.
|
||||
> This behaviour will be enhanced in future versions.
|
||||
|
||||
#### Common Errors
|
||||
Most common errors produced by Filters and Functions are:
|
||||
|
||||
- Syntax errors: `bird: /etc/bird4/filters/filter-20170507-0951, line 4: syntax error`
|
||||
> This instances require you to check where your errors is following Bird's hints.
|
||||
|
||||
- Non-existing filter: `bird: /tmp/bird4.conf, line 71: No such filter.`
|
||||
> Check your Filter name or define it in the **Filters Page**
|
||||
|
||||
- Calls to functions not defined in the Functions files or not part of the Bird filter/function definition *language*: `, line 4: You can't call something which is not a function. Really.`
|
||||
> Check you Function definition, your call name or Bird's official documentation to get the right reference.
|
||||
|
||||
#### Critical Errors
|
||||
There are some critical errors that could escape from first sight as Bird Daemon will start working *correctly*.
|
||||
|
||||
If you set your Filter **without** *accept* or *reject* calls, your filter will fail to work and let all the routes pass by as accepted. This will be shown in the **Log Page**:
|
||||
|
||||
Example: **Filter "doNothing"**
|
||||
```
|
||||
filter doNothing
|
||||
{
|
||||
print "HelloWorld";
|
||||
}
|
||||
```
|
||||
This *wrong* filter has been used in our BGP instance and Bird Daemon runs correctly. However, if we check the **Log Page** we find:
|
||||
```
|
||||
2017-05-07 10:18:49 <ERR> Filter doNothing did not return accept nor reject. Make up your mind
|
||||
2017-05-07 10:18:49 <INFO> HelloWorld
|
||||
```
|
||||
> Do not leave any filter without *accept* or *reject* calls to avoid this wrong behaviour that will incurr in a waste of resources.
|
|
@ -1,166 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
#
|
||||
# Copyright (C) 2014-2017 Eloi Carbó <eloicaso@openmailbox.org>
|
||||
# Copyright (C) 2022-2023 Roger Pueyo Centelles <roger.pueyo@guifi.net>
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
BIRD1_PKG := bird1
|
||||
BIRD1_IPV4_PKG := $(BIRD1_PKG)-ipv4
|
||||
BIRD1_IPV6_PKG := $(BIRD1_PKG)-ipv6
|
||||
BIRD4 := bird4
|
||||
BIRD6 := bird6
|
||||
|
||||
PKG_NAME := $(BIRD1_PKG)-openwrt
|
||||
PKG_IPV4_NAME := $(BIRD1_IPV4_PKG)-openwrt
|
||||
PKG_IPV6_NAME := $(BIRD1_IPV6_PKG)-openwrt
|
||||
PKG_VERSION := 0.3
|
||||
PKG_RELEASE := 5
|
||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||
PKG_LICENSE := GPL-3.0-or-later
|
||||
|
||||
PKG_UCI_NAME := $(BIRD1_PKG)-uci
|
||||
PKG_LUCI_NAME := $(BIRD1_PKG)-luci
|
||||
PKG_IPV4_UCI_NAME := $(BIRD1_IPV4_PKG)-uci
|
||||
PKG_IPV6_UCI_NAME := $(BIRD1_IPV6_PKG)-uci
|
||||
PKG_IPV4_LUCI_NAME := luci-app-$(BIRD1_IPV4_PKG)
|
||||
PKG_IPV6_LUCI_NAME := luci-app-$(BIRD1_IPV6_PKG)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Build/Prepare
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/$(PKG_UCI_NAME)/Default
|
||||
TITLE:=The BIRD UCI module (v1.6)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
MAINTAINER:=Roger Pueyo Centelles <roger.pueyo@guifi.net>
|
||||
URL:=https://github.com/openwrt/bird1-openwrt/
|
||||
DEPENDS:=+libuci +uci
|
||||
endef
|
||||
|
||||
define Package/$(PKG_LUCI_NAME)/Default
|
||||
TITLE:=LuCI support for BIRD (v1.6)
|
||||
SECTION:=luci
|
||||
CATEGORY:=LuCI
|
||||
SUBMENU:=3. Applications
|
||||
MAINTAINER:=Roger Pueyo Centelles <roger.pueyo@guifi.net>
|
||||
URL:=https://github.com/openwrt/bird1-openwrt/
|
||||
DEPENDS:=+luci-base +luci-compat
|
||||
endef
|
||||
|
||||
define Package/$(PKG_UCI_NAME)/description
|
||||
$(BIRD1_PKG) UCI integration module
|
||||
endef
|
||||
|
||||
define Package/$(PKG_LUCI_NAME)/description
|
||||
$(BIRD1_PKG) application for LuCI
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV4_UCI_NAME)
|
||||
$(call Package/$(PKG_UCI_NAME)/Default)
|
||||
TITLE+= (IPv4)
|
||||
DEPENDS+= +$(BIRD1_IPV4_PKG)
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV6_UCI_NAME)
|
||||
$(call Package/$(PKG_UCI_NAME)/Default)
|
||||
TITLE+= (IPv6)
|
||||
DEPENDS+= +$(BIRD1_IPV6_PKG)
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV4_LUCI_NAME)
|
||||
$(call Package/$(PKG_LUCI_NAME)/Default)
|
||||
TITLE+= (IPv4)
|
||||
DEPENDS+= +$(PKG_IPV4_UCI_NAME)
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV6_LUCI_NAME)
|
||||
$(call Package/$(PKG_LUCI_NAME)/Default)
|
||||
TITLE+= (IPv6)
|
||||
DEPENDS+= +$(PKG_IPV6_UCI_NAME)
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV4_UCI_NAME)/conffiles
|
||||
/etc/config/$(BIRD4)
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV6_UCI_NAME)/conffiles
|
||||
/etc/config/$(BIRD6)
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV4_UCI_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD4)/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD4)/filters
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD4)/functions
|
||||
$(INSTALL_BIN) ./$(PKG_IPV4_NAME)/src/init.d/$(BIRD4)* $(1)/etc/$(BIRD4)/init.d/
|
||||
$(CP) ./$(PKG_IPV4_NAME)/src/uci-defaults/* $(1)/etc/$(BIRD4)/init.d/
|
||||
$(INSTALL_CONF) ./$(PKG_IPV4_NAME)/src/config/$(BIRD4) $(1)/etc/config/
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV6_UCI_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD6)/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD6)/filters
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD6)/functions
|
||||
$(INSTALL_BIN) ./$(PKG_IPV6_NAME)/src/init.d/$(BIRD6)* $(1)/etc/$(BIRD6)/init.d/
|
||||
$(CP) ./$(PKG_IPV6_NAME)/src/uci-defaults/* $(1)/etc/$(BIRD6)/init.d/
|
||||
$(INSTALL_CONF) ./$(PKG_IPV6_NAME)/src/config/$(BIRD6) $(1)/etc/config/
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV4_UCI_NAME)/postinst
|
||||
#!/bin/sh
|
||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||
( . /etc/$(BIRD4)/init.d/bird-uci-install-init.d $(BIRD4) ) && rm -f /etc/$(BIRD4)/init.d/bird-uci-install-init.d
|
||||
( . /etc/$(BIRD4)/init.d/99-relocate-filters $(BIRD4) ) && rm -f /etc/$(BIRD4)/init.d/99-relocate-filters
|
||||
if [ -f /etc/sysupgrade.conf ] && ! grep $(BIRD4) /etc/sysupgrade.conf; then
|
||||
echo /etc/config/$(BIRD4) >> /etc/sysupgrade.conf
|
||||
echo /etc/$(BIRD4)/filters/ >> /etc/sysupgrade.conf
|
||||
echo /etc/$(BIRD4)/functions/ >> /etc/sysupgrade.conf
|
||||
fi
|
||||
fi
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV6_UCI_NAME)/postinst
|
||||
#!/bin/sh
|
||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||
( . /etc/$(BIRD6)/init.d/bird-uci-install-init.d $(BIRD6) ) && rm -f /etc/$(BIRD6)/init.d/bird-uci-install-init.d
|
||||
( . /etc/$(BIRD6)/init.d/99-relocate-filters $(BIRD6) ) && rm -f /etc/$(BIRD6)/init.d/99-relocate-filters
|
||||
if [ -f /etc/sysupgrade.conf ] && ! grep $(BIRD6) /etc/sysupgrade.conf; then
|
||||
echo /etc/config/$(BIRD6) >> /etc/sysupgrade.conf
|
||||
echo /etc/$(BIRD6)/filters/ >> /etc/sysupgrade.conf
|
||||
echo /etc/$(BIRD6)/functions/ >> /etc/sysupgrade.conf
|
||||
fi
|
||||
fi
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_IPV4_UCI_NAME)))
|
||||
$(eval $(call BuildPackage,$(PKG_IPV6_UCI_NAME)))
|
||||
|
||||
define Package/$(PKG_IPV4_LUCI_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/$(BIRD4)/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/$(BIRD4)/
|
||||
$(CP) ./$(PKG_IPV4_NAME)/src/model/* $(1)/usr/lib/lua/luci/model/cbi/$(BIRD4)/
|
||||
$(CP) ./$(PKG_IPV4_NAME)/src/controller/* $(1)/usr/lib/lua/luci/controller/
|
||||
$(CP) ./$(PKG_IPV4_NAME)/src/view/* $(1)/usr/lib/lua/luci/view/$(BIRD4)/
|
||||
endef
|
||||
|
||||
define Package/$(PKG_IPV6_LUCI_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/$(BIRD6)/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/$(BIRD6)/
|
||||
$(CP) ./$(PKG_IPV6_NAME)/src/model/* $(1)/usr/lib/lua/luci/model/cbi/$(BIRD6)/
|
||||
$(CP) ./$(PKG_IPV6_NAME)/src/controller/* $(1)/usr/lib/lua/luci/controller/
|
||||
$(CP) ./$(PKG_IPV6_NAME)/src/view/* $(1)/usr/lib/lua/luci/view/$(BIRD6)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_IPV4_LUCI_NAME)))
|
||||
$(eval $(call BuildPackage,$(PKG_IPV6_LUCI_NAME)))
|
|
@ -1,80 +0,0 @@
|
|||
# bird-openwrt
|
||||
|
||||
Package for OpenWRT to bring integration with UCI and LUCI to Bird4 and Bird6 daemon.
|
||||
|
||||
This repository contains an UCI module adding support for an user-friendly configuration of the BIRD daemon in OpenWRT systems and a LuCI application to control this UCI configuration using the web-based OpenWRT configuration system.
|
||||
|
||||
**Package Names**: luci-app-bird{4|6} and bird{4|6}-uci
|
||||
|
||||
**Dependences**: +bird{4|6} +libuci +luci-base +uci +libuci-lua
|
||||
|
||||
**Last Version**: 0.3
|
||||
|
||||
**Terminal (UCI) Documentation**: [Link](https://github.com/eloicaso/bird-openwrt/blob/master/UCI-DOCUMENTATION.md)
|
||||
|
||||
**Web (LUCI) Documentation**: [Link](https://github.com/eloicaso/bird-openwrt/blob/master/LUCI-DOCUMENTATION.md)
|
||||
|
||||
|
||||
## Known issues (v0.3):
|
||||
* There is an issue with pre-built images. It seems that the UCI-Default Scripts are not applied for some reason. If you face this situation, just copy both packages in your /tmp and and execute "opkg install PackageName.ipk --force-reinstall". It will overwrite your /etc/config/bird{4|6}, create a backup of this configuration.
|
||||
|
||||
* LUCI Material Design Theme shows a "Loading page" in **Logs Page** preventing it to load. Moreover, the OpenWRT Theme crashes loading the **Log Page**.
|
||||
Please, go to `System -> Language and Style -> Design` and change it to any other avaiable Theme (*Bootstrap* or *Freifunk_Generic* are recommended).
|
||||
|
||||
* There is a manual procedure to designate custom Routing Table IDs created through this package's UI. Please, visit [this page](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md) for more details.
|
||||
|
||||
## How to compile:
|
||||
Due to the existence of Routing's bird-openwrt packages, if you want to build your system using this repo's bird packages, you need to proceed as follows:
|
||||
|
||||
|
||||
* Add this github as a repository in feeds.conf. Alternatively, you could use a local git clone)
|
||||
```
|
||||
src-git birdwrt https://github.com/eloicaso/bird-openwrt.git
|
||||
|
||||
```
|
||||
OR
|
||||
```
|
||||
src-link birdwrt /path/to/your/git/clone/bird-openwrt
|
||||
```
|
||||
|
||||
* Disable OpenWRT-Routing repository to avoid getting the outdated package
|
||||
```
|
||||
# src-git routing https://github.com/openwrt-routing/packages.git
|
||||
```
|
||||
|
||||
* Update and install all packages in feeds
|
||||
```
|
||||
./scripts/feeds update -a; ./scripts/feeds install -a
|
||||
```
|
||||
|
||||
* Enable OpenWRT-Routing repository to fulfill bird{4/6} dependencies
|
||||
```
|
||||
src-git routing https://github.com/openwrt-routing/packages.git
|
||||
./scripts/feeds update routing; ./scripts/feeds install bird4 bird6
|
||||
```
|
||||
|
||||
* Compile (Option 1) the whole OpenWRT image with the package included
|
||||
```
|
||||
make menuconfig -> Network -> Routing and Redirection -> Select bird*-uci
|
||||
-> LuCI -> 3. Applications -> Select luci-app-bird*
|
||||
make V=99
|
||||
```
|
||||
|
||||
* Compile (Option 2) the packet ( ! this method requires to compile its dependeces before using Option 1)
|
||||
```
|
||||
make package/feeds/birdwrt/bird{4/6}-openwrt/compile V=99
|
||||
```
|
||||
|
||||
* Find your package in
|
||||
```
|
||||
[OpenWRT_folder]/bin/packages/{Architecture}/routing/bird{4/6}-uci_{Version}_{Architecture}.ipk
|
||||
[OpenWRT_folder]/bin/packages/{Architecture}/routing/luci-app-bird{4/6}_{Version}_{Architecture}.ipk
|
||||
```
|
||||
|
||||
* Install your .ipk in your dev-environment (avoid CheckSum Missmatch issues)
|
||||
```
|
||||
scp bird{4/6}-uci_{Version}_{Architecture}.ipk user@IPAddres:/tmp
|
||||
|
||||
On your Dev-Environment:
|
||||
opkg install bird{4/6}-uci_{Version}_{Architecture}.ipk --force-checksum
|
||||
```
|
|
@ -1,345 +0,0 @@
|
|||
<!--
|
||||
---------------------------------------------------------------------
|
||||
(C) 2014 - 2017 Eloi Carbo <eloicaso@openmailbox.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
---------------------------------------------------------------------
|
||||
-->
|
||||
|
||||
# Bird{4|6} UCI Packages Documentation
|
||||
* BIRD Daemon's original documentation: http://bird.network.cz/?get_doc
|
||||
* Usage examples (Gitlab): https://gitlab.labs.nic.cz/labs/bird/wikis/home
|
||||
* Extra documentation in English & Catalan: https://github.com/eloicaso/bgp-bmx6-bird-docn
|
||||
* If you want to add new options to bird*-openwrt packages add a pull request or issue in: https://github.com/eloicaso/bird-openwrt
|
||||
|
||||
### Options used in /etc/config/bird{4|6}
|
||||
> *Clarification*: Any reference to **{4|6}** in this document means that it applies to both Bird4 and Bird6 packages and configurations. Otherwise, the text will clarify which specific package is affected by it.
|
||||
|
||||
#### CONFIGURATION SECTION 1: 'bird'
|
||||
Usage example :
|
||||
``` Bash
|
||||
config bird 'bird'
|
||||
option use_UCI_config '1'
|
||||
option UCI_config_file '/tmp/bird4.conf'
|
||||
```
|
||||
|
||||
* **use_UCI_config**: *Boolean*
|
||||
This option allows you to use package's UCI configuration translation instead of using the original Bird config file (hand-edited). If true/1, birdX init.d script will use the translation placed in "UCI_config_file". Otherwise, it will use the default "/etc/birdX.conf" configuration.
|
||||
**\[HINT**\] This could be used to allow multiple configurations and swap them easily.
|
||||
*Default: 0*
|
||||
|
||||
* **UCI_config_file**: *String* File_path
|
||||
This option sets where will be placed the translation of the UCI configuration file.
|
||||
*Default: /tmp/birdX.conf*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 2: 'global NAME'
|
||||
Usage example:
|
||||
```Bash
|
||||
config global 'global'
|
||||
option log_file '/tmp/bird4.log'
|
||||
option log 'all'
|
||||
option debug 'off'
|
||||
option router_id '172.16.1.6'
|
||||
```
|
||||
|
||||
* **log_file**: *String* File_path
|
||||
This option sets the path of the file used to save Bird Log and Debug's information.
|
||||
*Default: /tmp/bird{4|6}.log*
|
||||
|
||||
* **log**: *String/Enumeration* (all/off, info, warning, error, fatal, debug, trace, remote, auth, bug)
|
||||
This option allows you to set which information you want to save in the Log file.
|
||||
**\[HINT\]** Use the enumeration like: { info, waning, error }. Do not enter any extra option if you select "all" (Bird will fail to start).
|
||||
*Default: all*
|
||||
|
||||
* **debug**: *String/Enumeration* ( all/off, states, routes, filters, interfaces, events, packets)
|
||||
This option allows you to set which **extra** debug information will be saved in the "log_file" file.
|
||||
**\[HINT\]** Use the enumeration like: { info, waning, error }. Do not enter any extra option if you select "all" (Bird will fail to start).
|
||||
*Default: off*
|
||||
|
||||
* **router_id**: IP Address
|
||||
This option sets which will be the Router ID.
|
||||
**\[HINT\]** In **Bird4** this field is the lowest IP address (not loopback) among the existing interfaces by default (Optional property).
|
||||
In **Bird6** there is no default value and it is mandatory.
|
||||
|
||||
* **listen_bgp_addr**: IP Address
|
||||
This option sets the IP address that Bird BGP instances will listen by default.
|
||||
*Default: 0.0.0.0*
|
||||
|
||||
* **listen_bgp_port**: *Integer* Port
|
||||
This option sets the port that Bird BGP instances will listen by default.
|
||||
*Default: IP 0.0.0.0 and Port 179*
|
||||
|
||||
* **listen_bgp_dual**: *Boolean*
|
||||
**\[Bird6\]** This option configures Bird6 BGP instances to listen only IPv6 or IPv4/6 BGP routes.
|
||||
|
||||
|
||||
#### <a name="table"></a>CONFIGURATION SECTION 3: 'table'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config table
|
||||
option name 'aux'
|
||||
```
|
||||
|
||||
* **name**: *String*
|
||||
This option allows you to set the name of the auxiliar kernel tables used for Bird. This option is mandatory for most of the protocols.
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 4: 'kernel NAME'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config kernel kernel1
|
||||
option table 'aux'
|
||||
option import 'all'
|
||||
option export 'all'
|
||||
option kernel_table '100'
|
||||
option scan_time '10'
|
||||
option learn '1'
|
||||
option persist '0'
|
||||
option disabled '0'
|
||||
```
|
||||
|
||||
* **table**: *String*
|
||||
Set an auxiliary table for the current kernel routing instance. This table **MUST** exist as a [table](#table) instance.
|
||||
**\[HINT\]** If there is an Kernel protocol instance that uses the "main" kernel table, not using table/kernel_table options, this should be included before the rest of Kernel instances (which will use auxiliary tables).
|
||||
|
||||
* **import**: *String/Filter* function
|
||||
This option delimits which routes coming from other protocols will be accepted.
|
||||
Options are:
|
||||
**All/none**: allows to import all the routes or none of them.
|
||||
**Filter name**: \[import 'bgp_filter_in'\] the protocol will use the filter with the given name (Specified filter **must** exists in any file under /etc/bird{4|6}/filters/ folder).
|
||||
|
||||
* export: String/Filter function
|
||||
This option delimits which routes going out from the protocol. This option allows filters in different manners:
|
||||
**All/none**: allows to export all the routes or none of them.
|
||||
**Filter name**: \[export 'bgp_filter_out'\] the protocol will use the filter with the given name(Specified filter **must** exists in any file under /etc/bird{4|6}/filters/ folder).
|
||||
|
||||
* **kernel_table**: *Integer*
|
||||
This option sets the identification number of the Kernel table that will be used instead of the main one.
|
||||
*Default: main table (254)*
|
||||
|
||||
* **scan_time**: *Integer*
|
||||
This option sets the time between checks to target kernel table.
|
||||
|
||||
* **learn**: *Boolean*
|
||||
Set if kernel table will add the routes from other routing protocols or the system administrator.
|
||||
|
||||
* **persist**: *Boolean*
|
||||
Set if Bird Daemon will save the known routes when exiting or if it will clean the routing table.
|
||||
|
||||
* **disable**: *Boolean*
|
||||
This option sets if the protocol will be used or dismissed.
|
||||
*Default: 0*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 5: 'device NAME'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config device device1
|
||||
option scan_time '10'
|
||||
option disabled '0'
|
||||
```
|
||||
|
||||
* **scan_time***: *Integer*
|
||||
This option sets the time between checks to the selected kernel table.
|
||||
|
||||
* **disable**: *Boolean*
|
||||
This option sets if the protocol will be used or dismissed.
|
||||
*Default: 0*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 6: 'static NAME'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config static static1
|
||||
option table 'aux'
|
||||
option disabled '0'
|
||||
```
|
||||
|
||||
* **table**: *String*
|
||||
Set an auxiliary table for the current static instance. This table **MUST** exist as a [table](#table) instance.
|
||||
**\[HINT\]** If there is an static instance that uses the "main" kernel table (not using table/kernel_table options), this should be included before the rest of static instances (which will use auxiliary tables).
|
||||
|
||||
* **disable**: *Boolean*
|
||||
This option sets if the protocol will be used or dismissed.
|
||||
*Default: 0*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 7 & 8: 'bgp NAME' & 'bgp_template NAME'
|
||||
This section merges two different configuration sections: BGP *instances* and *templates*. The first one is the basic BGP configuration part and the second one is the template used to minimize the number of options written in the configuration file for each unique instance. Both configuration sections have the same options but, when Bird finds duplicities, the instance will overwrite the template options.
|
||||
|
||||
Usage examples:
|
||||
``` Bash
|
||||
# instance
|
||||
config bgp bgp1
|
||||
option template 'bgp_common'
|
||||
option description 'Description of the BGP instance'
|
||||
option neighbor_address '172.16.1.5'
|
||||
option neighbor_as '65530'
|
||||
option source_address '172.16.1.6'
|
||||
option next_hop_self '0'
|
||||
option next_hop_keep '0'
|
||||
option rr_client '1'
|
||||
option rr_cluster_id '172.16.1.6'
|
||||
```
|
||||
|
||||
``` Bash
|
||||
# template
|
||||
config bgp_template bgp_common
|
||||
option table 'aux'
|
||||
option import 'all'
|
||||
option export 'all'
|
||||
option local_address '172.16.1.6'
|
||||
option local_as '65001'
|
||||
option import_limit '100'
|
||||
option import_limit_action 'warn'
|
||||
option export_limit '100'
|
||||
option export_limit_action 'warn'
|
||||
option receive_limit '100'
|
||||
option receive_limit_action 'warn'
|
||||
option disabled '0'
|
||||
```
|
||||
|
||||
* **template**: *String*
|
||||
This option states the template used for current BGP instance. This template MUST exist.
|
||||
|
||||
* **description**: *String*
|
||||
This option allows to add a description of the bgp instance and its function.
|
||||
|
||||
* **local_addr**: IP address
|
||||
This option allows to set the IP source of our Autonomous System (AS).
|
||||
|
||||
* **local_as**: *Integer*
|
||||
This option allows to set the identification number of our AS number. This option is mandatory for each BGP instance.
|
||||
|
||||
* **neighbor_addr**: IP address
|
||||
Each BGP instance has a neighbor connected to. This option allows to set its IP address.
|
||||
|
||||
* **neighbor_as**: *Integer*
|
||||
Each BGP instance has a neighbor connected to. This option allows to set its AS ID.
|
||||
|
||||
* **next_hop_self**: *Boolean*
|
||||
If this option is true, BGP protocol will avoid to calculate the next hop and always advertise own "Router id" IP.
|
||||
*Default: 0*
|
||||
|
||||
* **next_hop_keep**: *Boolean*
|
||||
If this option is true, BGP will always use the received next_hop information to redirect the route.
|
||||
*Default: 0*
|
||||
|
||||
* **rr_client**: *Boolean*
|
||||
IF this option is true, the router will be set as Route Reflector and will treat the rest of the routers as RR clients.
|
||||
*Default: 0*
|
||||
|
||||
* **rr_cluster_id**: *Integer*
|
||||
This option sets the identification number of the RR cluster. All the nodes in a cluster needs this option and share the same number.
|
||||
*Default: Router id*
|
||||
|
||||
* **import_limit**: *Integer*
|
||||
This option sets the limit of routes that a protocol can import until take the action indicated in the import_limit_action.
|
||||
import_limit also counts filtered routes (even dropped ones).
|
||||
*Default: 0 (no limit)*
|
||||
|
||||
* **import_limit_action**: *String*
|
||||
This option allows to decide the action to take when reached the limit of imported routes.
|
||||
Actions are: warn, block, restart, disable
|
||||
|
||||
* **export_limit**: *Integer*
|
||||
This option sets the limit of routes that a protocol can export until take the action indicated in the export_limit_action.
|
||||
*Default: 0 (no limit)*
|
||||
|
||||
* **export_limit_action**: *String*
|
||||
This option allows to decide the action to take when reached the limit of exported routes.
|
||||
Actions are: warn, block, restart, disable
|
||||
|
||||
* **receive_limit**: *Integer*
|
||||
This option sets the limit of routes that a protocol can receive until take the action indicated in the receive_limit_action. receive_limit only counts accepted routes from the protocol.
|
||||
*Default: 0 (no limit)*
|
||||
|
||||
* **receive_limit_action**: *String*
|
||||
This option allows to decide the action to take when reached the limit of received routes.
|
||||
Actions are: warn, block, restart, disable
|
||||
|
||||
* **disable**: *Boolean*
|
||||
This option sets if the protocol will be used or dismissed.
|
||||
*Default: 0*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 9: 'route'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'router'
|
||||
option prefix '192.168.9.0/24'
|
||||
option via '10.99.105.159'
|
||||
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'special'
|
||||
option prefix '192.168.2.0/24'
|
||||
option attribute 'unreachable'
|
||||
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'iface'
|
||||
option prefix '192.168.3.0/24'
|
||||
option iface 'mgmt0'
|
||||
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'recursive'
|
||||
option prefix '192.168.4.0/24'
|
||||
option ip '192.168.1.1'
|
||||
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'multipath'
|
||||
option prefix '192.168.30.0/24'
|
||||
list l_via '172.16.1.5'
|
||||
list l_via '172.16.1.6'
|
||||
```
|
||||
|
||||
* **instance**: *String*
|
||||
This option indicates the route that the static protocol instance will apply.
|
||||
|
||||
* **type**: *String*
|
||||
This option states the type of route that will be applied. Also defines the options available for it.
|
||||
Types are: 'router', 'special', 'iface', 'recursive' or 'multipath'.
|
||||
|
||||
* **prefix**: IP address/network
|
||||
This option allows to define the network that you want to define.
|
||||
**\[router only\]**
|
||||
**via**: IP Address
|
||||
This option indicates the IP address of the neighbor router where the routes will pass through.
|
||||
**\[special only\]**
|
||||
**attribute**: *String*
|
||||
This option will mark the behaviour of the route.
|
||||
Attribures are: 'blackhole', 'unreachable' or 'prohibit'.
|
||||
**\[iface only\]**
|
||||
**iface**: *String*
|
||||
This option indicates the interface used to redirect the BGP routes. Careful, the interface MUST exist, or Bird will fail to start.
|
||||
**\[recursive only\]**
|
||||
**ip**: IP address
|
||||
This option states the IP address which the next hop will depend on.
|
||||
**\[multipath only\]**
|
||||
This is a list, not an option. Use it as in the example, or check the UCI configuration documentation.
|
||||
**l_via**: IP address
|
||||
This list of IPs specifies the list (following the sequence) of routers that the route will follow as next hops.
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 10 & 11: 'filter NAME' & 'function Name'
|
||||
Filters are written in separated files under **/etc/bird{4|6}/filters/** and **/etc/bird{4|6}/functions/**. Their syntax can be found [here.](http://bird.network.cz/?get_doc&f=bird-5.html)
|
||||
The content of each filter and file file will be included in the resulting bird{4|6}.conf file without checking its syntax, so you could find errors during start time.
|
||||
|
||||
* Clarification for any existing **v0.2** user: an automated upgrade path has been added to switch your old "filter" or "function" sections. It is safe to upgrade, but doing regular backups of your key files is always a good practise to avoid frustration.
|
|
@ -1,33 +0,0 @@
|
|||
config bird 'bird'
|
||||
option use_UCI_config '1'
|
||||
#Caution! Enabling this option, Bird will translate this
|
||||
#UCI file and use it instead of /etc/bird4.conf
|
||||
option UCI_config_file '/tmp/bird4.conf'
|
||||
#If you enable useUCIconfig, UCIconfigFile will be Bird's
|
||||
#configuration file location.
|
||||
|
||||
config global 'global'
|
||||
option log_file '/tmp/bird4.log'
|
||||
option log 'all'
|
||||
option debug 'off'
|
||||
|
||||
config table
|
||||
option name 'aux'
|
||||
|
||||
config kernel kernel1
|
||||
option table 'aux'
|
||||
option import 'all'
|
||||
option export 'all'
|
||||
option kernel_table '100'
|
||||
option scan_time '10'
|
||||
option learn '1'
|
||||
option persist '0'
|
||||
option disabled '0'
|
||||
|
||||
config device device1
|
||||
option scan_time '10'
|
||||
option disabled '0'
|
||||
|
||||
config static static1
|
||||
option table 'aux'
|
||||
option disabled '0'
|
|
@ -1,52 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
module("luci.controller.bird4", package.seeall)
|
||||
|
||||
function index()
|
||||
entry({"admin", "network", "bird4",},
|
||||
alias("admin", "network", "bird4", "status"),
|
||||
_("Bird4"), 0)
|
||||
|
||||
entry({"admin", "network", "bird4", "status"},
|
||||
form("bird4/status"),
|
||||
_("Status"), 0).leaf = true
|
||||
|
||||
entry({"admin","network","bird4","log"},
|
||||
template("bird4/log"),
|
||||
_("Log"), 1).leaf = true
|
||||
|
||||
entry({"admin", "network", "bird4", "overview"},
|
||||
cbi("bird4/overview"),
|
||||
_("Overview"), 2).leaf = true
|
||||
|
||||
entry({"admin","network","bird4","proto_general"},
|
||||
cbi("bird4/gen_proto"),
|
||||
_("General protocols"), 3).leaf = true
|
||||
|
||||
entry({"admin","network","bird4","proto_bgp"},
|
||||
cbi("bird4/bgp_proto"),
|
||||
_("BGP Protocol"), 4).leaf = true
|
||||
|
||||
entry({"admin","network","bird4","filters"},
|
||||
form("bird4/filters"),
|
||||
_("Filters"), 5).leaf = true
|
||||
|
||||
entry({"admin","network","bird4","functions"},
|
||||
form("bird4/functions"),
|
||||
_("Functions"), 6).leaf = true
|
||||
end
|
|
@ -1,233 +0,0 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
|
||||
# Copyright (C) 2014-2017 - Eloi Carbo
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# Extra Service Function to get the Status of the Service
|
||||
# This complements /etc/rc.common functions
|
||||
# Commands ending with *_quiet are meant to be ran in Luci. These
|
||||
# scripts' return minimal output.
|
||||
EXTRA_COMMANDS="status start_quiet stop_quiet restart_quiet status_quiet"
|
||||
EXTRA_HELP=" status Returns service status"
|
||||
|
||||
BIRD="bird4"
|
||||
BIRD_CONFIG="/etc/${BIRD}.conf"
|
||||
BIRD_LOG="/var/log/${BIRD}.log"
|
||||
BIRD_ERR="/tmp/${BIRD}.err"
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_USE_PID=1
|
||||
SERVICE_PID_FILE="/var/run/${BIRD}.pid"
|
||||
|
||||
BIRD_BIN="/usr/sbin/${BIRD}"
|
||||
# Special non-terminal-rich output for Luci calls
|
||||
LUCI="false"
|
||||
|
||||
. /etc/${BIRD}/init.d/${BIRD}-lib.sh
|
||||
|
||||
start() {
|
||||
config_load ${BIRD}
|
||||
local use_UCI_config
|
||||
get use_UCI_config 'bird'
|
||||
|
||||
#Start the service
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo "Starting ${BIRD} Service [ ... ]"
|
||||
fi
|
||||
if [ -f ${BIRD_ERR} ]; then
|
||||
echo -n "" > ${BIRD_ERR}
|
||||
else
|
||||
touch ${BIRD_ERR}
|
||||
fi
|
||||
|
||||
if [ -z "${use_UCI_config}" -o "${use_UCI_config}" = "0" ]; then
|
||||
# Disable Custom bird-openwrt settings.
|
||||
# Use default behaviour and files
|
||||
${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &> ${BIRD_ERR} &
|
||||
else
|
||||
#Set Bird4 configuration location:
|
||||
local UCI_config_file
|
||||
local log_file
|
||||
get UCI_config_file 'bird'
|
||||
get log_file 'global'
|
||||
BIRD_CONFIG="${UCI_config_file:-$BIRD_CONFIG}"
|
||||
BIRD_LOG="${log_file:-$BIRD_LOG}"
|
||||
#Backup previous configuration
|
||||
[ -f ${BIRD_CONFIG} ] && cp ${BIRD_CONFIG} ${BIRD_CONFIG}.bak
|
||||
#Setup the basic configuration
|
||||
prepare_global 'global'
|
||||
|
||||
# Gather and set all Functions
|
||||
gather_functions
|
||||
# Gather and set all Filters
|
||||
gather_filters
|
||||
|
||||
# Setup Main Protocols
|
||||
config_foreach prepare_kernel 'kernel'
|
||||
config_foreach prepare_static 'static'
|
||||
config_foreach prepare_device 'device'
|
||||
config_foreach prepare_direct 'direct'
|
||||
config_foreach prepare_pipe 'pipe'
|
||||
|
||||
#Setup protocol's configuration: BGP
|
||||
config_foreach prepare_bgp_template 'bgp_template'
|
||||
config_foreach prepare_bgp 'bgp'
|
||||
|
||||
#Setup protocol's configuration: OSPF
|
||||
config_foreach prepare_ospf_instance 'ospf'
|
||||
|
||||
#Start the service
|
||||
${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &>${BIRD_ERR} &
|
||||
fi
|
||||
while [ ! -s ${SERVICE_PID_FILE} ]; do
|
||||
sleep 1
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Start Status: \033[0;31m[ FAILED ]\e[m"
|
||||
cat ${BIRD_ERR}
|
||||
cat ${BIRD_ERR} >> ${BIRD_LOG}
|
||||
else
|
||||
echo "${BIRD} - Failed: $(cat ${BIRD_ERR})"
|
||||
cat ${BIRD_ERR} >> ${BIRD_LOG}
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# PID & ERROR contents are read from their files to avoid an issue
|
||||
# where if [ -s ${SERVICE_PID_FILE} ] and if [ -s ${BIRD_ERR} ]
|
||||
# fails unless a previous command reads its contents making its
|
||||
# behaviour unreliable.
|
||||
SVC_PID="$(cat ${SERVICE_PID_FILE})"
|
||||
BRDERR_TXT="$(cat ${BIRD_ERR})"
|
||||
if [ -n "${SVC_PID}" ]; then
|
||||
if [ -n "${BRDERR_TXT}" ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon already started. Status \033[0;32m[ RUNNING ]\e[m"
|
||||
else
|
||||
echo "${BIRD} already started"
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Start Status: \033[0;32m[ STARTED ]\e[m"
|
||||
else
|
||||
echo "${BIRD} - Started"
|
||||
fi
|
||||
fi
|
||||
# PID File found (service started correctly)
|
||||
return 0
|
||||
fi
|
||||
|
||||
# PID File not found (error while starting service)
|
||||
return 1
|
||||
}
|
||||
|
||||
stop() {
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
config_load ${BIRD}
|
||||
local log_file
|
||||
get log_file 'global'
|
||||
BIRD_LOG="${log_file:-$BIRD_LOG}"
|
||||
start-stop-daemon -p ${SERVICE_PID_FILE} -K 2>&1 >> ${BIRD_LOG}
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Stop Status: \033[0;32m[ OK ]\e[m"
|
||||
else
|
||||
echo "${BIRD} - Stopped"
|
||||
fi
|
||||
echo -n "" > ${BIRD_ERR}
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Stop Status: \033[0;31m[ FAILED ]\e[m"
|
||||
echo "Check ${BIRD_LOG} file for more information."
|
||||
else
|
||||
echo "${BIRD} Failed to Stop. See Log file: ${BIRD_LOG}"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Service already stopped. \033[0;31m[ FAILED ]\e[m"
|
||||
else
|
||||
echo "${BIRD} already stopped"
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
restart() {
|
||||
stop
|
||||
sleep 1
|
||||
if [ "${LUCI}" == "true" ]; then
|
||||
echo " ... "
|
||||
fi
|
||||
start
|
||||
}
|
||||
|
||||
reload() {
|
||||
service_reload ${BIRD_BIN}
|
||||
}
|
||||
|
||||
status() {
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} start status: \033[0;32m[ RUNNING ]\e[m"
|
||||
else
|
||||
echo "${BIRD}: Running"
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
|
||||
cat ${BIRD_ERR}
|
||||
else
|
||||
echo "${BIRD}: Failed - $(cat ${BIRD_ERR})"
|
||||
fi
|
||||
return 2
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
|
||||
else
|
||||
echo "${BIRD}: Stopped"
|
||||
fi
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Luci-specific calls (stripped output).
|
||||
# The following scripts are not meant to be ran using Ash Terminal
|
||||
# Used in: LUCI/model/cbi/bird4/status.lua
|
||||
start_quiet() {
|
||||
LUCI="true"
|
||||
start
|
||||
}
|
||||
stop_quiet() {
|
||||
LUCI="true"
|
||||
stop
|
||||
}
|
||||
restart_quiet() {
|
||||
LUCI="true"
|
||||
restart
|
||||
}
|
||||
status_quiet() {
|
||||
LUCI="true"
|
||||
status
|
||||
}
|
|
@ -1,590 +0,0 @@
|
|||
# Bird4-OpenWRT Library - Functions used in /etc/init.d/bird4 script.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2014-2017 - Eloi Carbo
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
# Function: writeToConfig $1
|
||||
# $1 string.
|
||||
# Allows to write in the $BIRD_CONFIG file, the string $1. This function does not check the $1 string.
|
||||
# Example: writeToConfig "value: $N"
|
||||
writeToConfig() {
|
||||
echo "$1" >> ${BIRD_CONFIG}
|
||||
}
|
||||
|
||||
|
||||
# Function: write $1 $2
|
||||
# $1 string. $2 string.
|
||||
# This function checks if $2 is empty. If not, it writes the string $1 in the $BIRD_CONFIG file.
|
||||
# Use write function to check if $1, value found inside $2, is not empty and can be written in the configuration file.
|
||||
# Example: N=""; write "value: $N" $N;
|
||||
write() {
|
||||
[ -n "$2" ] && writeToConfig "$1"
|
||||
}
|
||||
|
||||
|
||||
#Function: write_bool $1 $2
|
||||
# $1 string; $2 boolean
|
||||
# This function checks if $2 is true and write the $1 string into $BIRD_CONFIG file.
|
||||
# Example: local N=0; write_bool $N
|
||||
write_bool() {
|
||||
[ "$2" == 1 ] && writeToConfig " $1;"
|
||||
}
|
||||
|
||||
|
||||
# Function: get $1 $2
|
||||
# $1 string. $2 string
|
||||
# This function uses the external UCI function "config_get $result $section $option" to obtain a string value from UCI config file.
|
||||
# To use this function, use the same name of the UCI option for the variable.
|
||||
# Example: UCI (option id 'abcd'); local id; get id $section
|
||||
get() {
|
||||
config_get $1 $2 $1
|
||||
}
|
||||
|
||||
|
||||
# Function: get_a_bool $1 $2
|
||||
# $1 boolean. $2 string
|
||||
# This function uses the external UCI function "config_get_bool $result $section $option" to obtain a boolean value from UCI config file.
|
||||
# To use this function, use the same name of the UCI option for the variable $1.
|
||||
# Example: UCI (option use_ipv6 '1'); local use_ipv6; get use_ipv6 $section
|
||||
# Note: this function was originally called get_bool(), but it collided with
|
||||
# the get_bool() function provided by /lib/functions.sh. Read more at
|
||||
# https://github.com/openwrt/routing/issues/920.
|
||||
get_a_bool() {
|
||||
config_get_bool $1 $2 $1
|
||||
}
|
||||
|
||||
|
||||
# Function: multipath_list $1
|
||||
# $1 string
|
||||
# This function writes the $1 string in the multipath routes.
|
||||
multipath_list() {
|
||||
write " via $1" $1
|
||||
}
|
||||
|
||||
|
||||
# Function: range_list $1
|
||||
# $1 string
|
||||
# This function writes the $1 string in the OSPF networks.
|
||||
range_list(){
|
||||
write " $1;" $1
|
||||
}
|
||||
|
||||
|
||||
# Function: hidden_range_list $1
|
||||
# $1 string
|
||||
# This function writes the $1 string in the OSPF networks as hidden.
|
||||
hidden_range_list(){
|
||||
write " $1 hidden;" $1
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_tables $1
|
||||
# $1 string
|
||||
# This function gets each "table" section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI table section
|
||||
prepare_tables() {
|
||||
local section="$1"; local name
|
||||
|
||||
get name ${section}
|
||||
|
||||
write "table ${name};" ${name}
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_global $1
|
||||
# $1 string
|
||||
# This function gets each "global" section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI global section. prepare_global is the first configuration set in the bird4.conf and removes the old file.
|
||||
prepare_global () {
|
||||
local section="$1"
|
||||
local log_file; local log; local debug; local router_id; local table
|
||||
|
||||
# Remove old configuration file
|
||||
rm -f "${BIRD_CONFIG}"
|
||||
|
||||
get log_file ${section}
|
||||
get log ${section}
|
||||
get debug ${section}
|
||||
get router_id ${section}
|
||||
get table ${section}
|
||||
|
||||
# First line of the NEW configuration file
|
||||
echo "#Bird4 configuration using UCI:" > ${BIRD_CONFIG}
|
||||
writeToConfig " "
|
||||
#TODO: Set Syslog as receiver if empty
|
||||
# LOGF="${log_file:-syslog]}"
|
||||
#TODO: If $log/$debug are empty, set to off
|
||||
if [ -n "${log_file}" -a -n "${log}" ]; then
|
||||
firstEntry="${log:0:3}"
|
||||
if [ "${firstEntry}" = "all" -o "${firstEntry}" = "off" ]; then
|
||||
writeToConfig 'log "'${log_file}'" '${firstEntry}';'
|
||||
else
|
||||
logEntries=$(echo ${log} | tr " " ",")
|
||||
writeToConfig "log \"${log_file}\" { ${logEntries} };"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "${debug}" ]; then
|
||||
firstEntry="${debug:0:3}"
|
||||
if [ "${firstEntry}" = "all" -o "${firstEntry}" = "off" ]; then
|
||||
writeToConfig "debug protocols ${firstEntry};"
|
||||
else
|
||||
debugEntries=$(echo ${debug} | tr " " ",")
|
||||
writeToConfig "debug protocols { ${debugEntries} };"
|
||||
fi
|
||||
fi
|
||||
writeToConfig " "
|
||||
writeToConfig "#Router ID"
|
||||
write "router id ${router_id};" ${router_id}
|
||||
writeToConfig " "
|
||||
writeToConfig "#Secondary tables"
|
||||
config_foreach prepare_tables 'table'
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_routes $1
|
||||
# $1 string
|
||||
# This function gets each "route" section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI route section. Each type of route has its own treatment.
|
||||
prepare_routes() {
|
||||
local instance; local prefix; local via; local type; local attribute; local iface
|
||||
local section="$1"
|
||||
local protoInstance="$2"
|
||||
|
||||
get instance ${section}
|
||||
get type ${section}
|
||||
get prefix ${section}
|
||||
|
||||
if [ "${instance}" = "${protoInstance}" ]; then
|
||||
case "${type}" in
|
||||
"router")
|
||||
get via ${section}
|
||||
[ -n "${prefix}" -a -n "${via}" ] && writeToConfig " route ${prefix} via ${via};"
|
||||
;;
|
||||
"special")
|
||||
get attribute ${section}
|
||||
[ -n "${prefix}" -a -n "${attribute}" ] && writeToConfig " route ${prefix} ${attribute};"
|
||||
;;
|
||||
"iface")
|
||||
get iface ${section}
|
||||
[ -n "${prefix}" -a -n "${iface}" ] && writeToConfig ' route '${prefix}' via "'${iface}'";'
|
||||
;;
|
||||
"multipath")
|
||||
write " route ${prefix} multipath" ${prefix}
|
||||
config_list_foreach ${section} l_via multipath_list
|
||||
writeToConfig " ;"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_kernel $1
|
||||
# $1 string
|
||||
# This function gets each "kernel" protocol section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI kernel section.
|
||||
prepare_kernel() {
|
||||
local section="$1"
|
||||
local disabled; local table; local kernel_table; local import; local export
|
||||
local scan_time; local persist; local learn
|
||||
|
||||
get_a_bool disabled ${section}
|
||||
get table ${section}
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
get scan_time ${section}
|
||||
get kernel_table ${section}
|
||||
get learn ${section}
|
||||
get persist ${section}
|
||||
|
||||
write "#${section} configuration:" ${section}
|
||||
writeToConfig "protocol kernel ${section} {" ${section}
|
||||
write_bool disabled ${disabled}
|
||||
write " table ${table};" ${table}
|
||||
write " kernel table ${kernel_table};" ${kernel_table}
|
||||
write_bool learn ${learn}
|
||||
write_bool persist ${persist}
|
||||
write " scan time ${scan_time};" ${scan_time}
|
||||
write " import ${import};" ${import}
|
||||
write " export ${export};" ${export}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_static $1
|
||||
# $1 string
|
||||
# This function gets each "static" protocol section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI static section.
|
||||
prepare_static() {
|
||||
local section="$1"
|
||||
local disabled; local table
|
||||
|
||||
get disabled ${section}
|
||||
get table ${section}
|
||||
|
||||
if [ "${disabled}" -eq 0 ]; then
|
||||
writeToConfig "#${section} configration:" ${section}
|
||||
writeToConfig "protocol static {"
|
||||
write " table ${table};" ${table}
|
||||
config_foreach prepare_routes 'route' ${section}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_direct $1
|
||||
# $1 string
|
||||
# This function gets each "direct" protocol section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI direct section.
|
||||
prepare_direct() {
|
||||
local section="$1"
|
||||
local disabled; local interface
|
||||
|
||||
get disabled ${section}
|
||||
get interface ${section}
|
||||
|
||||
write "#${section} configuration:" ${section}
|
||||
writeToConfig "protocol direct {"
|
||||
write_bool disabled ${disabled}
|
||||
write " interface ${interface};" ${interface}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_pipe $1
|
||||
# $1 string
|
||||
# This function gets each "pipe" protocol section in the UCI configuration an
|
||||
# $1 is set as the ID of the current UCI direct section.
|
||||
prepare_pipe() {
|
||||
local section="$1"
|
||||
local disabled; local table; local peer_table; local mode; local import; local export
|
||||
|
||||
get disabled $section
|
||||
get peer_table $section
|
||||
get mode $section
|
||||
get table $section
|
||||
get import $section
|
||||
get export $section
|
||||
|
||||
write "#$section configuration:" $section
|
||||
writeToConfig "protocol pipe $section {" $section
|
||||
write_bool disabled $disabled
|
||||
write " table $table;" $table
|
||||
write " peer table $peer_table;" $peer_table
|
||||
write " mode $mode;" $mode
|
||||
write " import $import;" $import
|
||||
write " export $export;" $export
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_device $1
|
||||
# $1 string
|
||||
# This function gets each "device" protocol section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI device section.
|
||||
prepare_device() {
|
||||
local section="$1"
|
||||
local disabled; local scan_time
|
||||
|
||||
get disabled ${section}
|
||||
get scan_time ${section}
|
||||
|
||||
write "#${section} configuration:" ${section}
|
||||
writeToConfig "protocol device {"
|
||||
write_bool disabled ${disabled}
|
||||
write " scan time ${scan_time};" ${scan_time}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_bgp_template $1
|
||||
# $1 string
|
||||
# This function gets each "bgp_template" protocol section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI bgp_template section.
|
||||
# Careful! Template options will be replaced by "instance" options if there is any match.
|
||||
prepare_bgp_template() {
|
||||
local section="$1"
|
||||
local disabled; local table; local import; local export
|
||||
local local_as; local neighbor_address; local neighbor_as; local source_address
|
||||
local next_hop_self; local next_hop_keep; local rr_client; local rr_cluster_id
|
||||
local import_limit; local import_limit_action; local export_limit; local export_limit_action
|
||||
local receive_limit; local receive_limit_action; local igp_table
|
||||
|
||||
get_a_bool disabled ${section}
|
||||
get table ${section}
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
get source_address ${section}
|
||||
|
||||
get local_as ${section}
|
||||
get neighbor_address ${section}
|
||||
get neighbor_as ${section}
|
||||
|
||||
get_a_bool next_hop_self ${section}
|
||||
get_a_bool next_hop_keep ${section}
|
||||
get rr_client ${section}
|
||||
get rr_cluster_id ${section}
|
||||
|
||||
get import_limit ${section}
|
||||
get import_limit_action ${section}
|
||||
get export_limit ${section}
|
||||
get export_limit_action ${section}
|
||||
|
||||
get receive_limit ${section}
|
||||
get receive_limit_action ${section}
|
||||
get igp_table ${section}
|
||||
|
||||
writeToConfig "#${section} template:"
|
||||
writeToConfig "template bgp ${section} {"
|
||||
[ -n "${disabled}" ] && write_bool disabled ${disabled}
|
||||
[ -n "${table}" ] && writeToConfig " table ${table};"
|
||||
[ -n "${igp_table}" ] && writeToConfig " igp table ${igp_table};"
|
||||
[ -n "${local_as}" ] && writeToConfig " local as ${local_as};"
|
||||
[ -n "${source_address}" ] && writeToConfig " source address ${source_address};"
|
||||
[ -n "${import}" ] && writeToConfig " import ${import};"
|
||||
[ -n "${export}" ] && writeToConfig " export ${export};"
|
||||
[ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig " neighbor ${neighbor_address} as ${neighbor_as};"
|
||||
if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
|
||||
[ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
|
||||
writeToConfig " import limit ${import_limit} action ${import_limit_action};"
|
||||
fi
|
||||
if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
|
||||
[ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
|
||||
writeToConfig " export limit ${export_limit} action ${export_limit_action};"
|
||||
fi
|
||||
if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
|
||||
[ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
|
||||
writeToConfig " receive limit ${receive_limit} action ${receive_limit_action};"
|
||||
fi
|
||||
[ -n "${next_hop_self}" ] && write_bool " next hop self;" ${next_hop_self}
|
||||
[ -n "${next_hop_keep}" ] && write_bool " next hop keep;" ${next_hop_keep}
|
||||
[ -n "${rr_client}" ] && write_bool " rr client;" ${rr_client}
|
||||
[ -n "${rr_cluster_id}" ] && writeToConfig " rr cluster id ${rr_cluster_id};"
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_bgp $1
|
||||
# $1 string
|
||||
# This function gets each "bgp" protocol section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI bgp section.
|
||||
# Careful! The options set in bgp instances overlap bgp_template ones.
|
||||
prepare_bgp() {
|
||||
local section="$1"
|
||||
local disabled; local table; local template; local description; local igp_table; local passive
|
||||
local import; local export; local source_address; local local_as; local neighbor_address
|
||||
local neighbor_as; local rr_client; local rr_cluster_id; local import_limit
|
||||
local import_limit_action; local export_limit; local export_limit_action
|
||||
local receive_limit; local receive_limit_action; local igp_table
|
||||
|
||||
get disabled ${section}
|
||||
get table ${section}
|
||||
get igp_table ${section}
|
||||
get template ${section}
|
||||
get description ${section}
|
||||
get passive ${section}
|
||||
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
get source_address ${section}
|
||||
get local_as ${section}
|
||||
get neighbor_address ${section}
|
||||
|
||||
get neighbor_as ${section}
|
||||
get import_limit ${section}
|
||||
get import_limit_action ${section}
|
||||
get export_limit ${section}
|
||||
get export_limit_action ${section}
|
||||
|
||||
get receive_limit ${section}
|
||||
get receive_limit_action ${section}
|
||||
get_a_bool next_hop_self ${section}
|
||||
get_a_bool next_hop_keep ${section}
|
||||
get rr_client ${section}
|
||||
get rr_cluster_id ${section}
|
||||
|
||||
writeToConfig "#${section} configuration:"
|
||||
[ -n "${template}" ] && writeToConfig "protocol bgp ${section} from ${template} {" \
|
||||
|| writeToConfig "protocol bgp ${section} {"
|
||||
[ -n "${disabled}" ] && write_bool disabled ${disabled}
|
||||
[ -n "${table}" ] && writeToConfig " table ${table};"
|
||||
[ -n "${igp_table}" ] && writeToConfig " igp table ${igp_table};"
|
||||
[ -n "${passive}" ] && writeToConfig " passive;" ${passive}
|
||||
[ -n "${local_as}" ] && writeToConfig " local as ${local_as};"
|
||||
[ -n "${source_address}" ] && writeToConfig " source address ${source_address};"
|
||||
[ -n "${import}" ] && writeToConfig " import ${import};"
|
||||
[ -n "${export}" ] && writeToConfig " export ${export};"
|
||||
[ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig " neighbor ${neighbor_address} as ${neighbor_as};"
|
||||
if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
|
||||
[ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
|
||||
writeToConfig " import limit ${import_limit} action ${import_limit_action};"
|
||||
fi
|
||||
if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
|
||||
[ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
|
||||
writeToConfig " export limit ${export_limit} action ${export_limit_action};"
|
||||
fi
|
||||
if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
|
||||
[ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
|
||||
writeToConfig " receive limit ${receive_limit} action ${receive_limit_action};"
|
||||
fi
|
||||
[ -n "${next_hop_self}" ] && write_bool " next hop self;" ${next_hop_self}
|
||||
[ -n "${next_hop_keep}" ] && write_bool " next hop keep;" ${next_hop_keep}
|
||||
[ -n "${rr_client}" ] && write_bool " rr client;" ${rr_client}
|
||||
[ -n "${rr_cluster_id}" ] && writeToConfig " rr cluster id ${rr_cluster_id};"
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
#Function: prepare_ospf_network $1
|
||||
# $1 string $2 string
|
||||
# This function gets each "ospf_network" protocol section in the UCI configuration, checks if its Area ID is the same as the one
|
||||
# being configurated and finally sets the list of network ranges to be propagated, or not, by the OSPF protocol
|
||||
# $1 is set as the ID of the action area of the internal networks.
|
||||
# $2 is set as the ID of the current area being configurated.
|
||||
prepare_ospf_networks() {
|
||||
local section="$1"
|
||||
local current_area="$2"
|
||||
|
||||
if [ "${section}" = "${current_area}" ]; then
|
||||
writeToConfig " networks {"
|
||||
config_list_foreach ${section} range range_list
|
||||
config_list_foreach ${section} hidden_range hidden_range_list
|
||||
writeToConfig " };"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_ospf_password $1 $2
|
||||
prepare_ospf_passwords() {
|
||||
local section="$1"
|
||||
local current_interface="$2"
|
||||
local interface; local passphrase
|
||||
|
||||
get interface $section
|
||||
get passphrase $section
|
||||
|
||||
[ "current_interface" = "${interface}" ] && write ' password "$passphrase";' ${passphrase}
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_ospf_neighbors $1 $2
|
||||
#prepare_ospf_neighbors() {
|
||||
#}
|
||||
|
||||
|
||||
# Function: prepare_ospf_interface $1 $2
|
||||
prepare_ospf_interface() {
|
||||
local section="$1"
|
||||
local current_area="$2"
|
||||
local area; local cost; local type; local hello; local priority; local retransmit; local authentication
|
||||
|
||||
get area ${section}
|
||||
get cost ${section}
|
||||
get type ${section}
|
||||
get hello ${section}
|
||||
get priority ${section}
|
||||
get retransmit ${section}
|
||||
|
||||
if [ "${current_area}" = "${area}" ]; then
|
||||
writeToConfig ' interface "$section" {'
|
||||
write " cost ${cost};" ${cost}
|
||||
write " hello ${hello};" ${hello}
|
||||
write " type ${type};" ${type}
|
||||
write " retransmit ${retransmit};" ${retransmit}
|
||||
write " authentication ${authentication};" ${authentication}
|
||||
config_foreach prepare_ospf_passwords "ospf_password" ${section}
|
||||
# config_foreach prepare_ospf_neighbors "ospf_neighbor" $section
|
||||
writeToConfig " };"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_ospf_area $1
|
||||
prepare_ospf_area() {
|
||||
local section="$1"
|
||||
local instance; local stub; local default_cost
|
||||
|
||||
get instance ${section}
|
||||
get stub ${section}
|
||||
get default_cost ${section}
|
||||
|
||||
writeToConfig " area ${section} {"
|
||||
if [ -n "${instance}" -a "${instance}" = "${section}" ]; then
|
||||
[ -n "${stub}" -a "${stub}" = "1" ] && writeToConfig " stub yes;"
|
||||
[ -n "${default_cost}" ] && writeToConfig " default cost ${default_cost};"
|
||||
config_foreach prepare_ospf_networks "ospf_networks" ${section}
|
||||
config_foreach prepare_ospf_interface "ospf_interface" ${section}
|
||||
writeToConfig " };"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_ospf_instance $1
|
||||
# $1 string
|
||||
# This function gets each "ospf_area" protocol section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI ospf_area section.
|
||||
prepare_ospf_instance() {
|
||||
local section="$1"
|
||||
local cfg1583compat; local tick
|
||||
|
||||
get cfg1583compat ${section}
|
||||
get tick ${section}
|
||||
|
||||
writeToConfig "protocol ospf ${section} {"
|
||||
[ -n "${cfg1583compat}" ] && cfg1583State="yes" || cfg1583State="no"
|
||||
writeToConfig " rfc1583compat ${cfg1583State};"
|
||||
[ -n "${tick}" ] && writeToConfig " tick ${tick};"
|
||||
config_foreach prepare_ospf_area 'ospf_area'
|
||||
writeToConfig "}"
|
||||
}
|
||||
|
||||
|
||||
# Function: gather_filters
|
||||
# This function gets all the FILES under /filters folder and adds
|
||||
# them into the config as %include elements on top of the file
|
||||
# If there are no filters, the section will remain empty.
|
||||
gather_filters() {
|
||||
writeToConfig "#Filters Section:"
|
||||
for filter in $(find /etc/${BIRD}/filters -type f); do
|
||||
writeToConfig "include \"${filter}\";"
|
||||
done
|
||||
writeToConfig "#End of Filters --"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: gather_functions
|
||||
# This function gets all the FILES under /functions folder and adds
|
||||
# them into the config as %include elements on top of the file
|
||||
# If there are no filters, the section will remain empty.
|
||||
gather_functions() {
|
||||
writeToConfig "#Functions Section:"
|
||||
for func in $(find /etc/${BIRD}/functions -type f); do
|
||||
writeToConfig "include \"${func}\";"
|
||||
done
|
||||
writeToConfig "#End of Functions --"
|
||||
writeToConfig " "
|
||||
}
|
|
@ -1,282 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
-- Repeated Strings
|
||||
local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
|
||||
local imp_string = "Set if the protocol must import routes.<br />" .. common_string
|
||||
local exp_string = "Set if the protocol must export routes.<br />" .. common_string
|
||||
|
||||
m=Map("bird4", "Bird4 BGP protocol's configuration")
|
||||
|
||||
tab_templates = {}
|
||||
uci:foreach('bird4', 'bgp_template', function (s)
|
||||
local name = s[".name"]
|
||||
if (name ~= nil) then
|
||||
table.insert(tab_templates, name)
|
||||
end
|
||||
end)
|
||||
|
||||
--
|
||||
-- BGP TEMPLATES
|
||||
--
|
||||
sect_templates = m:section(TypedSection, "bgp_template", "BGP Templates", "Configuration of the templates used in BGP instances.")
|
||||
sect_templates.addremove = true
|
||||
sect_templates.anonymous = false
|
||||
|
||||
disabled = sect_templates:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
|
||||
disabled.optional=true
|
||||
|
||||
table = sect_templates:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
|
||||
table.optional=true
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
igp_table = sect_templates:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
|
||||
igp_table.optional = true
|
||||
uci:foreach("bird4", "table",
|
||||
function(s)
|
||||
igp_table:value(s.name)
|
||||
end)
|
||||
igp_table:value("")
|
||||
igp_table.default = ""
|
||||
|
||||
import = sect_templates:option(Value, "import", "Import", imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_templates:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
source_addr = sect_templates:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
|
||||
source_addr.optional = true
|
||||
|
||||
local_as = sect_templates:option(Value, "local_as", "Local AS", "")
|
||||
local_as.optional = false
|
||||
|
||||
next_hop_self = sect_templates:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
|
||||
next_hop_self.default = nil
|
||||
next_hop_self.optional = true
|
||||
|
||||
next_hop_keep = sect_templates:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
|
||||
next_hop_keep.default = nil
|
||||
next_hop_keep.optional = true
|
||||
|
||||
rr_client = sect_templates:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
|
||||
rr_client.default = nil
|
||||
rr_client.optional = true
|
||||
|
||||
rr_cluster_id = sect_templates:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
|
||||
rr_cluster_id.optional = true
|
||||
|
||||
import_trigger = sect_templates:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
|
||||
import_trigger.default = 0
|
||||
import_trigger.rmempty = false
|
||||
import_trigger.optional = false
|
||||
|
||||
import_limit = sect_templates:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
|
||||
import_limit:depends({import_trigger = "1"})
|
||||
import_limit.rmempty = true
|
||||
|
||||
import_limit_action = sect_templates:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
|
||||
import_limit_action:depends({import_trigger = "1"})
|
||||
import_limit_action:value("warn")
|
||||
import_limit_action:value("block")
|
||||
import_limit_action:value("disable")
|
||||
import_limit_action:value("restart")
|
||||
import_limit_action.default = "warn"
|
||||
import_limit_action.rmempty = true
|
||||
|
||||
export_trigger = sect_templates:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
|
||||
export_trigger.default = 0
|
||||
export_trigger.rmempty = false
|
||||
export_trigger.optional = false
|
||||
|
||||
export_limit = sect_templates:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
|
||||
export_limit:depends({export_trigger = "1"})
|
||||
export_limit.rmempty = true
|
||||
|
||||
export_limit_action = sect_templates:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
|
||||
export_limit_action:depends({export_trigger = "1"})
|
||||
export_limit_action.rmempty = true
|
||||
export_limit_action:value("warn")
|
||||
export_limit_action:value("block")
|
||||
export_limit_action:value("disable")
|
||||
export_limit_action:value("restart")
|
||||
export_limit_action.default = "warn"
|
||||
|
||||
receive_trigger = sect_templates:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
|
||||
receive_trigger.default = 0
|
||||
receive_trigger.rmempty = false
|
||||
receive_trigger.optional = false
|
||||
|
||||
receive_limit = sect_templates:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
|
||||
receive_limit:depends({receive_trigger = "1"})
|
||||
receive_limit.rmempty = true
|
||||
|
||||
receive_limit_action = sect_templates:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
|
||||
receive_limit_action:depends({receive_trigger = "1"})
|
||||
receive_limit_action:value("warn")
|
||||
receive_limit_action:value("block")
|
||||
receive_limit_action:value("disable")
|
||||
receive_limit_action:value("restart")
|
||||
receive_limit_action.default = "warn"
|
||||
receive_limit_action.rmempty= true
|
||||
|
||||
--
|
||||
-- BGP INSTANCES
|
||||
--
|
||||
sect_instances = m:section(TypedSection, "bgp", "BGP Instances", "Configuration of the BGP protocol instances")
|
||||
sect_instances.addremove = true
|
||||
sect_instances.anonymous = false
|
||||
|
||||
disabled = sect_instances:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
|
||||
disabled.optional = false
|
||||
disabled.rmempty = false
|
||||
disabled.default = nil
|
||||
|
||||
templates = sect_instances:option(ListValue, "template", "Templates", "Available BGP templates")
|
||||
uci:foreach("bird4", "bgp_template",
|
||||
function(s)
|
||||
templates:value(s[".name"])
|
||||
end)
|
||||
templates:value("")
|
||||
|
||||
description = sect_instances:option(TextValue, "description", "Description", "Description of the current BGP instance")
|
||||
description.optional = true
|
||||
|
||||
table = sect_instances:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
|
||||
table.optional=true
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
igp_table = sect_instances:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
|
||||
igp_table.optional = true
|
||||
uci:foreach("bird4", "table",
|
||||
function(s)
|
||||
igp_table:value(s.name)
|
||||
end)
|
||||
igp_table:value("")
|
||||
igp_table.default = ""
|
||||
|
||||
passive = sect_instances:option(Flag, "passive", "Passive", "Disable automatic initialization of outgoing connections.")
|
||||
passive.optional=true
|
||||
passive.rmempty = false
|
||||
passive.default = nil
|
||||
|
||||
import = sect_instances:option(Value, "import", "Import", imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_instances:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
source_address = sect_instances:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
|
||||
source_address.optional = true
|
||||
|
||||
local_as = sect_instances:option(Value, "local_as", "Local AS", "")
|
||||
local_as.optional=true
|
||||
|
||||
neighbor_address = sect_instances:option(Value, "neighbor_address", "Neighbor IP Address", "")
|
||||
neighbor_address.optional = false
|
||||
|
||||
neighbor_as = sect_instances:option(Value, "neighbor_as", "Neighbor AS", "")
|
||||
neighbor_as.optional = false
|
||||
|
||||
next_hop_self = sect_instances:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
|
||||
next_hop_self.default = nil
|
||||
next_hop_self.optional = true
|
||||
|
||||
next_hop_keep = sect_instances:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
|
||||
next_hop_keep.default = nil
|
||||
next_hop_keep.optional = true
|
||||
|
||||
rr_client = sect_instances:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
|
||||
rr_client.default = nil
|
||||
rr_client.optional = true
|
||||
|
||||
rr_cluster_id = sect_instances:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
|
||||
rr_cluster_id.optional = true
|
||||
|
||||
import_trigger = sect_instances:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
|
||||
import_trigger.default = 0
|
||||
import_trigger.rmempty = false
|
||||
import_trigger.optional = false
|
||||
|
||||
import_limit = sect_instances:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
|
||||
import_limit:depends({import_trigger = "1"})
|
||||
import_limit.rmempty = true
|
||||
|
||||
import_limit_action = sect_instances:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
|
||||
import_limit_action:depends({import_trigger = "1"})
|
||||
import_limit_action:value("warn")
|
||||
import_limit_action:value("block")
|
||||
import_limit_action:value("disable")
|
||||
import_limit_action:value("restart")
|
||||
import_limit_action.default = "warn"
|
||||
import_limit_action.rmempty = true
|
||||
|
||||
export_trigger = sect_instances:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
|
||||
export_trigger.default = 0
|
||||
export_trigger.rmempty = false
|
||||
export_trigger.optional = false
|
||||
|
||||
export_limit = sect_instances:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
|
||||
export_limit:depends({export_trigger = "1"})
|
||||
export_limit.rmempty = true
|
||||
|
||||
export_limit_action = sect_instances:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
|
||||
export_limit_action:depends({export_trigger = "1"})
|
||||
export_limit_action:value("warn")
|
||||
export_limit_action:value("block")
|
||||
export_limit_action:value("disable")
|
||||
export_limit_action:value("restart")
|
||||
export_limit_action.default = "warn"
|
||||
export_limit_action.rmempty= true
|
||||
|
||||
receive_trigger = sect_instances:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
|
||||
receive_trigger.default = 0
|
||||
receive_trigger.rmempty = false
|
||||
receive_trigger.optional = false
|
||||
|
||||
receive_limit = sect_instances:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
|
||||
receive_limit:depends({receive_trigger = "1"})
|
||||
receive_limit.rmempty = true
|
||||
|
||||
receive_limit_action = sect_instances:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
|
||||
receive_limit_action:depends({receive_trigger = "1"})
|
||||
receive_limit_action:value("warn")
|
||||
receive_limit_action:value("block")
|
||||
receive_limit_action:value("disable")
|
||||
receive_limit_action:value("restart")
|
||||
receive_limit_action.default = "warn"
|
||||
receive_limit_action.rmempty= true
|
||||
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird4 restart')
|
||||
end
|
||||
return m
|
|
@ -1,77 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local filters_dir = "/etc/bird4/filters/"
|
||||
local lock_file = "/etc/bird4/filter_lock"
|
||||
|
||||
m = SimpleForm("bird4", "Bird4 Filters", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
files = s:option(ListValue, "Files", "Filter Files:")
|
||||
local new_filter = filters_dir .. os.date("filter-%Y%m%d-%H%M")
|
||||
|
||||
-- New File Entry
|
||||
files:value(new_filter, "New File (".. new_filter .. ")")
|
||||
files.default = new_filter
|
||||
|
||||
local i, file_list = 0, { }
|
||||
for filename in io.popen("find " .. filters_dir .. " -type f"):lines() do
|
||||
i = i + 1
|
||||
files:value(filename, filename)
|
||||
end
|
||||
|
||||
ld = s:option(Button, "_load", "Load File")
|
||||
ld.inputstyle = "reload"
|
||||
|
||||
st_file = s:option(DummyValue, "_stfile", "Editing file:")
|
||||
function st_file.cfgvalue(self, section)
|
||||
if ld:formvalue(section) then
|
||||
fs.writefile(lock_file, files:formvalue(section))
|
||||
return files:formvalue(section)
|
||||
else
|
||||
fs.writefile(lock_file, "")
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
area = s:option(Value, "_filters")
|
||||
area.template = "bird4/tvalue"
|
||||
area.rows = 30
|
||||
function area.cfgvalue(self,section)
|
||||
if ld:formvalue(section) then
|
||||
local contents = fs.readfile(files:formvalue(section))
|
||||
if contents then
|
||||
return contents
|
||||
else
|
||||
return ""
|
||||
end
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function area.write(self, section)
|
||||
local locked_file = fs.readfile(lock_file)
|
||||
if locked_file and not ld:formvalue(section) then
|
||||
local text = self:formvalue(section):gsub("\r\n?", "\n")
|
||||
fs.writefile(locked_file, text)
|
||||
fs.writefile(lock_file, "")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,77 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local functions_dir = "/etc/bird4/functions/"
|
||||
local lock_file = "/etc/bird4/function_lock"
|
||||
|
||||
m = SimpleForm("bird4", "Bird4 Functions", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
files = s:option(ListValue, "Files", "Function Files:")
|
||||
local new_function = functions_dir .. os.date("function-%Y%m%d-%H%M")
|
||||
|
||||
-- New File Entry
|
||||
files:value(new_function, "New File (".. new_function .. ")")
|
||||
files.default = new_function
|
||||
|
||||
local i, file_list = 0, { }
|
||||
for filename in io.popen("find " .. functions_dir .. " -type f"):lines() do
|
||||
i = i + 1
|
||||
files:value(filename, filename)
|
||||
end
|
||||
|
||||
ld = s:option(Button, "_load", "Load File")
|
||||
ld.inputstyle = "reload"
|
||||
|
||||
st_file = s:option(DummyValue, "_stfile", "Editing file:")
|
||||
function st_file.cfgvalue(self, section)
|
||||
if ld:formvalue(section) then
|
||||
fs.writefile(lock_file, files:formvalue(section))
|
||||
return files:formvalue(section)
|
||||
else
|
||||
fs.writefile(lock_file, "")
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
area = s:option(Value, "_functions")
|
||||
area.template = "bird4/tvalue"
|
||||
area.rows = 30
|
||||
function area.cfgvalue(self,section)
|
||||
if ld:formvalue(section) then
|
||||
local contents = fs.readfile(files:formvalue(section))
|
||||
if contents then
|
||||
return contents
|
||||
else
|
||||
return ""
|
||||
end
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function area.write(self, section)
|
||||
local locked_file = fs.readfile(lock_file)
|
||||
if locked_file and not ld:formvalue(section) then
|
||||
local text = self:formvalue(section):gsub("\r\n?", "\n")
|
||||
fs.writefile(locked_file, text)
|
||||
fs.writefile(lock_file, "")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,263 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
-- Repeated Strings
|
||||
local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
|
||||
local imp_string = "Set if the protocol must import routes.<br />" .. common_string
|
||||
local exp_string = "Set if the protocol must export routes.<br />" .. common_string
|
||||
|
||||
m=Map("bird4", "Bird4 general protocol's configuration.")
|
||||
|
||||
-- Optional parameters lists
|
||||
local protoptions = {
|
||||
{["name"]="table", ["help"]="Auxiliar table for routing", ["depends"]={"static","kernel"}},
|
||||
{["name"]="import", ["help"]=imp_string, ["depends"]={"kernel"}},
|
||||
{["name"]="export", ["help"]=exp_string, ["depends"]={"kernel"}},
|
||||
{["name"]="scan_time", ["help"]="Time between scans", ["depends"]={"kernel","device"}},
|
||||
{["name"]="kernel_table", ["help"]="Set which table must be used as auxiliar kernel table", ["depends"]={"kernel"}},
|
||||
{["name"]="learn", ["help"]="Learn routes", ["depends"]={"kernel"}},
|
||||
{["name"]="persist", ["help"]="Store routes. After a restart, routes willstill be configured", ["depends"]={"kernel"}}
|
||||
}
|
||||
|
||||
local routeroptions = {
|
||||
{["name"]="prefix",["help"]="",["depends"]={"router","special","iface","multipath","recursive"}},
|
||||
{["name"]="via",["help"]="",["depends"]={"router","multipath"}},
|
||||
{["name"]="attribute",["help"]="",["depends"]={"special"}},
|
||||
{["name"]="iface",["help"]="",["depends"]={"iface"}},
|
||||
{["name"]="ip",["help"]="",["depends"]={"recursive"}}
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
-- KERNEL PROTOCOL
|
||||
--
|
||||
sect_kernel_protos = m:section(TypedSection, "kernel", "Kernel options", "Configuration of the kernel protocols. First Instance MUST be Primary table (no table or kernel_table fields).")
|
||||
sect_kernel_protos.addremove = true
|
||||
sect_kernel_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
disabled = sect_kernel_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "kernel" then
|
||||
if o.name == "learn" or o.name == "persist" then
|
||||
value = sect_kernel_protos:option(Flag, o.name, translate(o.name), translate(o.help))
|
||||
elseif o.name == "table" then
|
||||
value = sect_kernel_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
value:value(s.name)
|
||||
end)
|
||||
value:value("")
|
||||
value.default = ""
|
||||
else
|
||||
value = sect_kernel_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
end
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- DEVICE PROTOCOL
|
||||
--
|
||||
sect_device_protos = m:section(TypedSection, "device", "Device options", "Configuration of the device protocols.")
|
||||
sect_device_protos.addremove = true
|
||||
sect_device_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
|
||||
disabled = sect_device_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "device" then
|
||||
value = sect_device_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- PIPE PROTOCOL
|
||||
--
|
||||
sect_pipe_protos = m:section(TypedSection, "pipe", "Pipe options", "Configuration of the Pipe protocols.")
|
||||
sect_pipe_protos.addremove = true
|
||||
sect_pipe_protos.anonymous = false
|
||||
|
||||
-- Default Pipe parameters
|
||||
disabled = sect_pipe_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
|
||||
disabled.default=0
|
||||
|
||||
table = sect_pipe_protos:option(ListValue, "table", "Table", "Select the Primary Table to connect.")
|
||||
table.optional = false
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
peer_table = sect_pipe_protos:option(ListValue, "peer_table", "Peer Table", "Select the Secondary Table to connect.")
|
||||
table.optional = false
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
peer_table:value(s.name)
|
||||
end)
|
||||
peer_table:value("")
|
||||
peer_table.default = ""
|
||||
|
||||
mode = sect_pipe_protos:option(ListValue, "mode", "Mode", "Select <b>transparent</b> to retransmit all routes and their attributes<br />Select <b>opaque</b> to retransmit optimal routes (similar to what other protocols do)")
|
||||
mode.optional = false
|
||||
mode:value("transparent")
|
||||
mode:value("opaque")
|
||||
mode.default = "transparent"
|
||||
|
||||
import = sect_pipe_protos:option(Value, "import", "Import",imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_pipe_protos:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
|
||||
--
|
||||
-- DIRECT PROTOCOL
|
||||
--
|
||||
sect_direct_protos = m:section(TypedSection, "direct", "Direct options", "Configuration of the Direct protocols.")
|
||||
sect_direct_protos.addremove = true
|
||||
sect_direct_protos.anonymous = false
|
||||
|
||||
-- Default Direct parameters
|
||||
disabled = sect_direct_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
|
||||
disabled.optional = false
|
||||
disabled.default = 0
|
||||
|
||||
interface = sect_direct_protos:option(Value, "interface", "Interfaces", "By default Direct will generate device routes for all the interfaces. To restrict this behaviour, select a number of patterns to match your desired interfaces:" .. "<br />" .. "1. All the strings <b>MUST</b> be quoted: \"pattern\"" .. "<br />" .. "2. Use * (star) to match patterns: \"eth*\" (<b>include</b> all eth... interfaces)" .. "<br />" .. "3. You can add \"-\" (minus) to exclude patterns: \"-em*\" (<b>exclude</b> all em... interfaces)." .. "<br />" .. "4. Separate several patterns using , (coma): \"-em*\", \"eth*\" (<b>exclude</b> em... and <b>include</b> all eth... interfaces).")
|
||||
interface.optional = false
|
||||
interface.default = "\"*\""
|
||||
|
||||
|
||||
--
|
||||
-- STATIC PROTOCOL
|
||||
--
|
||||
sect_static_protos = m:section(TypedSection, "static", "Static options", "Configuration of the static protocols.")
|
||||
sect_static_protos.addremove = true
|
||||
sect_static_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
disabled = sect_static_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "static" then
|
||||
if o.name == "table" then
|
||||
value = sect_static_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
value:value(s.name)
|
||||
end)
|
||||
value:value("")
|
||||
value.default = ""
|
||||
else
|
||||
value = sect_static_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
end
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- ROUTES FOR STATIC PROTOCOL
|
||||
--
|
||||
sect_routes = m:section(TypedSection, "route", "Routes configuration", "Configuration of the routes used in static protocols.")
|
||||
sect_routes.addremove = true
|
||||
sect_routes.anonymous = true
|
||||
|
||||
instance = sect_routes:option(ListValue, "instance", "Route instance", "")
|
||||
i = 0
|
||||
uci:foreach("bird4", "static",
|
||||
function (s)
|
||||
instance:value(s[".name"])
|
||||
end)
|
||||
|
||||
prefix = sect_routes:option(Value, "prefix", "Route prefix", "")
|
||||
|
||||
type = sect_routes:option(ListValue, "type", "Type of route", "")
|
||||
type:value("router")
|
||||
type:value("special")
|
||||
type:value("iface")
|
||||
type:value("recursive")
|
||||
type:value("multipath")
|
||||
|
||||
valueVia = sect_routes:option(Value, "via", "Via", "")
|
||||
valueVia.optional = false
|
||||
valueVia:depends("type", "router")
|
||||
valueVia.datatype = "ip4addr"
|
||||
|
||||
listVia = sect_routes:option(DynamicList, "l_via", "Via", "")
|
||||
listVia:depends("type", "multipath")
|
||||
listVia.optional=false
|
||||
listVia.datatype = "ip4addr"
|
||||
|
||||
attribute = sect_routes:option(ListValue, "attribute", "Attribute", "")
|
||||
attribute:depends("type", "special")
|
||||
attribute:value("unreachable")
|
||||
attribute:value("prohibit")
|
||||
attribute:value("blackhole")
|
||||
|
||||
iface = sect_routes:option(ListValue, "iface", "Interface", "")
|
||||
iface:depends("type", "iface")
|
||||
uci:foreach("network", "interface",
|
||||
function(section)
|
||||
if section[".name"] ~= "loopback" then
|
||||
iface:value(section[".name"])
|
||||
end
|
||||
end)
|
||||
|
||||
ip = sect_routes:option(Value, "ip", "IP address", "")
|
||||
ip:depends("type", "ip")
|
||||
ip.datatype = [[ or"ip4addr", "ip6addr" ]]
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird4 restart')
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,76 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = require "luci.model.uci"
|
||||
local uciout = uci.cursor()
|
||||
|
||||
m=Map("bird4", "Bird4 UCI configuration helper", "")
|
||||
|
||||
-- Named section: "bird"
|
||||
|
||||
s_bird_uci = m:section(NamedSection, "bird", "bird", "Bird4 file settings", "")
|
||||
s_bird_uci.addremove = False
|
||||
|
||||
uuc = s_bird_uci:option(Flag, "use_UCI_config", "Use UCI configuration", "Use UCI configuration instead of the /etc/bird4.conf file")
|
||||
|
||||
ucf = s_bird_uci:option(Value, "UCI_config_file", "UCI File", "Specify the file to place the UCI-translated configuration")
|
||||
ucf.default = "/tmp/bird4.conf"
|
||||
|
||||
-- Named Section: "table"
|
||||
|
||||
s_bird_table = m:section(TypedSection, "table", "Tables configuration", "Configuration of the tables used in the protocols")
|
||||
s_bird_table.addremove = true
|
||||
s_bird_table.anonymous = true
|
||||
|
||||
name = s_bird_table:option(Value, "name", "Table name", "Descriptor ID of the table")
|
||||
|
||||
-- Named section: "global"
|
||||
|
||||
s_bird_global = m:section(NamedSection, "global", "global", "Global options", "Basic Bird4 settings")
|
||||
s_bird_global.addremove = False
|
||||
|
||||
id = s_bird_global:option(Value, "router_id", "Router ID", "Identification number of the router. By default, is the router's IP.")
|
||||
|
||||
lf = s_bird_global:option(Value, "log_file", "Log File", "File used to store log related data.")
|
||||
|
||||
l = s_bird_global:option(MultiValue, "log", "Log", "Set which elements do you want to log.")
|
||||
l:value("all", "All")
|
||||
l:value("info", "Info")
|
||||
l:value("warning","Warning")
|
||||
l:value("error","Error")
|
||||
l:value("fatal","Fatal")
|
||||
l:value("debug","Debug")
|
||||
l:value("trace","Trace")
|
||||
l:value("remote","Remote")
|
||||
l:value("auth","Auth")
|
||||
|
||||
d = s_bird_global:option(MultiValue, "debug", "Debug", "Set which elements do you want to debug.")
|
||||
d:value("all", "All")
|
||||
d:value("states","States")
|
||||
d:value("routes","Routes")
|
||||
d:value("filters","Filters")
|
||||
d:value("interfaces","Interfaces")
|
||||
d:value("events","Events")
|
||||
d:value("packets","Packets")
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird4 restart')
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,53 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local sys = require "luci.sys"
|
||||
|
||||
m = SimpleForm("bird4", "Bird4 Daemon Status Page", "This page let you Start, Stop, Restart and check Bird4 Service Status.")
|
||||
m.reset = false
|
||||
m.submit = false
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
|
||||
start = s:option(Button, "_start", "Start Bird4 Daemon:")
|
||||
start.inputtitle = " Start "
|
||||
start.inputstyle = "apply"
|
||||
|
||||
stop = s:option(Button, "_stop", "Stop Bird4 Daemon:")
|
||||
stop.inputtitle = " Stop "
|
||||
stop.inputstyle = "remove"
|
||||
|
||||
restart = s:option(Button, "_restart", "Restart Bird4 Daemon:")
|
||||
restart.inputtitle = "Restart"
|
||||
restart.inputstyle = "reload"
|
||||
|
||||
output = s:option(DummyValue, "_value", "Service Status")
|
||||
function output.cfgvalue(self, section)
|
||||
local ret = ""
|
||||
if start:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird4 start_quiet")
|
||||
elseif stop:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird4 stop_quiet")
|
||||
elseif restart:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird4 restart_quiet")
|
||||
else
|
||||
ret = sys.exec("/etc/init.d/bird4 status_quiet")
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,33 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# This UCI-Defaults script will MOVE any pre-existing filter
|
||||
# stored in a file and configured as an UCI item (deprecated)
|
||||
# The script will try to match any "filter" Section, get its
|
||||
# "file_path" property and move the file (if exists) to the
|
||||
# new (v0.3+) default location: /etc/bird{4|6}/filters
|
||||
|
||||
[ $# -ne 1 ] && exit 1
|
||||
BIRD="$1"
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
# This function will move an existing folder configured on
|
||||
# Bird as a "filter" to filters' folder.
|
||||
mv_filter() {
|
||||
local section="$1"
|
||||
local file_path
|
||||
config_get file_path ${section} file_path
|
||||
|
||||
if [ -f ${file_path} ]; then
|
||||
mv ${file_path} /etc/${BIRD}/filters/
|
||||
fi
|
||||
uci delete ${BIRD}.${section}
|
||||
}
|
||||
|
||||
if [ -f /etc/config/${BIRD} ]; then
|
||||
config_load ${BIRD}
|
||||
config_foreach mv_filter 'filter'
|
||||
uci commit ${BIRD}
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -1,13 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ $# -ne 1 ] && exit 1
|
||||
|
||||
BIRD=$1
|
||||
|
||||
EXC=`mount -t overlayfs | grep overlayfs -c`
|
||||
|
||||
[ $EXC > 0 ] && rm -r /etc/init.d/${BIRD} || mv /etc/init.d/${BIRD} /etc/${BIRD}/init.d/${BIRD}.orig
|
||||
|
||||
ln -s /etc/${BIRD}/init.d/${BIRD} /etc/init.d/${BIRD}
|
||||
|
||||
exit 0
|
|
@ -1,41 +0,0 @@
|
|||
<%-
|
||||
-- Only populate textarea through XHR.poll
|
||||
-- "refresh" is present in the URL (.../log?refresh=1)
|
||||
if luci.http.formvalue("refresh") then
|
||||
|
||||
-- Force HTTP Contents to be "text/plain"
|
||||
luci.http.prepare_content("text/plain")
|
||||
|
||||
local sys = require("luci.sys")
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
|
||||
-- Get Log File from Bird's configuration or leave it empty.
|
||||
local log_file = uci:get("bird4", "global", "log_file") or ""
|
||||
local log_size = ""
|
||||
if log_file then
|
||||
log_size = sys.exec("du -h " .. log_file .. " | awk '{print $1}'")
|
||||
-- Gathering last 30 lines of the Log File.
|
||||
lf = sys.exec("tail -n30 " .. log_file):gsub("\r\n?", "\n")
|
||||
end
|
||||
|
||||
-- Write File used and its contents.
|
||||
luci.http.write("Using Log File: " .. log_file .. " - File Size: " .. log_size .. "\n" .. lf)
|
||||
|
||||
-- Avoid printing the rest of the page (return only text log data)
|
||||
return
|
||||
end
|
||||
-%>
|
||||
|
||||
<%+header%>
|
||||
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
// Refresh page each second. Use "refresh=1" as trigger.
|
||||
XHR.poll(1, '<%=url('admin/network/bird4/log')%>', { refresh: 1 }, function(xhrInstance) {
|
||||
var area = document.getElementById('log')
|
||||
area.value = xhrInstance.responseText;
|
||||
});
|
||||
//]]></script>
|
||||
|
||||
|
||||
<textarea readonly="readonly" style="width: 100%" wrap="on" rows="32" id="log"><%=lf:pcdata()%></textarea>
|
||||
<%+footer%>
|
|
@ -1,5 +0,0 @@
|
|||
<%+cbi/valueheader%>
|
||||
<textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 100%; font: normal 11pt 'Courier New'"<% else %> cols="<%=self.size%>"<% end %> data-update="change"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap") .. ifattr(self.readonly, "readonly") %>>
|
||||
<%-=pcdata(self:cfgvalue(section))-%>
|
||||
</textarea>
|
||||
<%+cbi/valuefooter%>
|
|
@ -1,36 +0,0 @@
|
|||
config bird 'bird'
|
||||
option use_UCI_config '1'
|
||||
#Caution! Enabling this option, Bird will translate this
|
||||
#UCI file and use it instead of /etc/bird6.conf
|
||||
option UCI_config_file '/tmp/bird6.conf'
|
||||
#If you enable useUCIconfig, UCIconfigFile will be Bird's
|
||||
#configuration file location.
|
||||
|
||||
config global 'global'
|
||||
option log_file '/tmp/bird6.log'
|
||||
option log 'all'
|
||||
option debug 'off'
|
||||
# This option is set up because is mandatory for Bird6.
|
||||
# Change it to your IPv4 Address or a HEX value.
|
||||
option router_id '0xCAFEBABE'
|
||||
|
||||
config table
|
||||
option name 'aux'
|
||||
|
||||
config kernel kernel1
|
||||
option table 'aux'
|
||||
option import 'all'
|
||||
option export 'all'
|
||||
option kernel_table '100'
|
||||
option scan_time '10'
|
||||
option learn '1'
|
||||
option persist '0'
|
||||
option disabled '0'
|
||||
|
||||
config device device1
|
||||
option scan_time '10'
|
||||
option disabled '0'
|
||||
|
||||
config static static1
|
||||
option table 'aux'
|
||||
option disabled '0'
|
|
@ -1,52 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
module("luci.controller.bird6", package.seeall)
|
||||
|
||||
function index()
|
||||
entry({"admin","network","bird6"},
|
||||
alias("admin","network","bird6","status"),
|
||||
_("Bird6"), 0)
|
||||
|
||||
entry({"admin", "network", "bird6", "status"},
|
||||
form("bird6/status"),
|
||||
_("Status"), 0).leaf = true
|
||||
|
||||
entry({"admin","network","bird6","log"},
|
||||
template("bird6/log"),
|
||||
_("Log"), 1).leaf = true
|
||||
|
||||
entry({"admin","network","bird6","overview"},
|
||||
cbi("bird6/overview"),
|
||||
_("Overview"), 2).leaf = true
|
||||
|
||||
entry({"admin","network","bird6","proto_general"},
|
||||
cbi("bird6/gen_proto"),
|
||||
_("General protocols"), 3).leaf = true
|
||||
|
||||
entry({"admin","network","bird6","proto_bgp"},
|
||||
cbi("bird6/bgp_proto"),
|
||||
_("BGP Protocol"), 4).leaf = true
|
||||
|
||||
entry({"admin","network","bird6","filters"},
|
||||
form("bird6/filters"),
|
||||
_("Filters"), 5).leaf = true
|
||||
|
||||
entry({"admin","network","bird6","functions"},
|
||||
form("bird6/functions"),
|
||||
_("Functions"), 6).leaf = true
|
||||
end
|
|
@ -1,225 +0,0 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
|
||||
# Copyright (C) 2014-2017 - Eloi Carbo
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# Extra Service Function to get the Status of the Service
|
||||
# This complements /etc/rc.common functions
|
||||
# Commands ending with *_quiet are meant to be ran in Luci. These
|
||||
# scripts' return minimal output.
|
||||
EXTRA_COMMANDS="status start_quiet stop_quiet restart_quiet status_quiet"
|
||||
EXTRA_HELP=" status Returns service status"
|
||||
|
||||
BIRD="bird6"
|
||||
BIRD_CONFIG="/etc/${BIRD}.conf"
|
||||
BIRD_LOG="/var/log/${BIRD}.log"
|
||||
BIRD_ERR="/tmp/${BIRD}.err"
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_USE_PID=1
|
||||
SERVICE_PID_FILE="/var/run/${BIRD}.pid"
|
||||
|
||||
BIRD_BIN="/usr/sbin/${BIRD}"
|
||||
# Special non-terminal-rich output for Luci calls
|
||||
LUCI="false"
|
||||
|
||||
. /etc/${BIRD}/init.d/${BIRD}-lib.sh
|
||||
|
||||
start() {
|
||||
config_load ${BIRD}
|
||||
local use_UCI_config
|
||||
get use_UCI_config 'bird'
|
||||
|
||||
#Start the service
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo "Starting ${BIRD} Service [ ... ]"
|
||||
fi
|
||||
if [ -f ${BIRD_ERR} ]; then
|
||||
echo "" > ${BIRD_ERR}
|
||||
else
|
||||
touch ${BIRD_ERR}
|
||||
fi
|
||||
|
||||
if [ -z "${use_UCI_config}" -o "${use_UCI_config}" = "0" ]; then
|
||||
# Disable Custom bird-openwrt settings.
|
||||
# Use default behaviour and files
|
||||
${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &> ${BIRD_ERR} &
|
||||
else
|
||||
#Set Bird6 configuration location:
|
||||
local UCI_config_file
|
||||
local log_file
|
||||
get UCI_config_file 'bird'
|
||||
get log_file 'global'
|
||||
BIRD_CONFIG="${UCI_config_file:-$BIRD_CONFIG}"
|
||||
BIRD_LOG="${log_file:-$BIRD_LOG}"
|
||||
#Backup previous configuration
|
||||
[ -f ${BIRD_CONFIG} ] && cp ${BIRD_CONFIG} ${BIRD_CONFIG}.bak
|
||||
#Setup the basic configuration
|
||||
prepare_global 'global'
|
||||
|
||||
# Gather and set all Functions
|
||||
gather_functions
|
||||
# Gather and set all Filters
|
||||
gather_filters
|
||||
|
||||
# Setup Main Protocols
|
||||
config_foreach prepare_kernel 'kernel'
|
||||
config_foreach prepare_static 'static'
|
||||
config_foreach prepare_device 'device'
|
||||
config_foreach prepare_direct 'direct'
|
||||
config_foreach prepare_pipe 'pipe'
|
||||
|
||||
#Setup protocol's configuration: BGP
|
||||
config_foreach prepare_bgp_template 'bgp_template'
|
||||
config_foreach prepare_bgp 'bgp'
|
||||
|
||||
#Setup protocol's configuration: OSPF
|
||||
#config_foreach prepare_ospf_instance 'ospf'
|
||||
|
||||
#Start the service
|
||||
${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &>${BIRD_ERR} &
|
||||
fi
|
||||
while [ ! -s ${SERVICE_PID_FILE} ]; do
|
||||
sleep 1
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Start Status: \033[0;31m[ FAILED ]\e[m"
|
||||
cat ${BIRD_ERR}
|
||||
cat ${BIRD_ERR} >> ${BIRD_LOG}
|
||||
else
|
||||
echo "${BIRD} - Failed: $(cat ${BIRD_ERR})"
|
||||
cat ${BIRD_ERR} >> ${BIRD_LOG}
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon already started. Status \033[0;32m[ RUNNING ]\e[m"
|
||||
else
|
||||
echo "${BIRD} already started"
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Start Status: \033[0;32m[ STARTED ]\e[m"
|
||||
else
|
||||
echo "${BIRD} - Started"
|
||||
fi
|
||||
fi
|
||||
# PID File found (service started correctly)
|
||||
return 0
|
||||
fi
|
||||
|
||||
# PID File not found (error while starting service)
|
||||
return 1
|
||||
}
|
||||
|
||||
stop() {
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
config_load ${BIRD}
|
||||
local log_file
|
||||
get log_file 'global'
|
||||
BIRD_LOG="${log_file:-$BIRD_LOG}"
|
||||
start-stop-daemon -p ${SERVICE_PID_FILE} -K 2>&1 >> ${BIRD_LOG}
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Stop Status: \033[0;32m[ OK ]\e[m"
|
||||
else
|
||||
echo "${BIRD} - Stopped"
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Stop Status: \033[0;31m[ FAILED ]\e[m"
|
||||
echo "Check ${BIRD_LOG} file for more information."
|
||||
else
|
||||
echo "${BIRD} Failed to Stop. See Log file: ${BIRD_LOG}"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Service already stopped. \033[0;31m[ FAILED ]\e[m"
|
||||
else
|
||||
echo "${BIRD} already stopped"
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
restart() {
|
||||
stop
|
||||
sleep 1
|
||||
if [ "${LUCI}" == "true" ]; then
|
||||
echo " ... "
|
||||
fi
|
||||
start
|
||||
}
|
||||
|
||||
reload() {
|
||||
service_reload ${BIRD_BIN}
|
||||
}
|
||||
|
||||
status() {
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} start status: \033[0;32m[ RUNNING ]\e[m"
|
||||
else
|
||||
echo "${BIRD}: Running"
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
|
||||
cat ${BIRD_ERR}
|
||||
else
|
||||
echo "${BIRD}: Failed - $(cat ${BIRD_ERR})"
|
||||
fi
|
||||
return 2
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
|
||||
else
|
||||
echo "${BIRD}: Stopped"
|
||||
fi
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Luci-specific calls (stripped output).
|
||||
# The following scripts are not meant to be ran using Ash Terminal
|
||||
# Used in: LUCI/model/cbi/bird6/status.lua
|
||||
start_quiet() {
|
||||
LUCI="true"
|
||||
start
|
||||
}
|
||||
stop_quiet() {
|
||||
LUCI="true"
|
||||
stop
|
||||
}
|
||||
restart_quiet() {
|
||||
LUCI="true"
|
||||
restart
|
||||
}
|
||||
status_quiet() {
|
||||
LUCI="true"
|
||||
status
|
||||
}
|
|
@ -1,476 +0,0 @@
|
|||
# Bird6-OpenWRT Library - Functions used in /etc/init.d/bird6 script.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2014-2017 - Eloi Carbo
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
# Function: writeToConfig $1
|
||||
# $1 string.
|
||||
# Allows to write in the $BIRD_CONFIG file, the string $1. This function does not check the $1 string.
|
||||
# Example: writeToConfig "value: $N"
|
||||
writeToConfig() {
|
||||
echo "$1" >> ${BIRD_CONFIG}
|
||||
}
|
||||
|
||||
|
||||
# Function: write $1 $2
|
||||
# $1 string. $2 string.
|
||||
# This function checks if $2 is empty. If not, it writes the string $1 in the $BIRD_CONFIG file.
|
||||
# Use write function to check if $1, value found inside $2, is not empty and can be written in the configuration file.
|
||||
# Example: N=""; write "value: $N" $N;
|
||||
write() {
|
||||
[ -n "$2" ] && writeToConfig "$1"
|
||||
}
|
||||
|
||||
|
||||
#Function: write_bool $1 $2
|
||||
# $1 string; $2 boolean
|
||||
# This function checks if $2 is true or false and write the $1 string into $BIRD_CONFIG file.
|
||||
# The function writes a # before the $2 string if its false.
|
||||
# Example: local N=0; write_bool $N
|
||||
write_bool() {
|
||||
[ "$2" == 0 ] && writeToConfig "# $1;" || writeToConfig " $1;"
|
||||
}
|
||||
|
||||
|
||||
# Function: get $1 $2
|
||||
# $1 string. $2 string
|
||||
# This function uses the external UCI function "config_get $result $section $option" to obtain a string value from UCI config file.
|
||||
# To use this function, use the same name of the UCI option for the variable.
|
||||
# Example: UCI (option id 'abcd'); local id; get id $section
|
||||
get() {
|
||||
config_get $1 $2 $1
|
||||
}
|
||||
|
||||
|
||||
# Function: get_a_bool $1 $2
|
||||
# $1 boolean. $2 string
|
||||
# This function uses the external UCI function "config_get_bool $result $section $option" to obtain a boolean value from UCI config file.
|
||||
# To use this function, use the same name of the UCI option for the variable $1.
|
||||
# Example: UCI (option use_ipv6 '1'); local use_ipv6; get use_ipv6 $section
|
||||
# Note: this function was originally called get_bool(), but it collided with
|
||||
# the get_bool() function provided by /lib/functions.sh. Read more at
|
||||
# https://github.com/openwrt/routing/issues/920.
|
||||
get_a_bool() {
|
||||
config_get_bool $1 $2 $1
|
||||
}
|
||||
|
||||
|
||||
# Function: multipath_list $1
|
||||
# $1 string
|
||||
# This function writes the $1 string in the multipath routes.
|
||||
multipath_list() {
|
||||
write " via $1" $1
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_tables $1
|
||||
# $1 string
|
||||
# This function gets each "table" section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI table section
|
||||
prepare_tables() {
|
||||
local section="$1"; local name
|
||||
|
||||
get name ${section}
|
||||
|
||||
write "table ${name};" ${name}
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_global $1
|
||||
# $1 string
|
||||
# This function gets each "global" section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI global section. prepare_global is the first configuration set in the bird6.conf and removes the old file.
|
||||
prepare_global () {
|
||||
local section="$1"
|
||||
local log_file; local log; local debug; local router_id; local table
|
||||
local listen_bgp_addr; local listen_bgp_port; local listen_bgp_dual
|
||||
|
||||
# Remove old configuration file
|
||||
rm -f "${BIRD_CONFIG}"
|
||||
|
||||
get log_file ${section}
|
||||
get log ${section}
|
||||
get debug ${section}
|
||||
get router_id ${section}
|
||||
get table ${section}
|
||||
get listen_bgp_addr ${section}
|
||||
get listen_bgp_port ${section}
|
||||
get listen_bgp_dual ${section}
|
||||
|
||||
# First line of the NEW configuration file
|
||||
echo "#Bird6 configuration using UCI:" > ${BIRD_CONFIG}
|
||||
writeToConfig " "
|
||||
#TODO: Set Syslog as receiver if empty
|
||||
# LOGF="${log_file:-syslog]}"
|
||||
#TODO: If $log/$debug are empty, set to off
|
||||
if [ -n "${log_file}" -a -n "${log}" ]; then
|
||||
firstEntry="${log:0:3}"
|
||||
if [ "${firstEntry}" = "all" -o "${firstEntry}" = "off" ]; then
|
||||
writeToConfig 'log "'${log_file}'" '${firstEntry}';'
|
||||
else
|
||||
logEntries=$(echo ${log} | tr " " ",")
|
||||
writeToConfig "log \"${log_file}\" { ${logEntries} };"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "${debug}" ]; then
|
||||
firstEntry="${debug:0:3}"
|
||||
if [ "${firstEntry}" = "all" -o "${firstEntry}" = "off" ]; then
|
||||
writeToConfig "debug protocols ${firstEntry};"
|
||||
else
|
||||
debugEntries=$(echo ${debug} | tr " " ",")
|
||||
writeToConfig "debug protocols { ${debugEntries} };"
|
||||
fi
|
||||
fi
|
||||
writeToConfig " "
|
||||
writeToConfig "#Router ID"
|
||||
write "router id ${router_id};" ${router_id}
|
||||
writeToConfig " "
|
||||
writeToConfig "#Secondary tables"
|
||||
config_foreach prepare_tables 'table'
|
||||
if [ -n "${listen_bgp_dual}" -o "${listen_bgp_dual}" = "0" ]; then
|
||||
writeToConfig "listen bgp ${listen_bgp_addr} ${listen_bgp_port} v6only;"
|
||||
else
|
||||
writeToConfig "listen bgp ${listen_bgp_addr} ${listen_bgp_port} dual;"
|
||||
fi
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_routes $1
|
||||
# $1 string
|
||||
# This function gets each "route" section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI route section. Each type of route has its own treatment.
|
||||
prepare_routes() {
|
||||
local instance; local prefix; local via; local type
|
||||
local section="$1"
|
||||
local protoInstance="$2"
|
||||
|
||||
get instance ${section}
|
||||
get type ${section}
|
||||
get prefix ${section}
|
||||
|
||||
if [ "${instance}" = "${protoInstance}" ]; then
|
||||
case "${type}" in
|
||||
"router")
|
||||
get via ${section}
|
||||
[ -n "${prefix}" -a -n "${via}" ] && writeToConfig " route ${prefix} via ${via};"
|
||||
;;
|
||||
"special")
|
||||
get attribute ${section}
|
||||
[ -n "${prefix}" -a -n "${attribute}" ] && writeToConfig " route ${prefix} ${attribute};"
|
||||
;;
|
||||
"iface")
|
||||
get iface ${section}
|
||||
[ -n "${prefix}" -a -n "${iface}" ] && writeToConfig ' route '${prefix}' via "'${iface}'";'
|
||||
;;
|
||||
"multipath")
|
||||
write " route ${prefix} multipath" ${prefix}
|
||||
config_list_foreach ${section} l_via multipath_list
|
||||
writeToConfig " ;"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_kernel $1
|
||||
# $1 string
|
||||
# This function gets each "kernel" protocol section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI kernel section.
|
||||
prepare_kernel() {
|
||||
local section="$1"
|
||||
local disabled; local table; local kernel_table; local import; local export
|
||||
local scan_time; local persist; local learn
|
||||
|
||||
get_a_bool disabled ${section}
|
||||
get table ${section}
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
get scan_time ${section}
|
||||
get kernel_table ${section}
|
||||
get learn ${section}
|
||||
get persist ${section}
|
||||
|
||||
write "#${section} configuration:" ${section}
|
||||
writeToConfig "protocol kernel ${section} {" ${section}
|
||||
write_bool disabled ${disabled}
|
||||
write " table ${table};" ${table}
|
||||
write " kernel table ${kernel_table};" ${kernel_table}
|
||||
write_bool learn ${learn}
|
||||
write_bool persist ${persist}
|
||||
write " scan time ${scan_time};" ${scan_time}
|
||||
write " import ${import};" ${import}
|
||||
write " export ${export};" ${export}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_static $1
|
||||
# $1 string
|
||||
# This function gets each "static" protocol section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI static section.
|
||||
prepare_static() {
|
||||
local section="$1"
|
||||
local disabled; local table
|
||||
|
||||
get disabled ${section}
|
||||
get table ${section}
|
||||
|
||||
if [ "${disabled}" -eq 0 ]; then
|
||||
writeToConfig "#${section} configration:" ${section}
|
||||
writeToConfig "protocol static {"
|
||||
write " table ${table};" ${table}
|
||||
config_foreach prepare_routes 'route' ${section}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_direct $1
|
||||
# $1 string
|
||||
# This function gets each "direct" protocol section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI direct section.
|
||||
prepare_direct() {
|
||||
local section="$1"
|
||||
local disabled; local interface
|
||||
|
||||
get disabled ${section}
|
||||
get interface ${section}
|
||||
|
||||
write "#${section} configuration:" ${section}
|
||||
writeToConfig "protocol direct {"
|
||||
write_bool disabled ${disabled}
|
||||
write " interface ${interface};" ${interface}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_pipe $1
|
||||
# $1 string
|
||||
# This function gets each "pipe" protocol section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI direct section.
|
||||
prepare_pipe() {
|
||||
local section="$1"
|
||||
local disabled; local table; local peer_table; local mode; local import; local export
|
||||
|
||||
get disabled ${section}
|
||||
get peer_table ${section}
|
||||
get mode ${section}
|
||||
get table ${section}
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
|
||||
write "#${section} configuration:" ${section}
|
||||
writeToConfig "protocol pipe ${section} {" ${section}
|
||||
write_bool disabled ${disabled}
|
||||
write " table ${table};" ${table}
|
||||
write " peer table ${peer_table};" ${peer_table}
|
||||
write " mode ${mode};" ${mode}
|
||||
write " import ${import};" ${import}
|
||||
write " export ${export};" ${export}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_device $1
|
||||
# $1 string
|
||||
# This function gets each "device" protocol section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI device section.
|
||||
prepare_device() {
|
||||
local section="$1"
|
||||
local disabled; local scan_time
|
||||
|
||||
get disabled ${section}
|
||||
get scan_time ${section}
|
||||
|
||||
write "#${section} configuration:" ${section}
|
||||
writeToConfig "protocol device {"
|
||||
write_bool disabled ${disabled}
|
||||
write " scan time ${scan_time};" ${scan_time}
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_bgp_template $1
|
||||
# $1 string
|
||||
# This function gets each "bgp_template" protocol section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI bgp_template section.
|
||||
# Careful! Template options will be replaced by "instance" options if there is any match.
|
||||
prepare_bgp_template() {
|
||||
local section="$1"
|
||||
local disabled; local table; local import; local export; local local_address
|
||||
local local_as; local neighbor_address; local neighbor_as; local source_address
|
||||
local next_hop_self; local next_hop_keep; local rr_client; local rr_cluster_id
|
||||
local import_limit; local import_limit_action; local export_limit; local export_limit_action
|
||||
local receive_limit; local receive_limit_action; local igp_table
|
||||
|
||||
get_a_bool disabled ${section}
|
||||
get_a_bool next_hop_self ${section}
|
||||
get_a_bool next_hop_keep ${section}
|
||||
get table ${section}
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
get local_address ${section}
|
||||
get local_as ${section}
|
||||
get igp_table ${section}
|
||||
get rr_client ${section}
|
||||
get rr_cluster_id ${section}
|
||||
get import_limit ${section}
|
||||
get import_limit_action ${section}
|
||||
get export_limit ${section}
|
||||
get export_limit_action ${section}
|
||||
get receive_limit ${section}
|
||||
get receive_limit_action ${section}
|
||||
get neighbor_address ${section}
|
||||
get neighbor_as ${section}
|
||||
|
||||
writeToConfig "#${section} template:"
|
||||
writeToConfig "template bgp ${section} {"
|
||||
[ -n "${disabled}" ] && write_bool disabled ${disabled}
|
||||
write " table ${table};" ${table}
|
||||
write " local as ${local_as};" ${local_as}
|
||||
write " source address ${local_address};" ${local_address}
|
||||
write " import ${import};" ${import}
|
||||
write " export ${export};" ${export}
|
||||
if [ -n "${next_hop_self}" ]; then
|
||||
[ "${next_hop_self}" = "1" ] && writeToConfig " next hop self;" || writeToConfig "# next hop self;"
|
||||
fi
|
||||
if [ -n "${next_hop_keep}" ]; then
|
||||
[ "${next_hop_keep}" = "1" ] && writeToConfig " next hop keep;" || writeToConfig "# next hop keep;"
|
||||
fi
|
||||
[ -n "${igp_table}" ] && writeToConfig " igp table ${igp_table};"
|
||||
[ "${rr_client}" = "1" ] && writeToConfig " rr client;" || writeToConfig "# rr client;"
|
||||
write " rr cluster id ${rr_cluster_id};" ${rr_cluster_id}
|
||||
if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
|
||||
[ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
|
||||
writeToConfig " import limit ${import_limit} action ${import_limit_action};"
|
||||
fi
|
||||
if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
|
||||
[ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
|
||||
writeToConfig " export limit ${export_limit} action ${export_limit_action};"
|
||||
fi
|
||||
if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
|
||||
[ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
|
||||
writeToConfig " receive limit ${receive_limit} action ${receive_limit_action};"
|
||||
fi
|
||||
[ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig " neighbor ${neighbor_address} as ${neighbor_as};"
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_bgp $1
|
||||
# $1 string
|
||||
# This function gets each "bgp" protocol section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI bgp section.
|
||||
# Careful! The options set in bgp instances overlap bgp_template ones.
|
||||
prepare_bgp() {
|
||||
local section="$1"
|
||||
local disabled; local table; local template; local description; local import
|
||||
local export; local local_address; local local_as; local neighbor_address
|
||||
local neighbor_as; local rr_client; local rr_cluster_id; local import_limit
|
||||
local import_limit_action; local export_limit; local export_limit_action
|
||||
local receive_limit; local receive_limit_action; local igp_table
|
||||
|
||||
get disabled ${section}
|
||||
get table ${section}
|
||||
get template ${section}
|
||||
get description ${section}
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
get local_address ${section}
|
||||
get local_as ${section}
|
||||
get igp_table ${section}
|
||||
get rr_client ${section}
|
||||
get rr_cluster_id ${section}
|
||||
get import_limit ${section}
|
||||
get import_limit_action ${section}
|
||||
get export_limit ${section}
|
||||
get export_limit_action ${section}
|
||||
get receive_limit ${section}
|
||||
get receive_limit_action ${section}
|
||||
get neighbor_address ${section}
|
||||
get neighbor_as ${section}
|
||||
|
||||
writeToConfig "#${section} configuration:"
|
||||
[ -n "${template}" ] && writeToConfig "protocol bgp ${section} from ${template} {" || writeToConfig "protocol bgp ${section} {"
|
||||
[ -n "${disabled}" ] && write_bool disabled ${disabled}
|
||||
write " table ${table};" ${table}
|
||||
write " local as ${local_as};" ${local_as}
|
||||
write " source address ${local_address};" ${local_address}
|
||||
write " import ${import};" ${import}
|
||||
write " export ${export};" ${export}
|
||||
if [ -n "${next_hop_self}" ]; then
|
||||
[ "${next_hop_self}" = "1" ] && writeToConfig " next hop self;" || writeToConfig "# next hop self;"
|
||||
fi
|
||||
if [ -n "${next_hop_keep}" ]; then
|
||||
[ "${next_hop_keep}" = "1" ] && writeToConfig " next hop keep;" || writeToConfig "# next hop keep;"
|
||||
fi
|
||||
[ -n "${igp_table}" ] && writeToConfig " igp table ${igp_table};"
|
||||
[ "${rr_client}" = "1" ] && writeToConfig " rr client;" || writeToConfig "# rr client;"
|
||||
write " rr cluster id ${rr_cluster_id};" ${rr_cluster_id}
|
||||
if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
|
||||
[ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
|
||||
writeToConfig " import limit ${import_limit} action ${import_limit_action};"
|
||||
fi
|
||||
if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
|
||||
[ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
|
||||
writeToConfig " export limit ${export_limit} action ${export_limit_action};"
|
||||
fi
|
||||
if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
|
||||
[ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
|
||||
writeToConfig " receive limit ${receive_limit} action ${receive_limit_action};"
|
||||
fi
|
||||
[ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig " neighbor ${neighbor_address} as ${neighbor_as};"
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: gather_filters
|
||||
# This function gets all the FILES under /filters folder and adds
|
||||
# them into the config as %include elements on top of the file
|
||||
# If there are no filters, the section will remain empty.
|
||||
gather_filters() {
|
||||
writeToConfig "#Filters Section:"
|
||||
for filter in $(find /etc/${BIRD}/filters -type f); do
|
||||
writeToConfig "include \"${filter}\";"
|
||||
done
|
||||
writeToConfig "#End of Filters --"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: gather_functions
|
||||
# This function gets all the FILES under /functions folder and adds
|
||||
# them into the config as %include elements on top of the file
|
||||
# If there are no filters, the section will remain empty.
|
||||
gather_functions() {
|
||||
writeToConfig "#Functions Section:"
|
||||
for func in $(find /etc/${BIRD}/functions -type f); do
|
||||
writeToConfig "include \"${func}\";"
|
||||
done
|
||||
writeToConfig "#End of Functions --"
|
||||
writeToConfig " "
|
||||
}
|
|
@ -1,286 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
-- Repeated Strings
|
||||
local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
|
||||
local imp_string = "Set if the protocol must import routes.<br />" .. common_string
|
||||
local exp_string = "Set if the protocol must export routes.<br />" .. common_string
|
||||
|
||||
m=Map("bird6", "Bird6 BGP protocol's configuration")
|
||||
|
||||
tab_templates = {}
|
||||
uci:foreach('bird6', 'bgp_template', function (s)
|
||||
local name = s[".name"]
|
||||
if (name ~= nil) then
|
||||
table.insert(tab_templates, name)
|
||||
end
|
||||
end)
|
||||
|
||||
--
|
||||
-- BGP TEMPLATES
|
||||
--
|
||||
sect_templates = m:section(TypedSection, "bgp_template", "BGP Templates", "Configuration of the templates used in BGP instances.")
|
||||
sect_templates.addremove = true
|
||||
sect_templates.anonymous = false
|
||||
|
||||
disabled = sect_templates:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
|
||||
disabled.optional=true
|
||||
|
||||
description = sect_templates:option(TextValue, "description", "Description", "Description of the current BGP instance")
|
||||
description.optional = true
|
||||
|
||||
table = sect_templates:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
|
||||
table.optional=true
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
igp_table = sect_templates:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
|
||||
igp_table.optional = true
|
||||
uci:foreach("bird6", "table",
|
||||
function(s)
|
||||
igp_table:value(s.name)
|
||||
end)
|
||||
igp_table:value("")
|
||||
igp_table.default = ""
|
||||
|
||||
import = sect_templates:option(Value, "import", "Import", imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_templates:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
source_addr = sect_templates:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
|
||||
source_addr.optional = true
|
||||
|
||||
local_address = sect_templates:option(Value, "local_address", "Local BGP address", "")
|
||||
local_address.optional = false
|
||||
|
||||
local_as = sect_templates:option(Value, "local_as", "Local AS", "")
|
||||
local_as.optional = false
|
||||
|
||||
next_hop_self = sect_templates:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
|
||||
next_hop_self.default = nil
|
||||
next_hop_self.optional = true
|
||||
|
||||
next_hop_keep = sect_templates:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
|
||||
next_hop_keep.default = nil
|
||||
next_hop_keep.optional = true
|
||||
|
||||
rr_client = sect_templates:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
|
||||
rr_client.default = nil
|
||||
rr_client.optional = true
|
||||
|
||||
rr_cluster_id = sect_templates:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
|
||||
rr_cluster_id.optional = true
|
||||
|
||||
import_trigger = sect_templates:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
|
||||
import_trigger.default = 0
|
||||
import_trigger.rmempty = false
|
||||
import_trigger.optional = false
|
||||
|
||||
import_limit = sect_templates:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
|
||||
import_limit:depends({import_trigger = "1"})
|
||||
import_limit.rmempty = true
|
||||
|
||||
import_limit_action = sect_templates:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
|
||||
import_limit_action:depends({import_trigger = "1"})
|
||||
import_limit_action:value("warn")
|
||||
import_limit_action:value("block")
|
||||
import_limit_action:value("disable")
|
||||
import_limit_action:value("restart")
|
||||
import_limit_action.default = "warn"
|
||||
import_limit_action.rmempty = true
|
||||
|
||||
export_trigger = sect_templates:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
|
||||
export_trigger.default = 0
|
||||
export_trigger.rmempty = false
|
||||
export_trigger.optional = false
|
||||
|
||||
export_limit = sect_templates:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
|
||||
export_limit:depends({export_trigger = "1"})
|
||||
export_limit.rmempty = true
|
||||
|
||||
export_limit_action = sect_templates:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
|
||||
export_limit_action:depends({export_trigger = "1"})
|
||||
export_limit_action.rmempty = true
|
||||
export_limit_action:value("warn")
|
||||
export_limit_action:value("block")
|
||||
export_limit_action:value("disable")
|
||||
export_limit_action:value("restart")
|
||||
export_limit_action.default = "warn"
|
||||
|
||||
receive_trigger = sect_templates:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
|
||||
receive_trigger.default = 0
|
||||
receive_trigger.rmempty = false
|
||||
receive_trigger.optional = false
|
||||
|
||||
receive_limit = sect_templates:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
|
||||
receive_limit:depends({receive_trigger = "1"})
|
||||
receive_limit.rmempty = true
|
||||
|
||||
receive_limit_action = sect_templates:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
|
||||
receive_limit_action:depends({receive_trigger = "1"})
|
||||
receive_limit_action:value("warn")
|
||||
receive_limit_action:value("block")
|
||||
receive_limit_action:value("disable")
|
||||
receive_limit_action:value("restart")
|
||||
receive_limit_action.default = "warn"
|
||||
receive_limit_action.rmempty= true
|
||||
|
||||
--
|
||||
-- BGP INSTANCES
|
||||
--
|
||||
sect_instances = m:section(TypedSection, "bgp", "BGP Instances", "Configuration of the BGP protocol instances")
|
||||
sect_instances.addremove = true
|
||||
sect_instances.anonymous = false
|
||||
|
||||
templates = sect_instances:option(ListValue, "template", "Templates", "Available BGP templates")
|
||||
uci:foreach("bird6", "bgp_template",
|
||||
function(s)
|
||||
templates:value(s[".name"])
|
||||
end)
|
||||
templates:value("")
|
||||
|
||||
disabled = sect_instances:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
|
||||
disabled.optional = false
|
||||
disabled.rmempty = false
|
||||
disabled.default = nil
|
||||
|
||||
description = sect_instances:option(TextValue, "description", "Description", "Description of the current BGP instance")
|
||||
description.optional = true
|
||||
|
||||
table = sect_instances:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
|
||||
table.optional=true
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
igp_table = sect_instances:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
|
||||
igp_table.optional = true
|
||||
uci:foreach("bird6", "table",
|
||||
function(s)
|
||||
igp_table:value(s.name)
|
||||
end)
|
||||
igp_table:value("")
|
||||
igp_table.default = ""
|
||||
|
||||
import = sect_instances:option(Value, "import", "Import", imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_instances:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
source_address = sect_instances:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
|
||||
source_address.optional = true
|
||||
|
||||
local_address = sect_instances:option(Value, "local_address", "Local BGP address", "")
|
||||
local_address.optional=true
|
||||
|
||||
local_as = sect_instances:option(Value, "local_as", "Local AS", "")
|
||||
local_as.optional=true
|
||||
|
||||
neighbor_address = sect_instances:option(Value, "neighbor_address", "Neighbor IP Address", "")
|
||||
neighbor_address.optional = false
|
||||
|
||||
neighbor_as = sect_instances:option(Value, "neighbor_as", "Neighbor AS", "")
|
||||
neighbor_as.optional = false
|
||||
|
||||
next_hop_self = sect_instances:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
|
||||
next_hop_self.default = nil
|
||||
next_hop_self.optional = true
|
||||
|
||||
next_hop_keep = sect_instances:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
|
||||
next_hop_keep.default = nil
|
||||
next_hop_keep.optional = true
|
||||
|
||||
rr_client = sect_instances:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
|
||||
rr_client.default = nil
|
||||
rr_client.optional = true
|
||||
|
||||
rr_cluster_id = sect_instances:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
|
||||
rr_cluster_id.optional = true
|
||||
|
||||
import_trigger = sect_instances:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
|
||||
import_trigger.default = 0
|
||||
import_trigger.rmempty = false
|
||||
import_trigger.optional = false
|
||||
|
||||
import_limit = sect_instances:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
|
||||
import_limit:depends({import_trigger = "1"})
|
||||
import_limit.rmempty = true
|
||||
|
||||
import_limit_action = sect_instances:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
|
||||
import_limit_action:depends({import_trigger = "1"})
|
||||
import_limit_action:value("warn")
|
||||
import_limit_action:value("block")
|
||||
import_limit_action:value("disable")
|
||||
import_limit_action:value("restart")
|
||||
import_limit_action.default = "warn"
|
||||
import_limit_action.rmempty = true
|
||||
|
||||
export_trigger = sect_instances:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
|
||||
export_trigger.default = 0
|
||||
export_trigger.rmempty = false
|
||||
export_trigger.optional = false
|
||||
|
||||
export_limit = sect_instances:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
|
||||
export_limit:depends({export_trigger = "1"})
|
||||
export_limit.rmempty = true
|
||||
|
||||
export_limit_action = sect_instances:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
|
||||
export_limit_action:depends({export_trigger = "1"})
|
||||
export_limit_action.rmempty = true
|
||||
export_limit_action:value("warn")
|
||||
export_limit_action:value("block")
|
||||
export_limit_action:value("disable")
|
||||
export_limit_action:value("restart")
|
||||
export_limit_action.default = "warn"
|
||||
|
||||
receive_trigger = sect_instances:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
|
||||
receive_trigger.default = 0
|
||||
receive_trigger.rmempty = false
|
||||
receive_trigger.optional = false
|
||||
|
||||
receive_limit = sect_instances:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
|
||||
receive_limit:depends({receive_trigger = "1"})
|
||||
receive_limit.rmempty = true
|
||||
|
||||
receive_limit_action = sect_instances:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
|
||||
receive_limit_action:depends({receive_trigger = "1"})
|
||||
receive_limit_action:value("warn")
|
||||
receive_limit_action:value("block")
|
||||
receive_limit_action:value("disable")
|
||||
receive_limit_action:value("restart")
|
||||
receive_limit_action.default = "warn"
|
||||
receive_limit_action.rmempty= true
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird6 restart')
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,77 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local filters_dir = "/etc/bird6/filters/"
|
||||
local lock_file = "/etc/bird6/filter_lock"
|
||||
|
||||
m = SimpleForm("bird6", "Bird6 Filters", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
files = s:option(ListValue, "Files", "Filter Files:")
|
||||
local new_filter = filters_dir .. os.date("filter-%Y%m%d-%H%M")
|
||||
|
||||
-- New File Entry
|
||||
files:value(new_filter, "New File (".. new_filter .. ")")
|
||||
files.default = new_filter
|
||||
|
||||
local i, file_list = 0, { }
|
||||
for filename in io.popen("find " .. filters_dir .. " -type f"):lines() do
|
||||
i = i + 1
|
||||
files:value(filename, filename)
|
||||
end
|
||||
|
||||
ld = s:option(Button, "_load", "Load File")
|
||||
ld.inputstyle = "reload"
|
||||
|
||||
st_file = s:option(DummyValue, "_stfile", "Editing file:")
|
||||
function st_file.cfgvalue(self, section)
|
||||
if ld:formvalue(section) then
|
||||
fs.writefile(lock_file, files:formvalue(section))
|
||||
return files:formvalue(section)
|
||||
else
|
||||
fs.writefile(lock_file, "")
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
area = s:option(Value, "_filters")
|
||||
area.template = "bird6/tvalue"
|
||||
area.rows = 30
|
||||
function area.cfgvalue(self,section)
|
||||
if ld:formvalue(section) then
|
||||
local contents = fs.readfile(files:formvalue(section))
|
||||
if contents then
|
||||
return contents
|
||||
else
|
||||
return ""
|
||||
end
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function area.write(self, section)
|
||||
local locked_file = fs.readfile(lock_file)
|
||||
if locked_file and not ld:formvalue(section) then
|
||||
local text = self:formvalue(section):gsub("\r\n?", "\n")
|
||||
fs.writefile(locked_file, text)
|
||||
fs.writefile(lock_file, "")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,77 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local functions_dir = "/etc/bird6/functions/"
|
||||
local lock_file = "/etc/bird6/function_lock"
|
||||
|
||||
m = SimpleForm("bird6", "Bird6 Functions", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
files = s:option(ListValue, "Files", "Function Files:")
|
||||
local new_function = functions_dir .. os.date("function-%Y%m%d-%H%M")
|
||||
|
||||
-- New File Entry
|
||||
files:value(new_function, "New File (".. new_function .. ")")
|
||||
files.default = new_function
|
||||
|
||||
local i, file_list = 0, { }
|
||||
for filename in io.popen("find " .. functions_dir .. " -type f"):lines() do
|
||||
i = i + 1
|
||||
files:value(filename, filename)
|
||||
end
|
||||
|
||||
ld = s:option(Button, "_load", "Load File")
|
||||
ld.inputstyle = "reload"
|
||||
|
||||
st_file = s:option(DummyValue, "_stfile", "Editing file:")
|
||||
function st_file.cfgvalue(self, section)
|
||||
if ld:formvalue(section) then
|
||||
fs.writefile(lock_file, files:formvalue(section))
|
||||
return files:formvalue(section)
|
||||
else
|
||||
fs.writefile(lock_file, "")
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
area = s:option(Value, "_functions")
|
||||
area.template = "bird6/tvalue"
|
||||
area.rows = 30
|
||||
function area.cfgvalue(self,section)
|
||||
if ld:formvalue(section) then
|
||||
local contents = fs.readfile(files:formvalue(section))
|
||||
if contents then
|
||||
return contents
|
||||
else
|
||||
return ""
|
||||
end
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function area.write(self, section)
|
||||
local locked_file = fs.readfile(lock_file)
|
||||
if locked_file and not ld:formvalue(section) then
|
||||
local text = self:formvalue(section):gsub("\r\n?", "\n")
|
||||
fs.writefile(locked_file, text)
|
||||
fs.writefile(lock_file, "")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,266 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
-- Repeated Strings
|
||||
local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
|
||||
local imp_string = "Set if the protocol must import routes.<br />" .. common_string
|
||||
local exp_string = "Set if the protocol must export routes.<br />" .. common_string
|
||||
|
||||
m=Map("bird6", "Bird6 general protocol's configuration.")
|
||||
|
||||
-- Optional parameters lists
|
||||
local protoptions = {
|
||||
{["name"]="table", ["help"]="Auxiliar table for routing", ["depends"]={"static","kernel"}},
|
||||
{["name"]="import", ["help"]=imp_string, ["depends"]={"kernel"}},
|
||||
{["name"]="export", ["help"]=exp_string, ["depends"]={"kernel"}},
|
||||
{["name"]="scan_time", ["help"]="Time between scans", ["depends"]={"kernel","device"}},
|
||||
{["name"]="kernel_table", ["help"]="Set which table must be used as auxiliar kernel table", ["depends"]={"kernel"}},
|
||||
{["name"]="learn", ["help"]="Learn routes", ["depends"]={"kernel"}},
|
||||
{["name"]="persist", ["help"]="Store routes. After a restart, routes willstill be configured", ["depends"]={"kernel"}}
|
||||
}
|
||||
|
||||
local routeroptions = {
|
||||
{["name"]="prefix",["help"]="",["depends"]={"router","special","iface","multipath","recursive"}},
|
||||
{["name"]="via",["help"]="",["depends"]={"router","multipath"}},
|
||||
{["name"]="attribute",["help"]="",["depends"]={"special"}},
|
||||
{["name"]="iface",["help"]="",["depends"]={"iface"}},
|
||||
{["name"]="ip",["help"]="",["depends"]={"recursive"}}
|
||||
}
|
||||
|
||||
--
|
||||
-- KERNEL PROTOCOL
|
||||
--
|
||||
|
||||
sect_kernel_protos = m:section(TypedSection, "kernel", "Kernel options", "Configuration of the kernel protocols. First Instance MUST be Primary table (no table or kernel_table fields).")
|
||||
sect_kernel_protos.addremove = true
|
||||
sect_kernel_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
|
||||
disabled = sect_kernel_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "kernel" then
|
||||
if o.name == "learn" or o.name == "persist" then
|
||||
value = sect_kernel_protos:option(Flag, o.name, translate(o.name), translate(o.help))
|
||||
elseif o.name == "table" then
|
||||
value = sect_kernel_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
value:value(s.name)
|
||||
end)
|
||||
value:value("")
|
||||
value.default = ""
|
||||
else
|
||||
value = sect_kernel_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
end
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- DEVICE PROTOCOL
|
||||
--
|
||||
|
||||
sect_device_protos = m:section(TypedSection, "device", "Device options", "Configuration of the device protocols.")
|
||||
sect_device_protos.addremove = true
|
||||
sect_device_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
|
||||
disabled = sect_device_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "device" then
|
||||
value = sect_device_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- STATIC PROTOCOL
|
||||
--
|
||||
|
||||
sect_static_protos = m:section(TypedSection, "static", "Static options", "Configuration of the static protocols.")
|
||||
sect_static_protos.addremove = true
|
||||
sect_static_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
|
||||
disabled = sect_static_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "static" then
|
||||
if o.name == "table" then
|
||||
value = sect_static_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
value:value(s.name)
|
||||
end)
|
||||
value:value("")
|
||||
value.default = ""
|
||||
else
|
||||
value = sect_static_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
end
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- PIPE PROTOCOL
|
||||
--
|
||||
sect_pipe_protos = m:section(TypedSection, "pipe", "Pipe options", "Configuration of the Pipe protocols.")
|
||||
sect_pipe_protos.addremove = true
|
||||
sect_pipe_protos.anonymous = false
|
||||
|
||||
-- Default Pipe parameters
|
||||
disabled = sect_pipe_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
|
||||
disabled.default=0
|
||||
|
||||
table = sect_pipe_protos:option(ListValue, "table", "Table", "Select the Primary Table to connect.")
|
||||
table.optional = false
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
peer_table = sect_pipe_protos:option(ListValue, "peer_table", "Peer Table", "Select the Secondary Table to connect.")
|
||||
table.optional = false
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
peer_table:value(s.name)
|
||||
end)
|
||||
peer_table:value("")
|
||||
peer_table.default = ""
|
||||
|
||||
mode = sect_pipe_protos:option(ListValue, "mode", "Mode", "Select <b>transparent</b> to retransmit all routes and their attributes<br />Select <b>opaque</b> to retransmit optimal routes (similar to what other protocols do)")
|
||||
mode.optional = false
|
||||
mode:value("transparent")
|
||||
mode:value("opaque")
|
||||
mode.default = "transparent"
|
||||
|
||||
import = sect_pipe_protos:option(Value, "import", "Import",imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_pipe_protos:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
|
||||
--
|
||||
-- DIRECT PROTOCOL
|
||||
--
|
||||
sect_direct_protos = m:section(TypedSection, "direct", "Direct options", "Configuration of the Direct protocols.")
|
||||
sect_direct_protos.addremove = true
|
||||
sect_direct_protos.anonymous = false
|
||||
|
||||
-- Default Direct parameters
|
||||
disabled = sect_direct_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
|
||||
disabled.optional = false
|
||||
disabled.default = 0
|
||||
|
||||
interface = sect_direct_protos:option(Value, "interface", "Interfaces", "By default Direct will generate device routes for all the interfaces. To restrict this behaviour, select a number of patterns to match your desired interfaces:" .. "<br />" .. "1. All the strings <b>MUST</b> be quoted: \"pattern\"" .. "<br />" .. "2. Use * (star) to match patterns: \"eth*\" (<b>include</b> all eth... interfaces)" .. "<br />" .. "3. You can add \"-\" (minus) to exclude patterns: \"-em*\" (<b>exclude</b> all em... interfaces)." .. "<br />" .. "4. Separate several patterns using , (coma): \"-em*\", \"eth*\" (<b>exclude</b> em... and <b>include</b> all eth... interfaces).")
|
||||
interface.optional = false
|
||||
interface.default = "\"*\""
|
||||
|
||||
|
||||
--
|
||||
-- ROUTES FOR STATIC PROTOCOL
|
||||
--
|
||||
sect_routes = m:section(TypedSection, "route", "Routes configuration", "Configuration of the routes used in static protocols.")
|
||||
sect_routes.addremove = true
|
||||
sect_routes.anonymous = true
|
||||
|
||||
instance = sect_routes:option(ListValue, "instance", "Route instance", "")
|
||||
i = 0
|
||||
|
||||
uci:foreach("bird6", "static",
|
||||
function (s)
|
||||
instance:value(s[".name"])
|
||||
end)
|
||||
|
||||
prefix = sect_routes:option(Value, "prefix", "Route prefix", "")
|
||||
prefix.datatype = "ip6prefix"
|
||||
|
||||
type = sect_routes:option(ListValue, "type", "Type of route", "")
|
||||
type:value("router")
|
||||
type:value("special")
|
||||
type:value("iface")
|
||||
type:value("recursive")
|
||||
type:value("multipath")
|
||||
|
||||
valueVia = sect_routes:option(Value, "via", "Via", "")
|
||||
valueVia.optional = false
|
||||
valueVia:depends("type", "router")
|
||||
valueVia.datatype = "ip6addr"
|
||||
|
||||
listVia = sect_routes:option(DynamicList, "l_via", "Via", "")
|
||||
listVia:depends("type", "multipath")
|
||||
listVia.optional=false
|
||||
listVia.datatype = "ip6addr"
|
||||
|
||||
attribute = sect_routes:option(Value, "attribute", "Attribute", "Types are: unreachable, prohibit and blackhole")
|
||||
attribute:depends("type", "special")
|
||||
|
||||
iface = sect_routes:option(ListValue, "iface", "Interface", "")
|
||||
iface:depends("type", "iface")
|
||||
|
||||
uci:foreach("network", "interface",
|
||||
function(section)
|
||||
if section[".name"] ~= "loopback" then
|
||||
iface:value(section[".name"])
|
||||
end
|
||||
end)
|
||||
|
||||
ip = sect_routes:option(Value, "ip", "IP address", "")
|
||||
ip:depends("type", "ip")
|
||||
ip.datatype = [[ or"ip4addr", "ip6addr" ]]
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird6 restart')
|
||||
end
|
||||
|
||||
return m
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = require "luci.model.uci"
|
||||
local uciout = uci.cursor()
|
||||
|
||||
m=Map("bird6", "Bird6 UCI configuration helper", "")
|
||||
|
||||
-- Named section: "bird"
|
||||
|
||||
s_bird_uci = m:section(NamedSection, "bird", "bird", "Bird6 file settings", "")
|
||||
s_bird_uci.addremove = False
|
||||
|
||||
uuc = s_bird_uci:option(Flag, "use_UCI_config", "Use UCI configuration", "Use UCI configuration instead of the /etc/bird6.conf file")
|
||||
|
||||
ucf = s_bird_uci:option(Value, "UCI_config_file", "UCI File", "Specify the file to place the UCI-translated configuration")
|
||||
ucf.default = "/tmp/bird6.conf"
|
||||
|
||||
-- Named Section: "table"
|
||||
|
||||
s_bird_table = m:section(TypedSection, "table", "Tables configuration", "Configuration of the tables used in the protocols")
|
||||
s_bird_table.addremove = true
|
||||
s_bird_table.anonymous = true
|
||||
|
||||
name = s_bird_table:option(Value, "name", "Table name", "Descriptor ID of the table")
|
||||
|
||||
-- Named section: "global"
|
||||
|
||||
s_bird_global = m:section(NamedSection, "global", "global", "Global options", "Basic Bird6 settings")
|
||||
s_bird_global.addremove = False
|
||||
|
||||
id = s_bird_global:option(Value, "router_id", "Router ID", "Identification number of the router. By default, is the router's IP.")
|
||||
|
||||
lf = s_bird_global:option(Value, "log_file", "Log File", "File used to store log related data.")
|
||||
|
||||
l = s_bird_global:option(MultiValue, "log", "Log", "Set which elements do you want to log.")
|
||||
l:value("all", "All")
|
||||
l:value("info", "Info")
|
||||
l:value("warning","Warning")
|
||||
l:value("error","Error")
|
||||
l:value("fatal","Fatal")
|
||||
l:value("debug","Debug")
|
||||
l:value("trace","Trace")
|
||||
l:value("remote","Remote")
|
||||
l:value("auth","Auth")
|
||||
|
||||
d = s_bird_global:option(MultiValue, "debug", "Debug", "Set which elements do you want to debug.")
|
||||
d:value("all", "All")
|
||||
d:value("states","States")
|
||||
d:value("routes","Routes")
|
||||
d:value("filters","Filters")
|
||||
d:value("interfaces","Interfaces")
|
||||
d:value("events","Events")
|
||||
d:value("packets","Packets")
|
||||
|
||||
listen_addr = s_bird_global:option(Value, "listen_bgp_addr", "BGP Address", "Set the Addres that BGP will listen to.")
|
||||
listen_addr.optional = true
|
||||
|
||||
listen_port = s_bird_global:option(Value, "listen_bgp_port", "BGP Port", "Set the port that BGP will listen to.")
|
||||
listen_port.optional = true
|
||||
|
||||
listen_dual = s_bird_global:option(Flag, "listen_bgp_dual", "BGP Dual/ipv6", "Set if BGP connections will listen ipv6 only 'ipv6only' or both ipv4/6 'dual' routes")
|
||||
listen_dual.optional = true
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird6 restart')
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,53 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local sys = require "luci.sys"
|
||||
|
||||
m = SimpleForm("bird6", "Bird6 Daemon Status Page", "This page let you Start, Stop, Restart and check Bird6 Service Status.")
|
||||
m.reset = false
|
||||
m.submit = false
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
|
||||
start = s:option(Button, "_start", "Start Bird4 Daemon:")
|
||||
start.inputtitle = " Start "
|
||||
start.inputstyle = "apply"
|
||||
|
||||
stop = s:option(Button, "_stop", "Stop Bird4 Daemon:")
|
||||
stop.inputtitle = " Stop "
|
||||
stop.inputstyle = "remove"
|
||||
|
||||
restart = s:option(Button, "_restart", "Restart Bird4 Daemon:")
|
||||
restart.inputtitle = "Restart"
|
||||
restart.inputstyle = "reload"
|
||||
|
||||
output = s:option(DummyValue, "_value", "Service Status")
|
||||
function output.cfgvalue(self, section)
|
||||
local ret = ""
|
||||
if start:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird6 start_quiet")
|
||||
elseif stop:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird6 stop_quiet")
|
||||
elseif restart:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird6 restart_quiet")
|
||||
else
|
||||
ret = sys.exec("/etc/init.d/bird6 status_quiet")
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,33 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# This UCI-Defaults script will MOVE any pre-existing filter
|
||||
# stored in a file and configured as an UCI item (deprecated)
|
||||
# The script will try to match any "filter" Section, get its
|
||||
# "file_path" property and move the file (if exists) to the
|
||||
# new (v0.3+) default location: /etc/bird{4|6}/filters
|
||||
|
||||
[ $# -ne 1 ] && exit 1
|
||||
BIRD="$1"
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
# This function will move an existing folder configured on
|
||||
# Bird as a "filter" to filters' folder.
|
||||
mv_filter() {
|
||||
local section="$1"
|
||||
local file_path
|
||||
config_get file_path ${section} file_path
|
||||
|
||||
if [ -f ${file_path} ]; then
|
||||
mv ${file_path} /etc/${BIRD}/filters/
|
||||
fi
|
||||
uci delete ${BIRD}.${section}
|
||||
}
|
||||
|
||||
if [ -f /etc/config/${BIRD} ]; then
|
||||
config_load ${BIRD}
|
||||
config_foreach mv_filter 'filter'
|
||||
uci commit ${BIRD}
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -1,13 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ $# -ne 1 ] && exit 1
|
||||
|
||||
BIRD=$1
|
||||
|
||||
EXC=`mount -t overlayfs | grep overlayfs -c`
|
||||
|
||||
[ $EXC > 0 ] && rm -r /etc/init.d/${BIRD} || mv /etc/init.d/${BIRD} /etc/${BIRD}/init.d/${BIRD}.orig
|
||||
|
||||
ln -s /etc/${BIRD}/init.d/${BIRD} /etc/init.d/${BIRD}
|
||||
|
||||
exit 0
|
|
@ -1,41 +0,0 @@
|
|||
<%-
|
||||
-- Only populate textarea through XHR.poll
|
||||
-- "refresh" is present in the URL (.../log?refresh=1)
|
||||
if luci.http.formvalue("refresh") then
|
||||
|
||||
-- Force HTTP Contents to be "text/plain"
|
||||
luci.http.prepare_content("text/plain")
|
||||
|
||||
local sys = require("luci.sys")
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
|
||||
-- Get Log File from Bird's configuration or leave it empty.
|
||||
local log_file = uci:get("bird6", "global", "log_file") or ""
|
||||
local log_size = ""
|
||||
if log_file then
|
||||
log_size = sys.exec("du -h " .. log_file .. " | awk '{print $1}'")
|
||||
-- Gathering last 30 lines of the Log File.
|
||||
lf = sys.exec("tail -n30 " .. log_file):gsub("\r\n?", "\n")
|
||||
end
|
||||
|
||||
-- Write File used and its contents.
|
||||
luci.http.write("Using Log File: " .. log_file .. " - File Size: " .. log_size .. "\n" .. lf)
|
||||
|
||||
-- Avoid printing the rest of the page (return only text log data)
|
||||
return
|
||||
end
|
||||
-%>
|
||||
|
||||
<%+header%>
|
||||
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
// Refresh page each second. Use "refresh=1" as trigger.
|
||||
XHR.poll(1, '<%=url('admin/network/bird6/log')%>', { refresh: 1 }, function(xhrInstance) {
|
||||
var area = document.getElementById('log')
|
||||
area.value = xhrInstance.responseText;
|
||||
});
|
||||
//]]></script>
|
||||
|
||||
|
||||
<textarea readonly="readonly" style="width: 100%" wrap="on" rows="32" id="log"><%=lf:pcdata()%></textarea>
|
||||
<%+footer%>
|
|
@ -1,5 +0,0 @@
|
|||
<%+cbi/valueheader%>
|
||||
<textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 100%; font: normal 11pt 'Courier New'"<% else %> cols="<%=self.size%>"<% end %> data-update="change"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap") .. ifattr(self.readonly, "readonly") %>>
|
||||
<%-=pcdata(self:cfgvalue(section))-%>
|
||||
</textarea>
|
||||
<%+cbi/valuefooter%>
|
225
bird1/Makefile
225
bird1/Makefile
|
@ -1,225 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2009-2016 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bird1
|
||||
PKG_VERSION:=1.6.8
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird
|
||||
PKG_HASH:=6c61ab5d2ef59d2559a8735b8252b5a0238013b43e5fb8a96c5d9d06e7bc00b2
|
||||
PKG_BUILD_DEPENDS:=ncurses readline
|
||||
PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/bird-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/bird1/Default
|
||||
TITLE:=The BIRD Internet Routing Daemon (v1.6)
|
||||
URL:=https://bird.network.cz/
|
||||
DEPENDS:=+libpthread
|
||||
endef
|
||||
|
||||
define Package/bird1c/Default
|
||||
TITLE:=The BIRD command-line client (v1.6)
|
||||
URL:=https://bird.network.cz/
|
||||
DEPENDS:=+libreadline +libncurses
|
||||
endef
|
||||
|
||||
define Package/bird1cl/Default
|
||||
TITLE:=The BIRD lightweight command-line client (v1.6)
|
||||
URL:=https://bird.network.cz/
|
||||
endef
|
||||
|
||||
define Package/bird1/Default/description1
|
||||
BIRD is an internet routing daemon which manages TCP/IP routing tables
|
||||
with support of modern routing protocols, easy to use configuration
|
||||
interface and powerful route filtering language. It is lightweight and
|
||||
efficient and therefore appropriate for small embedded routers.
|
||||
|
||||
This packages the legacy v1.6 branch of Bird, which splits IPv4 and IPv6
|
||||
support into separate binaries. See also the bird2 package for the newer
|
||||
branch which integrates support for both IP protocols in a single binary.
|
||||
|
||||
endef
|
||||
|
||||
define Package/bird1/Default/description2
|
||||
In BGP, BIRD supports communities, multiprotocol extensions, MD5
|
||||
authentication, 32bit AS numbers and could act as a route server or a
|
||||
route reflector. BIRD also supports multiple RIBs, multiple kernel
|
||||
routing tables and redistribution between the protocols with a powerful
|
||||
configuration syntax.
|
||||
|
||||
endef
|
||||
|
||||
define Package/bird1/Default/description3
|
||||
This is a BIRD command-line client. It is used to send commands to BIRD,
|
||||
commands can perform simple actions such as enabling/disabling of
|
||||
protocols, telling BIRD to show various information, telling it to show
|
||||
a routing table filtered by a filter, or asking BIRD to reconfigure.
|
||||
|
||||
Unless you can't afford dependency on ncurses and readline, you
|
||||
should install BIRD command-line client together with BIRD.
|
||||
|
||||
endef
|
||||
|
||||
define Package/bird1/Default/description4
|
||||
This is a BIRD lightweight command-line client. It is used to send commands to BIRD,
|
||||
commands can perform simple actions such as enabling/disabling of
|
||||
protocols, telling BIRD to show various information, telling it to show
|
||||
a routing table filtered by a filter, or asking BIRD to reconfigure.
|
||||
|
||||
endef
|
||||
|
||||
define Package/bird1-ipv4
|
||||
$(call Package/bird1/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv4)
|
||||
CONFLICTS+=bird4
|
||||
endef
|
||||
|
||||
define Package/bird1c-ipv4
|
||||
$(call Package/bird1c/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv4)
|
||||
DEPENDS+=+bird1-ipv4
|
||||
CONFLICTS+=birdc4
|
||||
endef
|
||||
|
||||
define Package/bird1cl-ipv4
|
||||
$(call Package/bird1cl/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv4)
|
||||
DEPENDS+=+bird1-ipv4
|
||||
CONFLICTS+=birdcl4
|
||||
endef
|
||||
|
||||
define Package/bird1-ipv6
|
||||
$(call Package/bird1/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv6)
|
||||
CONFLICTS+=bird6
|
||||
endef
|
||||
|
||||
define Package/bird1c-ipv6
|
||||
$(call Package/bird1c/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv6)
|
||||
DEPENDS+=+bird1-ipv6
|
||||
CONFLICTS+=birdc6
|
||||
endef
|
||||
|
||||
define Package/bird1cl-ipv6
|
||||
$(call Package/bird1cl/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv6)
|
||||
DEPENDS+=+bird1-ipv6
|
||||
CONFLICTS+=birdcl6
|
||||
endef
|
||||
|
||||
define Package/bird1-ipv4/description
|
||||
$(call Package/bird1/Default/description1)
|
||||
This is IPv4 version of BIRD, it supports OSPFv2, RIPv2 and BGP
|
||||
protocols.
|
||||
|
||||
$(call Package/bird1/Default/description2)
|
||||
endef
|
||||
|
||||
define Package/bird1c-ipv4/description
|
||||
$(call Package/bird1/Default/description1)
|
||||
$(call Package/bird1/Default/description3)
|
||||
endef
|
||||
|
||||
define Package/bird1cl-ipv4/description
|
||||
$(call Package/bird1/Default/description1)
|
||||
$(call Package/bird1/Default/description4)
|
||||
endef
|
||||
|
||||
define Package/bird1-ipv6/description
|
||||
$(call Package/bird1/Default/description1)
|
||||
This is IPv6 version of BIRD, it supports OSPFv3, RIPng and BGP
|
||||
protocols.
|
||||
|
||||
$(call Package/bird1/Default/description2)
|
||||
endef
|
||||
|
||||
define Package/bird1c-ipv6/description
|
||||
$(call Package/bird1/Default/description1)
|
||||
$(call Package/bird1/Default/description3)
|
||||
endef
|
||||
|
||||
define Package/bird1cl-ipv6/description
|
||||
$(call Package/bird1/Default/description1)
|
||||
$(call Package/bird1/Default/description4)
|
||||
endef
|
||||
|
||||
CONFIGURE_ARGS += --with-linux-headers="$(LINUX_DIR)"
|
||||
|
||||
TARGET_CFLAGS+=-std=gnu89
|
||||
|
||||
define Build/Template
|
||||
|
||||
$(STAMP_BUILT)-$(2): $(STAMP_PREPARED)
|
||||
$(call Build/Configure/Default,$(3))
|
||||
$(call Build/Compile/Default,)
|
||||
( cd $(PKG_BUILD_DIR); mv -f bird bird$(2); mv -f birdc birdc$(2); mv -f birdcl birdcl$(2) )
|
||||
-$(MAKE) -C $(PKG_BUILD_DIR) clean
|
||||
touch $$@
|
||||
|
||||
$(STAMP_BUILT): $(STAMP_BUILT)-$(2)
|
||||
|
||||
define Package/bird1-ipv$(2)/install
|
||||
$(INSTALL_DIR) $$(1)/usr/sbin
|
||||
$(INSTALL_BIN) $$(PKG_BUILD_DIR)/bird$(2) $$(1)/usr/sbin/
|
||||
$(INSTALL_DIR) $$(1)/etc
|
||||
$(INSTALL_DATA) ./files/bird$(2).conf $$(1)/etc/
|
||||
$(INSTALL_DIR) $$(1)/etc/init.d
|
||||
$(INSTALL_BIN) ./files/bird$(2).init $$(1)/etc/init.d/bird$(2)
|
||||
|
||||
endef
|
||||
|
||||
define Package/bird1-ipv$(2)/conffiles
|
||||
/etc/bird$(2).conf
|
||||
endef
|
||||
|
||||
define Package/bird1c-ipv$(2)/install
|
||||
$(INSTALL_DIR) $$(1)/usr/sbin
|
||||
$(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdc$(2) $$(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
define Package/bird1cl-ipv$(2)/install
|
||||
$(INSTALL_DIR) $$(1)/usr/sbin
|
||||
$(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdcl$(2) $$(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
endef
|
||||
|
||||
|
||||
$(eval $(call Build/Template,bird1-ipv4,4, --disable-ipv6))
|
||||
$(eval $(call Build/Template,bird1-ipv6,6, --enable-ipv6))
|
||||
|
||||
$(eval $(call BuildPackage,bird1-ipv4))
|
||||
$(eval $(call BuildPackage,bird1c-ipv4))
|
||||
$(eval $(call BuildPackage,bird1cl-ipv4))
|
||||
$(eval $(call BuildPackage,bird1-ipv6))
|
||||
$(eval $(call BuildPackage,bird1c-ipv6))
|
||||
$(eval $(call BuildPackage,bird1cl-ipv6))
|
|
@ -1,121 +0,0 @@
|
|||
|
||||
# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION
|
||||
# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO
|
||||
|
||||
# However, most of options used here are just for example
|
||||
# and will be removed in real-life configs.
|
||||
|
||||
log syslog all;
|
||||
|
||||
# Override router ID
|
||||
#router id 192.168.0.1;
|
||||
|
||||
# Turn on global debugging of all protocols
|
||||
#debug protocols all;
|
||||
|
||||
|
||||
# Define a route filter...
|
||||
# filter test_filter {
|
||||
# if net ~ 10.0.0.0/16 then accept;
|
||||
# else reject;
|
||||
# }
|
||||
|
||||
# The direct protocol automatically generates device routes to all network
|
||||
# interfaces. Can exist in as many instances as you wish if you want to
|
||||
# populate multiple routing tables with device routes. Because device routes
|
||||
# are handled by Linux kernel, this protocol is usually not needed.
|
||||
# protocol direct {
|
||||
# interface "*"; # Restrict network interfaces it works with
|
||||
# }
|
||||
|
||||
# This pseudo-protocol performs synchronization between BIRD's routing
|
||||
# tables and the kernel. You can run multiple instances of the kernel
|
||||
# protocol and synchronize different kernel tables with different BIRD tables.
|
||||
protocol kernel {
|
||||
# learn; # Learn all alien routes from the kernel
|
||||
# persist; # Don't remove routes on bird shutdown
|
||||
scan time 20; # Scan kernel routing table every 20 seconds
|
||||
# import none; # Default is import all
|
||||
# export all; # Default is export none
|
||||
}
|
||||
|
||||
# This pseudo-protocol watches all interface up/down events.
|
||||
protocol device {
|
||||
scan time 10; # Scan interfaces every 10 seconds
|
||||
}
|
||||
|
||||
# Static routes (again, there can be multiple instances, so that you
|
||||
# can disable/enable various groups of static routes on the fly).
|
||||
protocol static {
|
||||
# export all; # Default is export none
|
||||
# route 0.0.0.0/0 via 62.168.0.13;
|
||||
# route 10.0.0.0/8 reject;
|
||||
# route 192.168.0.0/16 reject;
|
||||
}
|
||||
|
||||
|
||||
#protocol rip {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export filter test_filter;
|
||||
|
||||
# port 1520;
|
||||
# period 7;
|
||||
# infinity 16;
|
||||
# garbage time 60;
|
||||
# interface "*" { mode broadcast; };
|
||||
# honor neighbor;
|
||||
# honor always;
|
||||
# honor never;
|
||||
# authentication none;
|
||||
#}
|
||||
|
||||
|
||||
#protocol ospf {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export where source = RTS_STATIC;
|
||||
|
||||
# area 0 {
|
||||
# interface "eth*" {
|
||||
# cost 10;
|
||||
# hello 3;
|
||||
# retransmit 2;
|
||||
# wait 5;
|
||||
# dead 20;
|
||||
# type broadcast;
|
||||
# authentication simple;
|
||||
# password "pass";
|
||||
# };
|
||||
# };
|
||||
#}
|
||||
|
||||
|
||||
#protocol bgp {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export where source = RTS_STATIC;
|
||||
|
||||
# local as 65000;
|
||||
# neighbor 192.168.1.1 as 65001;
|
||||
# multihop 20 via 192.168.2.1;
|
||||
|
||||
# hold time 240;
|
||||
# startup hold time 240;
|
||||
# connect retry time 120;
|
||||
# keepalive time 80; # defaults to hold time / 3
|
||||
# start delay time 5; # How long do we wait before initial connect
|
||||
# error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive
|
||||
# # errors occur, we increase the delay exponentially ...
|
||||
# error forget time 300; # ... until this timeout expires)
|
||||
# disable after error; # Disable the protocol automatically when an error occurs
|
||||
# next hop self; # Disable next hop processing and always advertise our local address as nexthop
|
||||
# source address 62.168.0.14; # What local address we use for the TCP connection
|
||||
# password "secret" # Password used for MD5 authentication
|
||||
# rr client; # I am a route reflector and the neighor is my client
|
||||
# rr cluster id 1.0.0.1 # Use this value for cluster id instead of my router id
|
||||
# };
|
||||
#}
|
|
@ -1,26 +0,0 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2010-2014 OpenWrt.org
|
||||
|
||||
BIRD="bird4"
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_USE_PID=1
|
||||
SERVICE_PID_FILE="/var/run/$BIRD.pid"
|
||||
|
||||
BIRD_BIN="/usr/sbin/$BIRD"
|
||||
BIRD_CONF="/etc/$BIRD.conf"
|
||||
|
||||
start() {
|
||||
service_start $BIRD_BIN -d -c $BIRD_CONF -P $SERVICE_PID_FILE
|
||||
}
|
||||
|
||||
stop() {
|
||||
service_stop $BIRD_BIN
|
||||
}
|
||||
|
||||
reload() {
|
||||
service_reload $BIRD_BIN
|
||||
}
|
|
@ -1,121 +0,0 @@
|
|||
|
||||
# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION
|
||||
# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO
|
||||
|
||||
# However, most of options used here are just for example
|
||||
# and will be removed in real-life configs.
|
||||
|
||||
log syslog all;
|
||||
|
||||
# Override router ID
|
||||
#router id 192.168.0.1;
|
||||
|
||||
# Turn on global debugging of all protocols
|
||||
#debug protocols all;
|
||||
|
||||
|
||||
# Define a route filter...
|
||||
# filter test_filter {
|
||||
# if net ~ 10.0.0.0/16 then accept;
|
||||
# else reject;
|
||||
# }
|
||||
|
||||
# The direct protocol automatically generates device routes to all network
|
||||
# interfaces. Can exist in as many instances as you wish if you want to
|
||||
# populate multiple routing tables with device routes. Because device routes
|
||||
# are handled by Linux kernel, this protocol is usually not needed.
|
||||
# protocol direct {
|
||||
# interface "*"; # Restrict network interfaces it works with
|
||||
# }
|
||||
|
||||
# This pseudo-protocol performs synchronization between BIRD's routing
|
||||
# tables and the kernel. You can run multiple instances of the kernel
|
||||
# protocol and synchronize different kernel tables with different BIRD tables.
|
||||
protocol kernel {
|
||||
# learn; # Learn all alien routes from the kernel
|
||||
# persist; # Don't remove routes on bird shutdown
|
||||
scan time 20; # Scan kernel routing table every 20 seconds
|
||||
# import none; # Default is import all
|
||||
# export all; # Default is export none
|
||||
}
|
||||
|
||||
# This pseudo-protocol watches all interface up/down events.
|
||||
protocol device {
|
||||
scan time 10; # Scan interfaces every 10 seconds
|
||||
}
|
||||
|
||||
# Static routes (again, there can be multiple instances, so that you
|
||||
# can disable/enable various groups of static routes on the fly).
|
||||
protocol static {
|
||||
# export all; # Default is export none
|
||||
# route 0.0.0.0/0 via 62.168.0.13;
|
||||
# route 10.0.0.0/8 reject;
|
||||
# route 192.168.0.0/16 reject;
|
||||
}
|
||||
|
||||
|
||||
#protocol rip {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export filter test_filter;
|
||||
|
||||
# port 1520;
|
||||
# period 7;
|
||||
# infinity 16;
|
||||
# garbage time 60;
|
||||
# interface "*" { mode broadcast; };
|
||||
# honor neighbor;
|
||||
# honor always;
|
||||
# honor never;
|
||||
# authentication none;
|
||||
#}
|
||||
|
||||
|
||||
#protocol ospf {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export where source = RTS_STATIC;
|
||||
|
||||
# area 0 {
|
||||
# interface "eth*" {
|
||||
# cost 10;
|
||||
# hello 3;
|
||||
# retransmit 2;
|
||||
# wait 5;
|
||||
# dead 20;
|
||||
# type broadcast;
|
||||
# authentication simple;
|
||||
# password "pass";
|
||||
# };
|
||||
# };
|
||||
#}
|
||||
|
||||
|
||||
#protocol bgp {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export where source = RTS_STATIC;
|
||||
|
||||
# local as 65000;
|
||||
# neighbor 192.168.1.1 as 65001;
|
||||
# multihop 20 via 192.168.2.1;
|
||||
|
||||
# hold time 240;
|
||||
# startup hold time 240;
|
||||
# connect retry time 120;
|
||||
# keepalive time 80; # defaults to hold time / 3
|
||||
# start delay time 5; # How long do we wait before initial connect
|
||||
# error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive
|
||||
# # errors occur, we increase the delay exponentially ...
|
||||
# error forget time 300; # ... until this timeout expires)
|
||||
# disable after error; # Disable the protocol automatically when an error occurs
|
||||
# next hop self; # Disable next hop processing and always advertise our local address as nexthop
|
||||
# source address 62.168.0.14; # What local address we use for the TCP connection
|
||||
# password "secret" # Password used for MD5 authentication
|
||||
# rr client; # I am a route reflector and the neighor is my client
|
||||
# rr cluster id 1.0.0.1 # Use this value for cluster id instead of my router id
|
||||
# };
|
||||
#}
|
|
@ -1,26 +0,0 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2010-2014 OpenWrt.org
|
||||
|
||||
BIRD="bird6"
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_USE_PID=1
|
||||
SERVICE_PID_FILE="/var/run/$BIRD.pid"
|
||||
|
||||
BIRD_BIN="/usr/sbin/$BIRD"
|
||||
BIRD_CONF="/etc/$BIRD.conf"
|
||||
|
||||
start() {
|
||||
service_start $BIRD_BIN -d -c $BIRD_CONF -P $SERVICE_PID_FILE
|
||||
}
|
||||
|
||||
stop() {
|
||||
service_stop $BIRD_BIN
|
||||
}
|
||||
|
||||
reload() {
|
||||
service_reload $BIRD_BIN
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
--- a/sysdep/unix/krt.h
|
||||
+++ b/sysdep/unix/krt.h
|
||||
@@ -112,7 +112,7 @@ struct kif_proto {
|
||||
struct kif_state sys; /* Sysdep state */
|
||||
};
|
||||
|
||||
-struct kif_proto *kif_proto;
|
||||
+extern struct kif_proto *kif_proto;
|
||||
|
||||
#define KIF_CF ((struct kif_config *)p->p.cf)
|
||||
|
|
@ -7,12 +7,12 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bird2
|
||||
PKG_VERSION:=2.13.1
|
||||
PKG_VERSION:=2.14
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird
|
||||
PKG_HASH:=97bb8d57be9bc5083e2b566416d27e314162856a12ca7c77e202e467d20d4080
|
||||
PKG_HASH:=b0b9f6f8566541b9be4af1f0cac675c5a3785601a55667a7ec3d7de29735a786
|
||||
|
||||
PKG_MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
|
||||
PKG_LICENSE:=GPL-2.0-or-later
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
USE_PROCD=1
|
||||
START=70
|
||||
STOP=10
|
||||
|
||||
BIRD_BIN="/usr/sbin/bird"
|
||||
BIRD_CONF="/etc/bird.conf"
|
||||
|
|
|
@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
|||
|
||||
PKG_NAME:=bmx7
|
||||
PKG_VERSION:=7.1.1
|
||||
PKG_RELEASE:=4
|
||||
PKG_RELEASE:=5
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://codeload.github.com/bmx-routing/bmx7/tar.gz/v$(PKG_VERSION)?
|
||||
|
|
|
@ -18,7 +18,7 @@ include $(TOPDIR)/rules.mk
|
|||
|
||||
PKG_NAME:=cjdns
|
||||
PKG_VERSION:=v21.1
|
||||
PKG_RELEASE:=4
|
||||
PKG_RELEASE:=5
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://codeload.github.com/cjdelisle/cjdns/tar.gz/$(PKG_NAME)-$(PKG_VERSION)?
|
||||
|
@ -78,7 +78,7 @@ define Build/Compile
|
|||
$(INSTALL_DIR) $(PKG_BUILD_DIR)/tmp
|
||||
(cd $(PKG_BUILD_DIR) && \
|
||||
CROSS="true" \
|
||||
CC="$(TARGET_CC)" \
|
||||
CC="$(TARGET_CC_NOCACHE)" \
|
||||
AR="$(TARGET_AR)" \
|
||||
RANLIB="$(TARGET_RANLIB)" \
|
||||
CFLAGS="$(TARGET_CFLAGS) -U_FORTIFY_SOURCE -Wno-error=array-bounds -Wno-error=stringop-overflow -Wno-error=stringop-overread" \
|
||||
|
|
23
cjdns/patches/030-fix-invalid-pointer.patch
Normal file
23
cjdns/patches/030-fix-invalid-pointer.patch
Normal file
|
@ -0,0 +1,23 @@
|
|||
--- a/net/SwitchPinger_admin.c
|
||||
+++ b/net/SwitchPinger_admin.c
|
||||
@@ -78,8 +78,10 @@ static void adminPing(Dict* args, void*
|
||||
uint32_t timeout = (timeoutPtr) ? *timeoutPtr : DEFAULT_TIMEOUT;
|
||||
uint64_t path;
|
||||
String* err = NULL;
|
||||
+ String* pathNotParsable = String_CONST("path was not parsable.");
|
||||
+ String* noOpenSlots = String_CONST("no open slots to store ping, try later.");
|
||||
if (pathStr->len != 19 || AddrTools_parsePath(&path, (uint8_t*) pathStr->bytes)) {
|
||||
- err = String_CONST("path was not parsable.");
|
||||
+ err = pathNotParsable;
|
||||
} else {
|
||||
struct SwitchPinger_Ping* ping = SwitchPinger_newPing(path,
|
||||
data,
|
||||
@@ -89,7 +91,7 @@ static void adminPing(Dict* args, void*
|
||||
context->switchPinger);
|
||||
if (keyPing && *keyPing) { ping->type = SwitchPinger_Type_KEYPING; }
|
||||
if (!ping) {
|
||||
- err = String_CONST("no open slots to store ping, try later.");
|
||||
+ err = noOpenSlots;
|
||||
} else {
|
||||
ping->onResponseContext = Allocator_clone(ping->pingAlloc, (&(struct Ping) {
|
||||
.context = context,
|
15
cjdns/patches/040-gyp-python_310.patch
Normal file
15
cjdns/patches/040-gyp-python_310.patch
Normal file
|
@ -0,0 +1,15 @@
|
|||
--- a/node_build/dependencies/libuv/build/gyp/pylib/gyp/common.py
|
||||
+++ b/node_build/dependencies/libuv/build/gyp/pylib/gyp/common.py
|
||||
@@ -4,7 +4,11 @@
|
||||
|
||||
from __future__ import with_statement
|
||||
|
||||
-import collections
|
||||
+try:
|
||||
+ # Python 3.10
|
||||
+ from six.moves import collections_abc as collections
|
||||
+except ImportError:
|
||||
+ import collections
|
||||
import errno
|
||||
import filecmp
|
||||
import os.path
|
57
luci-app-olsrd2/Makefile
Normal file
57
luci-app-olsrd2/Makefile
Normal file
|
@ -0,0 +1,57 @@
|
|||
# call BuildPackage - OpenWrt buildroot signature
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-olsrd2
|
||||
PKG_VERSION:=0.2.6
|
||||
PKG_RELEASE:=15
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/luci-app-olsrd2
|
||||
SECTION:=luci
|
||||
CATEGORY:=LuCI
|
||||
SUBMENU:=3. Applications
|
||||
TITLE:=OLSR2 configuration and status module
|
||||
MAINTAINER:=Patrick Grimm <patrick@lunatiki.de>
|
||||
EXTRA_DEPENDS:=oonf-olsrd2, luci-mod-admin-full
|
||||
PKGARCH:=all
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/postinst
|
||||
#!/bin/sh
|
||||
if [ -z $${IPKG_INSTROOT} ] ; then
|
||||
rm -f /tmp/luci-indexcache
|
||||
rm -rf /tmp/luci-modulecache/
|
||||
killall -HUP rpcd 2>/dev/null
|
||||
fi
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/www/luci-static/resources/view/olsrd2
|
||||
$(INSTALL_DATA) ./htdocs/cgi-bin-olsrd2-neigh.html $(1)/www
|
||||
$(INSTALL_DATA) ./htdocs/luci-static/resources/view/olsrd2/* $(1)/www/luci-static/resources/view/olsrd2
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DATA) ./root/etc/config/* $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_DATA) ./root/etc/uci-defaults/* $(1)/etc/uci-defaults
|
||||
$(INSTALL_DIR) $(1)/usr/libexec/rpcd
|
||||
$(INSTALL_BIN) ./root/usr/libexec/rpcd/status.olsrd2 $(1)/usr/libexec/rpcd/status.olsrd2
|
||||
$(INSTALL_DIR) $(1)/usr/share/luci/menu.d
|
||||
$(INSTALL_DATA) ./root/usr/share/luci/menu.d/* $(1)/usr/share/luci/menu.d
|
||||
$(INSTALL_DIR) $(1)/usr/share/rpcd/acl.d
|
||||
$(INSTALL_DATA) ./root/usr/share/rpcd/acl.d/* $(1)/usr/share/rpcd/acl.d
|
||||
$(INSTALL_DIR) $(1)/lib/functions
|
||||
$(INSTALL_DATA) ./root/lib/functions/* $(1)/lib/functions
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,luci-app-olsrd2))
|
10
luci-app-olsrd2/htdocs/cgi-bin-olsrd2-neigh.html
Normal file
10
luci-app-olsrd2/htdocs/cgi-bin-olsrd2-neigh.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; URL=/cgi-bin/luci/public/status/olsrd2/neighbors" />
|
||||
</head>
|
||||
<body style="background-color: black">
|
||||
<a style="color: white; text-decoration: none" href="/cgi-bin/luci/public/status/olsrd2/neighbors">LuCI - Lua Configuration Interface</a>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,51 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require ui';
|
||||
'require rpc';
|
||||
'require poll';
|
||||
|
||||
var callgetData = rpc.declare({
|
||||
object: 'status.olsrd2',
|
||||
method: 'getAttached_network'
|
||||
});
|
||||
|
||||
function createTable(data) {
|
||||
let tableData = [];
|
||||
data.attached_network.forEach(row => {
|
||||
let node = E('a',{ 'href': 'https://' + row.node + '/cgi-bin-olsrd2-neigh.html'},row.node);
|
||||
tableData.push([
|
||||
node,
|
||||
row.attached_net,
|
||||
row.attached_net_src,
|
||||
row.domain_metric_out
|
||||
])
|
||||
});
|
||||
return tableData;
|
||||
}
|
||||
|
||||
return view.extend({
|
||||
title: _('OLSRD2 networks'),
|
||||
handleSaveApply: null,
|
||||
handleSave: null,
|
||||
handleReset: null,
|
||||
|
||||
render: function(data) {
|
||||
|
||||
var tr = E('table', { 'class': 'table' });
|
||||
tr.appendChild(E('div', { 'class': 'tr cbi-section-table-titles' }, [
|
||||
E('th', { 'class': 'th left' }, [ 'IP address' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Network' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Source' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Metric' ])
|
||||
]));
|
||||
poll.add(() => {
|
||||
Promise.all([
|
||||
callgetData()
|
||||
]).then((results) => {
|
||||
cbi_update_table(tr, createTable(results[0]));
|
||||
})
|
||||
}, 30);
|
||||
return tr
|
||||
}
|
||||
|
||||
});
|
|
@ -0,0 +1,32 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('olsrd2', 'OLSRD2 Daemon');
|
||||
|
||||
s = m.section(form.TypedSection, 'domain', _('domain configuration section'));
|
||||
s.anonymous = true;
|
||||
s.addremove = false;
|
||||
o = s.option(form.Value, "table", _("table defines the routing table for the local routing entries."), "0-254");
|
||||
o.optional = true;
|
||||
o.placeholder = 254;
|
||||
o.datatype = "range(0,254)";
|
||||
o = s.option(form.Value, "protocol", _("protocol defines the protocol number for the local routing entries."), "0-254");
|
||||
o.optional = true;
|
||||
o.placeholder = 100;
|
||||
o.datatype = "range(0,254)";
|
||||
o = s.option(form.Value, "distance", _("distance defines the 'metric' (hopcount) of the local routing entries."), "0-254");
|
||||
o.optional = true;
|
||||
o.placeholder = 2;
|
||||
o.datatype = "range(0,254)";
|
||||
o = s.option(form.Flag, "srcip_routes", _("srcip_routes defines if the router sets the originator address as the source-ip entry into the local routing entries."), "");
|
||||
o.optional = true;
|
||||
o.datatype = "bool";
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,32 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('olsrd2', 'OLSRD2 Daemon');
|
||||
|
||||
s = m.section(form.TypedSection, 'global', _('It controls the basic behavior of the OONF core.'));
|
||||
s.anonymous = true;
|
||||
s.addremove = false;
|
||||
|
||||
o = s.option(form.Flag, "failfast", _("failfast is another boolean setting which can activate an error during startup if a requested plugin does not load or an unknown configuration variable is set."), "");
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.datatype = 'bool';
|
||||
o = s.option(form.Value, "pidfile", _("pidfile is used together with the fork option to store the pid of the background process in a file."), "Filename");
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.placeholder = '/var/run/olsrd2.pid';
|
||||
o.datatype = 'string';
|
||||
o = s.option(form.Value, "lockfile", _("lockfile creates a file on disk and keeps a lock on it as long as the OONF application is running to prevent the application from running multiple times at once."), "Filename");
|
||||
o.rmempty = false;
|
||||
o.optional = true;
|
||||
o.placeholder = "/var/lock/olsrd2";
|
||||
o.datatype = "string";
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,103 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
'require tools.widgets as widgets';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('olsrd2', 'OLSRD2 Daemon');
|
||||
m.tabbed = true;
|
||||
s = m.section(form.GridSection, 'interface', _('interface configuration section'));
|
||||
s.anonymous = true;
|
||||
s.addremove = true;
|
||||
s.addbtntitle = _('Add new interface...');
|
||||
s.tab('general', _('General Settings'));
|
||||
s.tab('oonf', _('OONF RFC5444 Plugin'));
|
||||
s.tab('nhdp', _('NHDP Plugin'));
|
||||
s.tab('link', _('Link Config Plugin'));
|
||||
s.modaltitle = function(section_id) {
|
||||
return _('Interfaces') + ' » ' + section_id.toUpperCase();
|
||||
};
|
||||
|
||||
o = s.taboption("general", form.Flag, "ignore", _("Enabled"));
|
||||
o.enabled = "0";
|
||||
o.disabled = "1";
|
||||
o.rmempty = false;
|
||||
o = s.taboption("general", form.Value, "ifname", _("Network"), _("The interface OLSR2 should serve."));
|
||||
o.datatype = "string";
|
||||
o = s.taboption("oonf", form.DynamicList, "acl", _("acl defines the IP addresses that are allowed to use the RFC5444 socket."), _("ip6prefix, ip4prefix, default_accept, default_reject"));
|
||||
o.datatype = "string";
|
||||
o.optional = true;
|
||||
o.modalonly = true;
|
||||
o = s.taboption("oonf", form.DynamicList, "bindto", _("bindto defines the IP addresses which the RFC5444 socket will be bound to."), _("ip6prefix, ip4prefix, default_accept, default_reject"));
|
||||
o.datatype = "string";
|
||||
o.optional = true;
|
||||
o.modalonly = true;
|
||||
o = s.taboption("oonf", form.Value, "multicast_v4", _("multicast_v4 defines the IPv4 multicast address used for RFC5444 packets."), _("ip4addr"));
|
||||
o.datatype = "ip4addr";
|
||||
o.placeholder = "224.0.0.109";
|
||||
o.optional = true;
|
||||
o.modalonly = true;
|
||||
o = s.taboption("oonf", form.Value, "multicast_v6", _("multicast_v6 defines the IPv6 multicast address used for RFC5444 packets."), _("ip6addr"));
|
||||
o.datatype = "ip6addr";
|
||||
o.placeholder = "ff02::6d";
|
||||
o.optional = true;
|
||||
o.modalonly = true;
|
||||
o = s.taboption("oonf", form.Value, "dscp", _("dscp defines the DSCP value set for each outgoing RFC5444 packet. The value must be between 0 and 252 without fractional digits. The value should be a multiple of 4."), _("0-255"));
|
||||
o.optional = true;
|
||||
o.placeholder = 192;
|
||||
o.datatype = "range(0,255)";
|
||||
o.modalonly = true;
|
||||
o = s.taboption("oonf", form.Value, "rawip", _("rawip defines if the interface should put RFC5444 packets directly into IP headers (skipping the UDP header)."), _("bool"));
|
||||
o.optional = true;
|
||||
o.rmempty = true;
|
||||
o.datatype = "bool";
|
||||
o.modalonly = true;
|
||||
o = s.taboption("nhdp", form.DynamicList, "ifaddr_filter", _("ifaddr_filter defines the IP addresses that are allowed to NHDP interface addresses."), _("ip6prefix, ip4prefix, default_accept, default_reject"));
|
||||
o.datatype = "string";
|
||||
o.optional = true;
|
||||
o.modalonly = true;
|
||||
o = s.taboption("nhdp", form.Value, "hello_validity", _("hello_validity defines the time the local HELLO messages will be valid for the neighbors."), _(">0.1 s"));
|
||||
o.optional = true;
|
||||
o.placeholder = 20.0;
|
||||
o.datatype = "and(min(0.1), ufloat)";
|
||||
o.modalonly = true;
|
||||
o = s.taboption("nhdp", form.Value, "hello_interval", _("hello_interval defines the time between two HELLO messages on the interface."), _(">0.1 s"));
|
||||
o.optional = true;
|
||||
o.placeholder = 2.0;
|
||||
o.datatype = "and(min(0.1), ufloat)";
|
||||
o.modalonly = true;
|
||||
o = s.taboption("link", form.Value, "rx_bitrate", _("rx_bitrate"));
|
||||
o.optional = true;
|
||||
o.rmempty = false;
|
||||
o.placeholder = "1G";
|
||||
o.datatype = "string";
|
||||
o = s.taboption("link", form.Value, "tx_bitrate", _("tx_bitrate"));
|
||||
o.optional = true;
|
||||
o.rmempty = false;
|
||||
o.placeholder = "1G";
|
||||
o.datatype = "string";
|
||||
o = s.taboption("link", form.Value, "rx_max_bitrate", _("rx_max_bitrate"));
|
||||
o.optional = true;
|
||||
o.rmempty = false;
|
||||
o.placeholder = "1G";
|
||||
o.datatype = "string";
|
||||
o.modalonly = true;
|
||||
o = s.taboption("link", form.Value, "tx_max_bitrate", _("tx_max_bitrate"));
|
||||
o.optional = true;
|
||||
o.rmempty = false;
|
||||
o.placeholder = "1G";
|
||||
o.datatype = "string";
|
||||
o.modalonly = true;
|
||||
o = s.taboption("link", form.Value, "rx_signal", _("rx_signal"));
|
||||
o.optional = true;
|
||||
o.rmempty = false;
|
||||
o.placeholder = "1G";
|
||||
o.datatype = "string";
|
||||
o.modalonly = true;
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,25 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('olsrd2', 'OLSRD2 Daemon');
|
||||
|
||||
s = m.section(form.TypedSection, 'lan_import', _('Automatic import of routing tables as locally attached networks.'));
|
||||
s.anonymous = true;
|
||||
s.addremove = true;
|
||||
o = s.option(form.Value, "name", _("Name"), "Text");
|
||||
o.datatype = "string";
|
||||
o = s.option(form.Value, "interface", _("Interface"), "Name Interface");
|
||||
o.datatype = "string";
|
||||
o = s.option(form.Value, "table", _("IP Table"), "1-255");
|
||||
o.datatype = "range(1,255)";
|
||||
o = s.option(form.Value, "protocol", _("IP protocol"), "1-255");
|
||||
o.datatype = "range(1,255)";
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,37 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('olsrd2', 'OLSRD2 Daemon');
|
||||
|
||||
s = m.section(form.TypedSection, 'log', _('OONF Logging'));
|
||||
s.anonymous = true;
|
||||
s.addremove = false;
|
||||
|
||||
o = s.option(form.Flag, "syslog", _("syslog are boolean options that activate or deactivate the syslog Logging Target."), "");
|
||||
o.optional = true;
|
||||
o.datatype = "bool";
|
||||
o = s.option(form.Flag, "stderr", _("stderr are boolean options that activate or deactivate the stderr Logging Target."), "");
|
||||
o.optional = true;
|
||||
o.datatype = "bool";
|
||||
o = s.option(form.Value, "file", _("file asks for a filename for logging output"),"Filename");
|
||||
o.rmempty = false;
|
||||
o.optional = true;
|
||||
o.placeholder = "/tmp/olsrd2.log";
|
||||
o.datatype = "string";
|
||||
o = s.option(form.Value, "debug", _("debug ask for a list of Logging Sources that will be logged by the OONF Core Logging Targets."));
|
||||
o.rmempty = false;
|
||||
o.optional = true;
|
||||
o.datatype = "string";
|
||||
o = s.option(form.Value, "info", _("info ask for a list of Logging Sources that will be logged by the OONF Core Logging Targets."));
|
||||
o.rmempty = false;
|
||||
o.optional = true;
|
||||
o.datatype = "string";
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,22 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('luci_olsrd2', 'Luci options');
|
||||
|
||||
s = m.section(form.TypedSection, 'olsrd2', _('LUCI'));
|
||||
s.anonymous = true;
|
||||
s.addremove = false;
|
||||
|
||||
o = s.option(form.Flag, "resolve", _("do Hostname lookup"), "");
|
||||
o.datatype = "bool";
|
||||
o = s.option(form.Value, "domain", _("optional Public domain forwarding with dnsmasq-full (auth-zone=example.com) on the internetgateway "), "default is olsr");
|
||||
o.datatype = "string";
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,29 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('olsrd2', 'OLSRD2 Daemon');
|
||||
|
||||
s = m.section(form.TypedSection, 'mesh', _('mesh configuration section'));
|
||||
s.anonymous = true;
|
||||
s.addremove = false;
|
||||
o = s.option(form.Value, "port", _("port defines the UDP port number of the RFC5444 socket."), "1-65535");
|
||||
o.optional = true;
|
||||
o.placeholder = 269;
|
||||
o.datatype = "range(1,65535)";
|
||||
o = s.option(form.Value, "ip_proto", _("ip_proto defines the IP protocol number that can be used for RFC5444 communication."), "1-255");
|
||||
o.optional = true;
|
||||
o.placeholder = 138;
|
||||
o.datatype = "range(1,255)";
|
||||
o = s.option(form.Value, "aggregation_interval", _("aggregation_interval defines the time the local RFC5444 implementation will keep messages to aggregate them before creating a new RFC5444 packet to forward them."), ">0.1 s");
|
||||
o.optional = true;
|
||||
o.placeholder = 1.0;
|
||||
o.datatype = "and(min(0.1), ufloat)";
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,58 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require ui';
|
||||
'require rpc';
|
||||
'require poll';
|
||||
|
||||
var callgetData = rpc.declare({
|
||||
object: 'status.olsrd2',
|
||||
method: 'getNeighbors'
|
||||
});
|
||||
|
||||
function createTable(data) {
|
||||
let tableData = [];
|
||||
data.neighbors.forEach(row => {
|
||||
let hostname = E('a',{ 'href': 'https://' + row.hostname + '/cgi-bin-olsrd2-neigh.html'},row.hostname);
|
||||
let orginator = E('a',{ 'href': 'https://[' + row.originator + ']/cgi-bin-olsrd2-neigh.html'},row.originator);
|
||||
tableData.push([
|
||||
hostname,
|
||||
orginator,
|
||||
row.lladdr,
|
||||
row.interface,
|
||||
row.metric_in,
|
||||
row.metric_in_raw
|
||||
])
|
||||
});
|
||||
return tableData;
|
||||
};
|
||||
|
||||
return view.extend({
|
||||
title: _('OLSRD2 mesh neighbors'),
|
||||
handleSaveApply: null,
|
||||
handleSave: null,
|
||||
handleReset: null,
|
||||
|
||||
|
||||
render: function(data) {
|
||||
|
||||
var tr = E('table', { 'class': 'table' });
|
||||
tr.appendChild(E('tr', { 'class': 'tr cbi-section-table-titles' }, [
|
||||
E('th', { 'class': 'th left' }, [ 'Hostname' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Orginator' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'MAC' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Interface' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Metric' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'raw' ])
|
||||
]));
|
||||
poll.add(() => {
|
||||
Promise.all([
|
||||
callgetData()
|
||||
]).then((results) => {
|
||||
cbi_update_table(tr, createTable(results[0]));
|
||||
})
|
||||
}, 30);
|
||||
return tr
|
||||
|
||||
}
|
||||
|
||||
});
|
|
@ -0,0 +1,46 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require ui';
|
||||
'require rpc';
|
||||
'require poll';
|
||||
|
||||
var callgetData = rpc.declare({
|
||||
object: 'status.olsrd2',
|
||||
method: 'getNode'
|
||||
});
|
||||
|
||||
function createTable(data) {
|
||||
let tableData = [];
|
||||
data.node.forEach(row => {
|
||||
let node = E('a',{ 'href': 'https://' + row.node + '/cgi-bin-olsrd2-neigh.html'},row.node);
|
||||
tableData.push([
|
||||
node
|
||||
])
|
||||
});
|
||||
return tableData;
|
||||
};
|
||||
|
||||
return view.extend({
|
||||
title: _('OLSRD2 mesh nodes'),
|
||||
handleSaveApply: null,
|
||||
handleSave: null,
|
||||
handleReset: null,
|
||||
|
||||
render: function(data) {
|
||||
|
||||
var tr = E('table', { 'class': 'table' });
|
||||
tr.appendChild(E('tr', { 'class': 'tr cbi-section-table-titles' }, [
|
||||
E('th', { 'class': 'th left' }, [ 'IP Address' ])
|
||||
]));
|
||||
poll.add(() => {
|
||||
Promise.all([
|
||||
callgetData()
|
||||
]).then((results) => {
|
||||
cbi_update_table(tr, createTable(results[0]));
|
||||
})
|
||||
}, 30);
|
||||
|
||||
return tr;
|
||||
}
|
||||
|
||||
});
|
|
@ -0,0 +1,60 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('olsrd2', 'OLSRD2 Daemon');
|
||||
|
||||
s = m.section(form.TypedSection, 'olsrv2', _('the OLSRv2 implementation including the OLSRv2 API for other plugins.'));
|
||||
s.anonymous = true;
|
||||
s.addremove = false;
|
||||
|
||||
o = s.option(form.Value, "tc_interval", _("defines the time between two TC messages."), "s");
|
||||
o.optional = true;
|
||||
o.placeholder = 5.0;
|
||||
o.datatype = "ufloat";
|
||||
o = s.option(form.Value, "tc_validity", _("tc_validity defines the validity time of the TC messages."), "s");
|
||||
o.optional = true;
|
||||
o.placeholder = 300.0;
|
||||
o.datatype = "ufloat";
|
||||
o = s.option(form.Value, "forward_hold_time", _("forward_hold_time defines the time until the router will forget an entry in its forwarding duplicate database."), "s");
|
||||
o.optional = true;
|
||||
o.placeholder = 300.0;
|
||||
o.datatype = "ufloat";
|
||||
o = s.option(form.Value, "processing_hold_time", _("processing_hold_time defines the time until the router will forget an entry in its processing duplicate database."), "s");
|
||||
o.optional = true;
|
||||
o.placeholder = 300.0;
|
||||
o.datatype = "ufloat";
|
||||
o = s.option(form.DynamicList, "routable", _("routable defines the ACL which declares an IP address routable. Other IP addresses will not be included in TC messages."), "ip6prefix, ip4prefix, default_accept, default_reject");
|
||||
o.datatype = "string";
|
||||
//TODO
|
||||
//svc.datatype = "or(negm(ip6addr), negm(ip4addr), 'default_accept', 'default_reject')"
|
||||
//modules/luci-base/htdocs/luci-static/resources/cbi.js:545
|
||||
// negm: function() {
|
||||
// return this.apply('or', this.value.replace(/^[ \t]*-[ \t]*/, ''), arguments);
|
||||
// },
|
||||
//modules/luci-base/luasrc/cbi/datatypes.lua:51
|
||||
//function negm(v, ...)
|
||||
// return _M['or'](v:gsub("^%s*-%s*", ""), ...)
|
||||
//end
|
||||
o.optional = true;
|
||||
o = s.option(form.DynamicList, "originator", _("originator defines the ACL which declares a valid originator IP address for the router."), "ip6prefix, ip4prefix, default_accept, default_reject");
|
||||
o.datatype = "string";
|
||||
//TODO
|
||||
//svc.datatype = "or(negm(ip6addr), negm(ip4addr), 'default_accept', 'default_reject')"
|
||||
//modules/luci-base/htdocs/luci-static/resources/cbi.js:545
|
||||
// negm: function() {
|
||||
// return this.apply('or', this.value.replace(/^[ \t]*-[ \t]*/, ''), arguments);
|
||||
// },
|
||||
//modules/luci-base/luasrc/cbi/datatypes.lua:51
|
||||
//function negm(v, ...)
|
||||
// return _M['or'](v:gsub("^%s*-%s*", ""), ...)
|
||||
//end
|
||||
o.optional = true;
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,32 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
render: function() {
|
||||
var m, s, o;
|
||||
|
||||
m = new form.Map('olsrd2', 'OLSRD2 Daemon');
|
||||
|
||||
s = m.section(form.TypedSection, 'olsrv2_lan', _('Prefix configuration section'));
|
||||
s.anonymous = true;
|
||||
s.addremove = true;
|
||||
o = s.option(form.Value, "name", _("Name"), "Text");
|
||||
o.datatype = "string";
|
||||
o = s.option(form.Value, "prefix", _("locally attached network prefix"), "");
|
||||
o.datatype = "string";
|
||||
o = s.option(form.Value, "domain", _("domain for this LAN entry, -1 for all domains"), "-1-254");
|
||||
o.optional = true;
|
||||
o.placeholder = -1;
|
||||
o.datatype = "range(-1,254)";
|
||||
o = s.option(form.Value, "metric", _("metric value for this LAN entry"), "0-254");
|
||||
o.optional = true;
|
||||
o.placeholder = 2;
|
||||
o.datatype = "range(0,254)";
|
||||
o = s.option(form.Flag, "source_prefix", _("source prefix for lan (source specific routing)"), "");
|
||||
o.optional = true;
|
||||
o.datatype = "bool";
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,82 @@
|
|||
'use strict';
|
||||
'require view';
|
||||
'require ui';
|
||||
'require rpc';
|
||||
'require poll';
|
||||
|
||||
var callgetVersion = rpc.declare({
|
||||
object: 'status.olsrd2',
|
||||
method: 'getVersion'
|
||||
});
|
||||
var callgetLan = rpc.declare({
|
||||
object: 'status.olsrd2',
|
||||
method: 'getLan'
|
||||
});
|
||||
|
||||
function createTable(data) {
|
||||
let tableData = [];
|
||||
if ( data && data.version && data.version[0] ) {
|
||||
if ( data.version[0].version_text != undefined ) {
|
||||
tableData.push([_('OLSRd2 Version'),data.version[0].version_text]);
|
||||
}
|
||||
if ( data.version[0].version_commit != undefined) {
|
||||
tableData.push([_('OLSRd2 GIT commit'),data.version[0].version_commit]);
|
||||
}
|
||||
}
|
||||
tableData.push(['']);
|
||||
return tableData;
|
||||
}
|
||||
|
||||
function createTableDomain(data) {
|
||||
let tableData = [];
|
||||
if ( data && data.lan && data.lan[0] ) {
|
||||
data.lan.forEach(row => {
|
||||
tableData.push([
|
||||
row.lan,
|
||||
row.domain,
|
||||
row.domain_metric,
|
||||
row.domain_metric_out,
|
||||
row.domain_metric_out_raw,
|
||||
row.domain_distance
|
||||
])
|
||||
});
|
||||
}
|
||||
return tableData;
|
||||
}
|
||||
|
||||
return view.extend({
|
||||
title: _('Version'),
|
||||
handleSaveApply: null,
|
||||
handleSave: null,
|
||||
handleReset: null,
|
||||
|
||||
render: function() {
|
||||
|
||||
var tr = E('table',{ 'class': 'table'});
|
||||
tr.appendChild(E('tr', { 'class': 'tr cbi-section-table-titles' }, [
|
||||
E('th', { 'class': 'th left' }),
|
||||
E('th', { 'class': 'th left' })
|
||||
]));
|
||||
var trd = E('table', { 'class': 'table' });
|
||||
trd.appendChild(E('trd', { 'class': 'tr cbi-section-table-titles' }, [
|
||||
E('th', { 'class': 'th left' }, [ 'LAN IP' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Domain' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Domain Metric' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Domain Metric out' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Domain Metric out' ]),
|
||||
E('th', { 'class': 'th left' }, [ 'Domain distance' ])
|
||||
]));
|
||||
poll.add(() => {
|
||||
Promise.all([
|
||||
callgetVersion(),
|
||||
callgetLan()
|
||||
]).then((results) => {
|
||||
cbi_update_table(tr, createTable(results[0]));
|
||||
cbi_update_table(trd, createTableDomain(results[1]));
|
||||
})
|
||||
}, 30);
|
||||
|
||||
return [tr,trd];
|
||||
}
|
||||
|
||||
});
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue