Compare commits

..

133 commits

Author SHA1 Message Date
Moritz Warning
a9e43101bb nodogsplash: explicit file copy
Signed-off-by: Moritz Warning <moritzwarning@web.de>
(cherry picked from commit 2a725e7cbe)
2023-10-23 21:41:25 +02:00
Moritz Warning
df63e160b5 nodogsplash: update to version 5.0.2
Fix a buffer overflow in case the
query string is too long.

Signed-off-by: Moritz Warning <moritzwarning@web.de>
(cherry picked from commit fe1c67fb3d)
2023-10-23 21:41:25 +02:00
Moritz Warning
46203cf6f3 nodogsplash: remove opennds from conflicts
OpenNDS lists nodogsplash a conflict as well.
This causes a circular reference that is not allowed.

Signed-off-by: Moritz Warning <moritzwarning@web.de>
(cherry picked from commit 967dde509b)
2023-10-23 21:41:25 +02:00
Moritz Warning
4b975075a7 nodogsplash: update to 5.0.1
Signed-off-by: Moritz Warning <moritzwarning@web.de>
(cherry picked from commit 91e07907fa)
2023-10-23 21:41:25 +02:00
Josef Schlehofer
4cc8a2ff5b nodogsplash: fix SPDX License Identifier and reordering
- Add PKG_LICENSE_FILES
- Use two spaces instead of tabs

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
(cherry picked from commit c64e02c5b5)
2023-10-23 21:41:25 +02:00
Jeffery To
1aeda8e982 CI: Add local feed for CI-built packages
To test each package, the CI-built target package (ipk) file is
installed, but currently the target package's dependencies are installed
from the standard opkg feeds.

There are cases when the CI-built target packages should be
installed/tested together:

* If a pull request contains several new packages that depend on each
  other, the test step will fail as the new dependencies cannot be found
  in the current packages feed.

* If a pull request upgrades a source package that builds several target
  packages that depend on each other, the test step may fail due to the
  version/ABI mismatch between a newer target package and the older
  dependencies installed from the packages feed.

This sets up a local feed for the CI-built packages so that dependencies
are also installed from the same set of packages.

Signed-off-by: Jeffery To <jeffery.to@gmail.com>
(cherry picked from commit f818fe716e)
2023-10-23 17:02:01 +02:00
Jeffery To
0bc50215c4 CI: Do package run-tests only if target packages were built
Currently, the package run-test phase will fail for PRs that only
add/update host-only packages, as no target packages (*.ipk) are built.

This checks if any target packages are built before attempting the
run-tests.

Signed-off-by: Jeffery To <jeffery.to@gmail.com>
(cherry picked from commit 299ee2b1cf)
2023-10-23 17:01:20 +02:00
Josef Schlehofer
274aea3873 ci: change default packages
Since this file was taken from packages repository, it tries to compile
packages from that repository as fallback if changes are not detected.

Let's change these packages to some, which are present in this
repository, so they will be compiled as test.

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
(cherry picked from commit c9a8f2d032)
2023-10-23 17:00:30 +02:00
Alois Klink
397d7afbd0 github-ci: error on any shell errors
Enable `errexit` and `nounset` [POSIX shell options][1]
in `.github/workflows/entrypoint.sh` so that the script fails
if any command within the script fails.

[1]: https://pubs.opengroup.org/onlinepubs/9699919799//utilities/V3_chap02.html#set

Reported-by: Marius Dinu <m95d+git@psihoexpert.ro>
Fixes: https://github.com/openwrt/packages/issues/19953
Signed-off-by: Alois Klink <alois@aloisklink.com>
(cherry picked from commit 03ca0722f7)
2023-10-23 17:00:24 +02:00
Christian Marangi
4ed33a15c3 ci: update github actions to v3
Update checkout and upload-artifact action to v3 to mute nodejs
deprecation warning.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
(cherry picked from commit 52570d4242822e3db678f5484c2ca3e72f485d52)
(cherry picked from commit 5d87b95697)
2023-10-23 17:00:18 +02:00
Jeffery To
a9c09983f5 ci: Use openwrt/gh-action-sdk@v5
The previous build errors with v5 have been fixed. This version builds
packages as a normal user instead of as root.

Signed-off-by: Jeffery To <jeffery.to@gmail.com>
(cherry picked from commit e2d72c5775)
2023-10-23 17:00:11 +02:00
Bradford Zhang
d79f2b57eb bird2: bump to version 2.13.1
Signed-off-by: Bradford Zhang <zyc@zyc.name>
(cherry picked from commit d98b9b5052)
2023-06-30 01:17:49 +02:00
Bradford Zhang
8bbe9ceafa bird2: bump to version 2.13
Signed-off-by: Bradford Zhang <zyc@zyc.name>
(cherry picked from commit 6410411b12)
2023-05-20 00:09:54 +02:00
Josef Schlehofer
8071852b45
Merge pull request #959 from rogerpueyo/openwrt-21.02-backport-bird1-fixes
Backport bird1-openwrt fixes to 21.02
2023-03-09 09:20:05 +01:00
Roger Pueyo Centelles
b1882bc9a4 bird1: fix "Form token mismatch" errors in luci-app-bird1-ipv{4,6}
The "Filters", "Functions" and "Status" sections of the web interfaces
for both Bird4 and Bird6 threw the following error upon performing any
action:

   Form token mismatch
   The submitted security token is invalid or already expired!

Changing their entry types from "cbi" to "form" fixes them.

Fixes #922.

Signed-off-by: Roger Pueyo Centelles <roger.pueyo@guifi.net>
(cherry picked from commit c37fbab8f5)
2023-03-08 22:19:17 +01:00
Roger Pueyo Centelles
258826e83a bird1: rename get_bool() to get_a_bool() in bird{4,6}-lib.sh
This patch renames the get_bool() function, implemented in the
bird4-lib.sh and bird6-lib.sh files (respectively, for the IPv4 and
the IPv6 versions of the package), as well as all the calls to it.
This way, we avoid a function name collision with the one provided by
file /lib/functions.sh, which is slightly different and caused an
out-of-memory error when parsing the bird4/bird6 UCI config files.

Fixes #920.

Signed-off-by: Roger Pueyo Centelles <roger.pueyo@guifi.net>
(cherry picked from commit d32f93e049)
2023-03-08 22:19:17 +01:00
Roger Pueyo Centelles
7830857eee bird1-openwrt: fix Makefile issues
This commit replaces the deprecated licensing text with an SPDX license
identifier, and removes tab indentations in the conffiles sections.

Signed-off-by: Roger Pueyo Centelles <roger.pueyo@guifi.net>
(cherry picked from commit 6697ca291f)
2023-03-08 22:19:17 +01:00
Roger Pueyo Centelles
812d8cc8a3 bird1-openwrt: use a single Makefile for IPv4 and IPv6 packages
Having two Makefile files, respectively in the bird1-openwrt-ipv4 and
bird1-ipv6-openwrt folders, made the CI tests fail at the time of
building the packages, due to a compilation error. This patch merges
both Makefile files into a single one. As a result, package compilation
succeeds during the CI tests.

Signed-off-by: Roger Pueyo Centelles <roger.pueyo@guifi.net>
(cherry picked from commit 914c27aeb6)
2023-03-08 22:19:15 +01:00
Bradford Zhang
83bb4b5d97 bird2: bump to version 2.0.12
Signed-off-by: Bradford Zhang <zyc@zyc.name>
(cherry picked from commit 7d6f3c0492)
2023-02-22 11:23:54 +01:00
Nick Hainke
0621622dc5 babeld: remove AUTORELEASE
AUTOREMOVE is now deprecated.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 20e1b16a97)
2023-02-10 10:12:45 +01:00
Nick Hainke
c04e05af56 babeld: update to 1.12.2
Release announcement:
https://alioth-lists.debian.net/pipermail/babel-users/2023-February/004038.html

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit bb65c3a18d)
2023-02-10 08:15:11 +01:00
Bradford Zhang
2c21c1627b bird2: bump to version 2.0.11
Signed-off-by: Bradford Zhang <zyc@zyc.name>
2022-12-21 09:55:53 +01:00
Simon Wunderlich
4e2bdb42f6
Merge pull request #919 from ecsv/batadv-for-21.02
openwrt-21.02: batman-adv: Merge bugfixes from 2022.3
2022-11-11 16:48:40 +01:00
Sven Eckelmann
e2daa846bd batman-adv: Merge bugfixes from 2022.3
* Fix hang up with small MTU hard-interface

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2022-11-10 21:36:54 +01:00
Simon Wunderlich
2822b3488d
Merge pull request #914 from ecsv/batadv-for-21.02
openwrt-21.02: alfred/batman-adv: Rebuild on CONFIG*_ALFRED_*/CONFIG_BATMAN_ADV_ changes
2022-10-24 10:44:34 +02:00
Sven Eckelmann
bbcd264ede alfred: Rebuild on CONFIG*_ALFRED_* changes
The buildsystem doesn't know that the Package/*/config kconfig symbols are
related to the alfred package build. It is necessary to explicitly define it
via PKG_CONFIG_DEPENDS.

Fixes: f76074d424 ("alfred: add alfred 2013.3.0 to feed")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
2022-10-23 10:20:49 +02:00
Sven Eckelmann
2a6caca43d batman-adv: Rebuild on CONFIG_BATMAN_ADV_* changes
The buildsystem doesn't know that the KernelPackage/*/config kconfig
symbols are related to the batman-adv package build. It is necessary to
explicitly define it via PKG_CONFIG_DEPENDS.

Fixes: 522ce8dfdb ("batman-adv: rename folder name to match project & package name")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
2022-10-23 10:14:30 +02:00
Rob White
25e76489c8 mesh11sd: Release v1.2.0
Maintainer: Rob White rob@blue-wave.net
Compile tested: All
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, x86-64, on 21.02, 22.03 and snapshot.

Description:
  * This version adds new functionality.
  * Update README.md
  * Add - Traffic volume, Peers and stations to status output [bluewavenet]
  * Add - limit up-checks to mesh interfaces only [bluewavenet]

 -- Rob White <dot@blue-wave.net>  Mon, 08 Aug 2022 13:40:31 +0000

Signed-off-by: Rob White <rob@blue-wave.net>
(cherry picked from commit 290ed82bd8)
2022-08-14 18:09:10 +02:00
Rob White
03e827edf1 opennds: Release v9.8.0 [21.02]
Maintainer: Rob White rob@blue-wave.net
Compile tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, x86-64
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, x86-64; on 21.02

  * This version adds new functionality, and fixes some issues
  * Fix - suppress stderr in client_params in generic linux [bluewavenet]
  * Fix - client_params on generic linux, remote logo not supported yet [bluewavenet]
  * Fix - compiler warning [bluewavenet]
  * Fix - set voucher script as executable [bluewavenet]
  * Update OpenWrt Makefile [bluewavenet]
  * Add - format footer in Themespec scripts [bluewavenet]
  * Update footer on all scripts [bluewavenet]
  * Update - Community Voucher Themespec [bluewavenet]
  * Add - Check on startup for Y2.038K bug (32 bit time) [bluewavenet]
  * Fix - Remove deprecated Debian specific files [bluewavenet]
  * Add - More css updates [bluewavenet]
  * Add - user friendly RFC8910 page511 text and remove refresh button [bluewavenet]
  * Fix - MHD becomes unresponsive serving page 511 for rfc8910 clients [bluewavenet]
  * Add - extra startup settings - ignore_sigpipe and write nds info [bluewavenet]
  * Add - set MHD connection limit to 100, set MHD listen backlog size to 128, set MHD_HTTP_HEADER_CONNECTION "close" [bluewavenet]
  * Fix - Add missing LOG_CRIT in debug [bluewavenet]
  * Add - some useful diagnostic output in authmon [bluewavenet]
  * Fix - Move testing to community [bluewavenet]
  * Fix - Community - Use tmpfs by default for vouchers.txt file [bluewavenet]
  * Add - README with use instructions and notice about flash wearout [fservida]
  * Fix - Refactor folder structure for community themespec [fservida]
  * Add - Create vouchers.txt [fservida]
  * Add - Create theme_voucher.sh [fservida]
  * Update - README.md [bluewavenet]
  * Add - image download info message [bluewavenet]
  * Add - css updates [dianariyanto]
  * Add - allow downloaded remotes refresh for all modes [bluewavenet]
  * Add - download_resources.sh to installed files [bluewavenet]
  * Add - support for download of custom images and files in the status.client page [bluewavenet]
  * Remove - Debian man page support [bluewavenet]
  * Fix - Add missing mkdir command in Makefile [dzatoah]
  * Fix - typos in src/{conf, main}.c [dzatoah]

Signed-off-by: Rob White <rob@blue-wave.net>
2022-08-10 07:53:59 +02:00
Toke Høiland-Jørgensen
b08cc3eef4
Merge pull request #897 from mbargo23/bird21.02
bird2: bump to version 2.0.10
2022-06-29 15:10:57 +02:00
Jan Betik
ebf29ae836
bird2: bump to version 2.0.10
Signed-off-by: Jan Betik <jan.betik@nic.cz>
(cherry picked from commit 1fa9fa339c)
2022-06-29 14:35:57 +02:00
Nick Hainke
e3f0d89220 olsrd: replace patch for storms with real patch
Fixes: bb5bbc6afd ("olsrd: import patch to prevent olsr storms")

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit cfd82729a9)
2022-06-23 14:04:47 +02:00
William Fleurant
846a7fd72f cjdns: support the supernodes feature (#884)
Signed-off-by: William Fleurant <meshnet@protonmail.com>
(cherry picked from commit d705f79890)
Signed-off-by: Nick Hainke <vincent@systemli.org>
2022-06-21 00:00:51 +02:00
William Fleurant
6b7863eb0f cjdns: bump v21.1 and patch find-python (#883)
* cjdns: bump source from v21 to v21.1
* cjdns: bump release with patch to prefer python2
* cjdns: refresh patches and remove patch musl

Signed-off-by: William Fleurant <meshnet@protonmail.com>
(cherry picked from commit 217330bb5e)
Signed-off-by: Nick Hainke <vincent@systemli.org>
2022-06-20 23:31:14 +02:00
Nick Hainke
bdefc8348b naywatch: add log when naywatch activates
Naywatch now prints
  naywatch: Naywatch Activated!
when becoming active.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 09d5ceb923)
2022-06-10 10:34:10 +02:00
Rosen Penev
ba06292f31 oonf-dlep-radio: fix compilation with Ninja
Signed-off-by: Rosen Penev <rosenp@gmail.com>
(cherry picked from commit 034ec30869)
2022-06-10 01:49:59 +02:00
Nick Hainke
96c9214707 oonf-olsrd2: set PKG_MIRROR_HASH and refresh patch
Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit d709225ed0)
2022-06-10 01:49:59 +02:00
Rosen Penev
af958cfd79 oonf-olsrd2: fix compilation with Ninja
Signed-off-by: Rosen Penev <rosenp@gmail.com>
(cherry picked from commit 519d7bae29)
2022-06-10 01:49:59 +02:00
Rob White
bfd645b8a8 mesh11sd: Release v1.1.1
Maintainer: Rob White rob@blue-wave.net
Compile tested: All
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, x86-64, on 21.02.2 and snapshot.

Description:
  * This version adds new functionality, and fixed some issues
  * Fix - repeated syslog messages - output only on mode change [bluewavenet]
  * Add - service status to json output [bluewavenet]
  * Add - support for multiple mesh interfaces [bluewavenet]
  * Fix - duplicate ifname if more than one mesh interface [bluewavenet]
  * Add - compatibility with iw < v5.16-1 [bluewavenet]
  * Add - search and delete phantom meshnodes [bluewavenet]

Signed-off-by: Rob White <rob@blue-wave.net>
(cherry picked from commit 1cd90655da)
2022-05-22 10:58:08 +02:00
Nick Hainke
bbf05e4082 babeld: rewrite description
Babel is now a IETF standard. Update the package description.
Fixes: #867

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 983096d308)
2022-05-19 15:37:53 +02:00
Nick Hainke
8cf177a86c babled: update to 1.12.1
Changelog:
916d3d9 Update CHANGES for babeld-1.12.1
3d8aec4 Schedule an interface check after adding an interface.
f13602b Split last PC into unicast and multicast values

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 9028f67afd)
2022-05-19 15:18:27 +02:00
Simon Wunderlich
d159eb55d2
Merge pull request #859 from ecsv/batadv-for-21.02
openwrt-21.02: batman-adv: Merge bugfixes from 2022.0
2022-05-08 15:00:28 +02:00
Nick Hainke
03fededc74 babeld: update to 1.12
Changelog:

5 May 2022: babeld-1.12

  * Implement v4-via-v6 routing (RFC 9229), which allows a router with
    IPv4 addresses only to route IPv4.  Thanks to Théophile Bastian.
  * Enable extended Netlink acks when available.
    Thanks to Toke Høyland-Jørgensen.
  * Fix restoring of interface configuration to avoid unbounded memory
    consumption.  Thanks to andrew-hoff.
  * Fix handling of deny filters in the install chain.

Refreshed patches:
- 600-add-ubus.patch

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit b35766330b)
2022-05-08 13:07:37 +02:00
Sven Eckelmann
272b8f8afc alfred: Merge bugfixes from 2022.1
* Ensure processed change_iface packet is 0-terminated

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2022-05-06 22:58:20 +02:00
Sven Eckelmann
bc04956c59 batctl: Merge bugfixes from 2022.1
* ping: Skip sleep after last packet

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2022-05-06 22:50:18 +02:00
Sven Eckelmann
09a054faf9 batman-adv: Merge bugfixes from 2022.1
* Request iflink once in batadv-on-batadv check
* Request iflink once in batadv_get_real_netdevice
* Don't expect inter-netns unique iflink indices
* Don't skb_split skbuffs with frag_list

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2022-05-06 22:50:18 +02:00
Simon Wunderlich
b987eb3a90
Merge pull request #853 from ecsv/batadv-for-21.02
openwrt-21.02: batman-adv: compat: Add atomic mc_forwarding support for stable kernels
2022-04-18 13:59:37 +02:00
Sven Eckelmann
b8461cc299 batman-adv: compat: Add atomic mc_forwarding support for stable kernels
Eric Dumazet changed the mc_forwarding in commit 145c7a793838 ("ipv6: make
mc_forwarding atomic") the type of mc_forwarding from __s32 to an atomic_t.
This patch was then ported to various stable kernels.

This code change caused a FTBFS when in batman-adv when
CONFIG_BATMAN_ADV_MCAST was activated. To work around this problem, provide
a version for kernels with __s32 mc_forwarding and a version for kernel
with atomic_t mc_forwarding.

Fixes: #850
Reported-by: Huangbin Zhan <zhanhb88@gmail.com>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
2022-04-17 14:07:15 +02:00
Rob White
a0d61bddb3 mesh11sd: [New Package] Release v1.0.0
Maintainer: Rob White rob@blue-wave.net
Compile tested: All
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, x86-64, on 21.02.2

Description:
  Mesh11sd is a dynamic parameter configuration daemon for 802.11s mesh networks.
  It was originally designed to leverage 802.11s mesh networking at Captive Portal venues.
  This is the open source version and it enables easy and automated mesh network operation with multiple mesh nodes.
  It allows all mesh parameters supported by the wireless driver to be set in the uci config file.
  Settings take effect immediately without having to restart the wireless network.
  Default settings give rapid and reliable layer 2 mesh convergence.
  Without mesh11sd, many mesh parameters cannot be set in the uci wireless config file as the mesh interface must be up before the parameters can be set.
  Some of those that are supported, would fail to be implemented when the network is (re)started resulting in errors or dropped nodes.
  The mesh11sd daemon dynamically checks configured parameters and sets them as required.
  This version does not require a Captive Portal to be running.

Signed-off-by: Rob White <rob@blue-wave.net>
(cherry picked from commit b4ab896894)
2022-04-09 11:25:42 +02:00
Nick Hainke
6166db3224 naywatch: fix reboot_now
Naywatch should first try to reboot normally, and if that does not work
do a hard reboot. However, the hard reboot was never called.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 65f747a8bc)
2022-04-01 10:31:05 +02:00
Nick Hainke
c96b10188b babeld: bump to version 1.11
30 March 2022: babeld-1.11

  * Implemented MAC authentication (RFC 8967).  Thanks to Clara Dô,
    Weronika Kołodziejak and Antonin Décimo.
  * Changed the interface of the add_filter function in order to simplify
    integration in OpenWRT.  Thanks to Nick Hainke.

Detailed List:
7c053fe Export add_filters and simplify interface.
91c44f8 Rename blake2s to blake2s128.
dda8d63 Update CHANGES.
43a0066 Allow Blake2s keys up to 32 bytes.
375ea5f Rename interface option hmac to key.
1b9abc4 Replace hmac-verify with accept-bad-signatures.
3777eb4 Ignore .gitmodules when releasing an archive.
3551b45 Simplify and fix preparse phase.
ba8f116 Add rate limitations for challenges.
6d44238 Show PC number.
ceda3a0 Expire Index and challenge timer.
d66a4d2 Ignore a Challenge Request received on multicast.
024c17a Fix confusion between INDEX_LEN and NONCE_LEN when sending PC TLV.
ceb021f Fix double-free in error path.
1e08aed Change no_hmac_verify to hmac-verify.
c7ad387 Use 'hmac-sha256' and not 'sha256'.
5a15957 Fix nodes incorrectly rejecting packets.
af02039 Append a PC message if Babel-MAC is enabled.
46fc7da Follow the spec closely for the preparse phase.
87f39d0 Rename MAC functions and constants to match the spec.
02b14e3 Helpful error messages in key configuration.
d763f3e Error if configured key can't be found.
3cb0ab7 Use RFC3542 for IPv6 on macOS.
69df1cb Use _GNU_SOURCE instead of __USE_GNU.
ef3a113 Don't copy nonce, suppress VLA.
c243769 Move key validation in parse_key.
b06b2fc Constify source argument of fromhex.
9529941 Use AUTH_TYPE_NONE consistently.
d922b64 Document the HMAC options in manual page.
0c4afc2 Only allow keys configured on a given interface.
7de6715 Create neighbour after checking HMAC.
ecd1f42 Fix typo in compare_hmac.
9a5de34 Fix HMAC-SHA-256 computation.
f1051fd Fix constants to be consistent with SHA-256.
9688b68 Fix memory leaks in error-handling paths in configuration parser.
4d8a831 Fix some more (read-only) buffer overflows.
ebda926 Fix potential memory leaks.
d53fec0 Use AUTH_TYPE_* consistently.
a1afd51 Add no_hmac_verify flag.
b4e28f2 Fix ordering of fields in pseudo-header.
c8ace8b Use IANA-assigned TLV numbers.
739f76a Implement HMAC authentication.
e3adf47 Compile with SHA-256 and Blake2s.
ca0a512 Add SHA-2 and Blake2 submodules.
756783e Untabify

Remove upstreamed patches:
- 000-export-add-filters-and-simplify-interface.patch

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit dbff012a2f)
2022-03-31 13:12:14 +02:00
Petr Štetiar
5edac3e213 ci: use openwrt/gh-action-sdk@v4
In order to use feeds from GH mirror for GH actions, thus saving a lot
of resources being wasted. While at it fix whitespace issue.

Signed-off-by: Petr Štetiar <ynezz@true.cz>
[applied to routing feed]
[whitespace issue not existing in routing feed]
Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 5702d2e40b)
2022-03-30 23:20:23 +02:00
Paul Spooren
0d5e81403d CI: update SDK action to v3
No also check mirror hashes and badly formated init files

Signed-off-by: Paul Spooren <mail@aparcar.org>
[applied to routing feed]
Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 2134c56d12)
2022-03-30 23:20:23 +02:00
Nick Hainke
15d83eff07 babeld: add add_filter function
You can define filter functions in babeld by:

   in if eth0 metric 128

This commit adds the ubus equivalent to dynamically add filter on
runtime:

  ubus call babeld add_filter '{"ifname":"eth0", "type":"input",
                                "metric":128}'

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit a618159d33)
2022-03-30 12:44:35 +02:00
Nick Hainke
7c7d11e290 olsrd: set lqm via ipc
You can now give a lqm when adding an interface:
  ubus call olsrd add_interface '{"ifname":"wg_51821", "lqm":"0.5"}'

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit e3c6842923)
2022-03-26 19:00:40 +01:00
Rob White
fc0b140689 opennds: Release v9.7.0 (for 21.02)
Maintainer: Rob White rob@blue-wave.net
Compile tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, x86-64, on 21.02.2

  * This version adds new functionality, and fixes some issues
  * Fix - syntax error (missing comma) in awk command in bash on generic Linux [bluewavenet]
  * Add - option to append serial number suffix to gatewayname [bluewavenet]
  * Add - block use of ip aliases on gateway interface [doctor-ox] [bluewavenet]
  * Fix - ndsctl json syntax error [bluewavenet]
  * Add - check for null variables in key value pairs in MHD callbacks [bluewavenet]
  * Fix - changed some notice messages into debug messages [bluewavenet]
  * Fix - possible return of incorrect pid [doctor-ox] [bluewavenet]
  * Fix - possible abiguities resulting in failure to parse parameters correctly [bluewavenet]
  * Fix - Remove deprecated get_client_token.sh [bluewavenet]
  * Fix - Prevent possible malformed mac address returned from dhcpcheck() [doctor-ox] [bluewavenet]

Signed-off-by: Rob White <rob@blue-wave.net>
2022-03-22 22:09:42 +01:00
William Fleurant
5971f1937c cjdns: pass for some build warnings (#738)
Compile time changes reviewed by cjd.
Due to stricter compiler(s) we do not
want to error for these warnings.

Caused by: ...reading "past the end"
of a struct, because the struct is
actually a header and the body is of
unknown size. Compilers got stricter
and this became a warning.

Signed-off-by: William Fleurant <meshnet@protonmail.com>
(cherry picked from commit 71c11ab1b7)
[Fix compiling]
Signed-off-by: Nick Hainke <vincent@systemli.org>
2022-03-13 13:29:34 +01:00
Etienne Champetier
b88e322a51 cjdns: fix uci-defaults (#714)
Since https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=4b9a67362d70c544b85078b8d5c661f43f7472d9,
uci network config interface sections use 'device' instead of 'ifname'

Even if 'device' seems to always be set by
package/base-files/files/bin/config_generate, we keep the fallbacks
in case someone install the package via opkg and has a non migrated
network config

Signed-off-by: Etienne Champetier <champetier.etienne@gmail.com>
(cherry picked from commit 383c52ff8d)
2022-03-07 09:48:31 +01:00
Josef Schlehofer
6501c70f44 mrd6: Makefle reordering
- Switch to AUTORELEASE

- Changed package versioning:
Before: mrd6_2013-11-30-c805eb33255dbc0b6647d463c6c67d1c9d3105a0-3_arm_cortex-a9_vfpv3-d16.ipk
After: mrd6_2013-11-30-c805eb33-1_arm_cortex-a9_vfpv3-d16.ipk

- Remove defaults, which are already defaults

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
(cherry picked from commit e06a6c962b)
2022-02-26 17:04:48 +01:00
Eneas U de Queiroz
fb03ab09c8 mcproxy: include PKG_MIRROR_HASH, refresh patches
This avoids unnecessary downloads and rebuilds.
Patches were refreshed to please github PR checks.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
(cherry picked from commit 564ca99e2c)
2022-02-26 15:34:32 +01:00
Eneas U de Queiroz
3b84442486 pimbd: include PKG_MIRROR_HASH
This avoids unnecessary downloads and rebuilds.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
(cherry picked from commit ade1fa6ebc)
2022-02-26 15:34:32 +01:00
Eneas U de Queiroz
65ae8eadd7 minimalist-pcproxy: include PKG_MIRROR_HASH
This avoids unnecessary downloads and rebuilds.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
(cherry picked from commit e9d5f990a3)
2022-02-26 15:34:32 +01:00
Eneas U de Queiroz
4dfa42ee42 mrd6: include PKG_MIRROR_HASH
This avoids unnecessary downloads and rebuilds.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
(cherry picked from commit 9cb03f0a2f)
2022-02-26 15:34:32 +01:00
Josef Schlehofer
fd76bed2c3 oonf-dlep-radio: refactor define Package/oonf-dlep-radio
- Why there was oonf-git? WTF?
- Use two spaces instead of tabs

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
(cherry picked from commit 282af3f8bc)
2022-02-26 13:07:35 +01:00
Josef Schlehofer
3c70d0155e oonf-dlep-radio: refactor Makefile (package versioning, downloading)
- By this change, we are using downloading .tar.xz (which is default in OpenWrt)
Reference: OpenWrt base repository include/download.mk

Downloaded tarball size is ~60 kB smaller.

- Removed "v" in package naming.
Before: oonf-dlep-radio_v0.15.1_arm_cortex-a9_vfpv3-d16.ipk
After: oonf-dlep-radio_0.15.1_arm_cortex-a9_vfpv3-d16.ipk

Removed stuff, which is no longer needed like PKG_REV.

- Switch to AUTORELEASE in PKG_RELEASE

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
(cherry picked from commit 56fc0d7226)
2022-02-26 13:07:35 +01:00
Nick Hainke
550502cbd6 oonf-dlep-proxy: add PKG_MIRROR_HASH
Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 24b27f0875)
2022-02-26 10:09:18 +01:00
Rosen Penev
b99b6faf95 oonf-dlep-proxy: fix compilation with Ninja
Signed-off-by: Rosen Penev <rosenp@gmail.com>
(cherry picked from commit c762d3fd0f)
2022-02-26 10:09:18 +01:00
Nick Hainke
e2eaefef59 oonf-dlep-radio: add PKG_MIRROR_HASH
Fixes:
oonf-dlep-radio-v0.15.1.tar.bz2: Download from https://github.com/OLSR/OONF.git failed
oonf-dlep-radio-v0.15.1.tar.bz2: Requires sha256sum for verification

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 9a90e3dd65)
Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
[added commit message]
2022-02-25 07:57:03 +01:00
Rob White
0de13bc5f4 opennds: Release v9.6.0 (for 21.02)
Maintainer: Rob White rob@blue-wave.net
Compile tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, gl-inet b1300, gl-inet mt300n-v2, Snapshot, 21.02.1, 19.07.8

Description:
This version adds new functionality, and fixes some issues
It requires iptables(legacy)
  * Fix - correctly display return buffer in syslog [bluewavenet]
  * Add - use heap allocation for library call return buffer [bluewavenet]
  * Fix - OpenWrt, fhook request for fw3 [bluewavenet]
  * Add - spider remote urls before downloading [bluewavenet]
  * Add - OpenWrt, revert uncommitted uci updates at startup and shutdown [bluewavenet]
  * Fix - remove unneccesary flash writes and fix hosts updates [doctor-ox] [bluewavenet]
  * Add - Updated splash images [bluewavenet]
  * Add - OpenWrt makefile for nft or ipt dependencies [bluewavenet]
  * Fix - grep by word to prevent any ambiguity [doctor-ox] [bluewavenet]
  * Fix - ensure rate limiting is disabled if rate thresholds are set to zero [bluewavenet]
  * Add - querystring support for client status page [bluewavenet]
  * Add - Advanced/standard status page checkbox [bluewavenet]
  * Add - set default session timeout to 24 hours [bluewavenet]
  * Fix - potential buffer overflow [bluewavenet]
  * Fix - Restrict max packet limit to iptables maximum [bluewavenet]
  * Fix - descriptive labels on ndsctl status output [bluewavenet]
  * Add - update of README.md [bluewavenet]
  * Fix - Added required variable to FAS return string example documentation [dorkone]
  * Add - Default checkinterval set to 15 seconds [bluewavenet]
  * Fix - incoming and outgoing counters when unlimited bursting is enabled [bluewavenet]
  * Add - maximum bucket size configuration [bluewavenet]
  * Add - calculate moving average packet size for rate limiting [bluewavenet]
  * Add - some operational default values [bluewavenet]
  * Add - initial rate limits when unrestricted bursting is disabled [bluewavenet]
  * Add - Require clients to be in the dhcp database [bluewavenet]
  * Add - dhcpcheck library call [bluewavenet]
  * Fix - Remove trailing whitespace when getting clientaddress if client not active [bluewavenet]
  * Fix - Segfault when FAS fails to Return customstring [dorkone] [bluewavenet]
  * Add - Enable/Disable unrestricted bursting [bluewavenet]
  * Add - gatewayurl to querystring and use in place of originurl in FAS [bluewavenet]
  * Fix - more accurate debug message [bluewavenet]
  * Fix - Show packet rate correctly as packets per minute [bluewavenet]
  * Add - Report Packet Rate and Bucket Size in ndsctl status and json and status client page [bluewavenet]
  * Add - rate limit refresh to client limit rules [bluewavenet]
  * Fix - code readability [bluewavenet]
  * Fix - Documentation for data sent to Authmon Daemon [bluewavenet]
  * Add - Show unrestricted burst intervals in ndsctl status [bluewavenet]
  * Add - Set default bucket ratios to 10 [bluewavenet]

Signed-off-by: Rob White <rob@blue-wave.net>
2022-02-20 12:54:37 +01:00
Nick Hainke
10d3ffd8b3 olsrd: fix setting default interface config
The IPC should apply the "InterfaceDefaults".

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 4afbe17480)
2022-02-13 18:32:20 +01:00
Simon Wunderlich
a9bf9947ed
Merge pull request #782 from ecsv/batadv-for-21.02
openwrt-21.02: batman-adv: Merge bugfixes from 2022.0
2022-02-03 21:21:49 +01:00
Sven Eckelmann
9e2383e9b4 batman-adv: Merge bugfixes from 2022.0
* allow netlink usage in unprivileged containers
* mcast: don't send link-local multicast to mcast routers

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2022-02-03 20:17:50 +01:00
Nick Hainke
bb0f31a7a7 babeld: remove unused return variable
There is an unused variable in the function. Remove it.

Fixes: 3852004435 ("babeld: add add_interface function").

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 879725ce3e)
2022-02-01 21:53:04 +01:00
Nick Hainke
bcc3588328 babeld: add add_interface function
An interface can be added dynmiacally to babeld by starting babeld with
the local management interface (-G) and saying:
  interface eth0

Add the ubus equivalent of this function:
  ubus call babeld add_interface '{"ifname":"eth0"}'

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 3852004435)
2022-02-01 21:53:04 +01:00
Nick Hainke
c2e138d49f olsrd: add ubus ipc integration to olsrd
IPC integration of olsrd with OpenWrt. Allow dynamic adding and removing
of interfaces at run-time. We need to rename the avl-tree files, since
libubox also defines avl tree. Also add patch to allow meshing via
wireguard point-to-point links.

The ubus interface offers following functions:
  - add_inteface '{"ifname":"wg_51820"}'
  - del_inteface '{"ifname":"wg_51820"}'

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 0bffe620b4)
2022-01-17 09:41:46 +01:00
Paul Spooren
7d07ef90fd CI: fix runtime testing for non master branch
The runtime testing always ran on master branch aka snapshots since the
branch wasn't passed over to the container execution!

Signed-off-by: Paul Spooren <mail@aparcar.org>
(cherry picked from commit 817240b07c)
2022-01-15 14:43:38 +01:00
Nick Hainke
61cd00cb8e naywatch: introduce kick-count
Check multiple rounds if neighbors are available before kicking. This
should reduce unneeded reboots.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 24285ce4fc)
2022-01-13 10:10:03 +01:00
Nick Hainke
440e7af339 naywatch: fix mode without watchdog
The if-condition was always evaluated to be true.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit cf34c5a4a1)
2022-01-13 09:04:43 +01:00
Nick Hainke
c8b613e11c olsrd: fix meshing via wireguard tunnels
The procd script was not adding the wireguard interfaces. Add corner case
in the init script to allow meshing via wireguard.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 576967a2a3)
2022-01-08 22:55:55 +01:00
Rob White
a85b7c7ea8 opennds: Release v9.5.1 (for 21.02)
Maintainer: Rob White rob@blue-wave.net
Compile tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, gl-inet b1300, gl-inet mt300n-v2, Snapshot, 21.02.1, 19.07.8

Description:
This version adds new functionality, and fixes some issues
  * Fix - ThemeSpec file downloads when mwan3 is running [bluewavenet]
  * Fix - Preemptive auth failure after previous deauth [minhng99] [bluewavenet]

From v9.5.0
  * Add - use average packet size instead of MTU when implementing rate limiting [bluewavenet]
  * Fix - typo in iptables command and remove a redundant command [bluewavenet]
  * Add - startdaemon() and stopdaemon() utility functions [bluewavenet]
  * Add - combined interface/ipaddress external gateway status monitoring [bluewavenet]
  * Fix - potential online/offline detection problem when mwan3 is running [bluewavenet]
  * Add - get_debug_level and syslog library calls [bluewavenet]
  * Fix - correctly reset upload and download rate rules [bluewavenet]
  * Add - extend upstream gateway checking for use with mwan3 loadbalance/failover [bluewavenet]
  * Fix - Potential NULL pointer segfault in http_microhttpd on calling authenticated() [bluewavenet]
  * Fix - Potential NULL pointer segfault in http_microhttpd on calling preauthenticated() [dddaniel]
  * Add - Calculate Bucket size based on achieved burst rate [bluewavenet]
  * Fix - prevent parameter parsing if clientip not known [bluewavenet]
  * Add - disable rate quotas by setting bucket ratio to zero [bluewavenet]
  * Fix - suppress some debug messages [bluewavenet]
  * Add - more libraries documentation [bluewavenet]
  * Add - library calls startdaemon and stopdaemon [bluewavenet]
  * Fix - Increase buffer length for longer interface names [koivunen]
  * Add - Update README.md [bluewavenet]
  * Add - bucket ratio option to config file [bluewavenet]
  * Add - upload and download bucket ratio config values [bluewavenet]
  * Fix - flag initial debuglevel to externals [bluewavenet]
  * Add - limit-burst tuning to rate quotas [bluewavenet]
  * Fix - add trailing space to defaultip [bluewavenet]
  * Add - record pre-emptive authentication in local log [bluewavenet]
  * Add - Write to local log function to libopennds [bluewavenet]
  * Add - set client_type and custom string for Pre-emptive authentication [bluewavenet]
  * Fix - Remove trailing newline from library call response [bluewavenet]
  * Fix - attempt to remove cid file only if client->cid is set [bluewavenet]
  * Add - a skip option for custom downloads to speed up serving page from themespec [bluewavenet]
  * Add - put client_type into query string when type is cpd canary [bluewavenet]
  * Add - set refresh=0 before loading images [bluewavenet]
  * Fix - Truncated return status [bluewavenet]
  * Add - Acknowlegement from call to dnsconfig [bluewavenet]
  * Fix - potential buffer overflow in debug output [bluewavenet]
  * Add - processing of custom data and client type [bluewavenet]
  * Add - Client Type for RFC8908 and RFC8910 clients [bluewavenet]
  * Add - rfc8908 replies for external FAS and refactor memory management for MHD calls [bluewavenet]
  * Add - send error 403 if client is not on openNDS subnet [bluewavenet]
  * Fix - remove uneccessary safe_asprint in auth.c [bluewavenet]
  * Fix - Initialise buffer to prevent receiving spurious characters [bluewavenet]
  * Add - encoded custom data support to ndsctl json, themespec and binauth [bluewavenet]
  * Add - advert_1.htm to thankyou page of theme_click-to-continue-custom-placeholders.sh [bluewavenet]
  * Add - library call get_interface_by_ip [bluewavenet]
  * Add - function encode_custom() for encoding custom data to be sent to openNDS [bluewavenet]
  * Fix - error 511, make all html refrences absolute to enforce link to MHD [bluewavenet]
  * Add - check status_path exists and is executeable [bluewavenet]
  * Fix - regression causing error 511 to be served from default script [bluewavenet]
  * Add - venue-info-url and can-extend-session json keys [bluewavenet]
  * Add - RFC 8908 initial experimental support [bluewavenet]
  * Add - debug message when resetting client [bluewavenet]
  * Fix - Ensure the ndscids directory exists before trying to write to it. [bluewavenet]
  * Fix - use eval in do_ndsctl to allow quoting of arguments [bluewavenet]
  * Fix - ensure client hid and client cid file is reset correctly [bluewavenet]
  * Fix - Titles of example ThemeSpec Files [bluewavenet]
  * Fix - Ensure ThemeSpec Files are executable [bluewavenet]
  * Remove - deprecated Allowed and Blocked entries in ndsctl status output [bluewavenet]
  * Add - Deprecate option macmechanism, allowedmaclist and blockedmaclist [bluewavenet]

Signed-off-by: Rob White <rob@blue-wave.net>
2021-12-19 14:00:22 +01:00
Maarten Aertsen
d4622d86bf ohybridproxy: revert to default log level
Change log level from debug to info to avoid filling up syslog with query-level logging.

Signed-off-by: Maarten Aertsen <spam-github@rtsn.nl>
(cherry picked from commit 4f235865e7)
2021-12-08 15:52:54 +01:00
Simon Wunderlich
b2a330202a
Merge pull request #758 from ecsv/batadv-for-21.02
openwrt-21.02: batman-adv: Prevent use from libc headers to not build with BIG_ENDIAN
2021-11-28 17:53:16 +01:00
Hendrik Borghorst
47436b04fd batman-adv: Prevent use from libc headers to not build with BIG_ENDIAN
Commit 97d35a552ec5b6ddf7923dd2f9a8eb973526acea of musl introduced the
macros __LITTLE_ENDIAN and __BIG_ENDIAN in alltypes.h. These are pulled
into the compilation of batman-adv. This has the side effect that the
function is_multicast_ether_addr of etherdevice.h in Linux kernel is
compiled as the big endian version and so fails to work properly on
little endian devices.

This commits prevents pulling in header files of musl libc similar to
OpenWRT commit 9ac47ee46918c45b91f4e4d1fa76b1e26b9d57fe

Signed-off-by: Hendrik Borghorst <hendrikborghorst@gmail.com>
(cherry picked from commit 523821c195)
Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-11-27 15:16:12 +01:00
Simon Wunderlich
da7d7a0255
Merge pull request #751 from ecsv/batadv-for-21.02
openwrt-21.02: batman-adv: Merge bugfixes from 2021.4
2021-11-19 17:54:43 +01:00
Sven Eckelmann
6d10a01dfa batman-adv: Merge bugfixes from 2021.4
* fix error handling during interface initialization

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-11-19 17:05:03 +01:00
Nick Hainke
3336ecd33c naywatch: warn user
Naywatch in combination with the watchdog can be tricky and dangerous
when doing a sysupgrade. Add a warning to always stop naywatch first and
check if procd took control over the watchdog again.

Also change use_watchdog to '0'.

Signed-off-by: Nick Hainke <vincent@systemli.org>
2021-11-15 19:57:06 +01:00
Nick Hainke
9e7698f20d babeld: remove unnecessray blob_buf_init calls
For some reason the buffer is initialized twice before filling it.
This does not break anything but is useless. Reduce the initialization
to only one.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 2cf253b3df)
2021-10-21 01:48:04 +02:00
Nick Hainke
c524118d29 babeld: free blob-buffers that are on stack
As Felix mentioned:
If a buffer was already allocated, blob_buf_init reuses it. You can
keep reusing it as many times as you want. You only need to call
blob_buf_free if you explicitly want to free the buffer memory
(e.g. on exit, or if the blob_buf is on stack).

http://lists.openwrt.org/pipermail/openwrt-devel/2021-October/036722.html

This PR frees the blob-buffers that are on the stack.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 6d463ca97c)
2021-10-16 13:28:38 +02:00
Perry Melange
1fcda9dfa8 olsrd: wait for wireless to initialize before starting
Wait for wireless to initialize (pending="false") to ensure
that any olsrd(6) configured interfaces and their associated
devices are up.  This provides the init script the ability
to properly add all interface sections to the generated
config file /tmp/etc/olsrd(6).conf

Signed-off-by: Perry Melange <isprotejesvalkata@gmail.com>
(cherry picked from commit 0bb6aa04f6)
2021-10-13 11:35:31 +02:00
Nick Hainke
d8b4457267 naywatch: fix procd handling
Sometimes, naywatch can not handover the watchdog to procd again using
ubus. We need to call the same ubus command multiple times until procd
takes over control again.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit e35255710b)
2021-10-01 12:12:47 +02:00
Rob White
c30b5d5df3 opennds: Release v9.4.0 (for 21.02)
Maintainer: Rob White rob@blue-wave.net
Compile tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, gl-inet b1300, gl-inet mt300n-v2, Snapshot, 21.02.0, 19.07.8

Description:
This version adds new functionality, and fixes some issues
  * Add - Error message in fas-aes-https if shared key is mismatched [bluewave.net]
  * Fix - and refactor error 511 page generation[bluewave.net]
  * Fix - and refactor dnsmasq configuration [bluewave.net]
  * Fix - Typographic error preventing RFC8910 disable [bluewave.net]
  * Add - gateway address and gatewayfqdn to ndsctl json output [bluewave.net]
  * Add - RFC8910 housekeeping on startup and shutdown [bluewave.net]
  * Add - correctly apply dhcp option 114 for generic Linux [bluewave.net]
  * Add - reading of configured ndsctlsocket in ndsctl utility[bluewave.net]
  * Add - use send_error 200 for MHD watchdog [bluewave.net]
  * Add - generation of page_511 html by library script [bluewave.net]
  * Add - extend debuglevel support to library scripts [bluewave.net]
  * Refactor - fas-aes-https to simplify and make customisation of http easier [bluewave.net]
  * Add - library script for error 511 page, allowing customisation [bluewave.net]
  * Add - make authmon report connection error details [bluewave.net]
  * Fix- remove unwanted debug message in ndsctl [bluewave.net]
  * Add - RFC8910 support by default [bluewave.net]
  * Add - display status page when accessing /login when authenticated [bluewave.net]
  * Add - MHD response to RFC8910 requests [bluewave.net]
  * Add - Dnsmasq RFC8910 configuration [bluewave.net]
  * Add - send error 511 in response to unsupported http method [bluewave.net]
  * Add - Check for ca-bundle on OpenWrt, if not installed, add syslog messages and terminate [bluewave.net]
  * Add - Make ndsctl use the configured value for socket path if set and deprecate -s option [bluewave.net]
  * Add - Warning message when Walled Garden port 80 is allowed [bluewave.net]
  * Fix - remove un-needed pthread_kill in termination_handler() [bluewave.net] [T-X]
  * Fix - debug messages from authmon.sh [bluewave.net]
  * Fix - Allow disabling gateway fqdn, facilitating access to router port 80 [bluewave.net]
  * Fix - Segfault in ndsctl when -s option is used incorrectly [bluewave.net] [T-X]
  * Fix - Typo making calculation of ul/dl rates incorrect [bluewave.net]
  * Fix - Allow port 80 to be configured in the Walled Garden [bluewave.net]

Signed-off-by: Rob White <rob@blue-wave.net>
2021-09-24 15:34:00 +02:00
Simon Wunderlich
c30c9ffc93
Merge pull request #717 from ecsv/batadv-for-21.02
openwrt-21.02: batman-adv: Merge bugfixes from 2021.2
2021-08-20 22:46:42 +02:00
Sven Eckelmann
e294a22464 batman-adv: Refresh patches with quilt
The test builds are now requiring quilt refreshed patches instead of git
patches. Otherwise the build check will not even try to build something.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-08-20 12:35:52 +02:00
Sven Eckelmann
519ef4ad29 batman-adv: Merge bugfixes from 2021.2
* Avoid WARN_ON timing related checks

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-08-20 12:35:52 +02:00
Nick Hainke
8d93475e79 olsrd: add filtergw plugin
The plugin adds a possibility to filter out gateway HNAs. This can be
very handy e.g. for faulty nodes. A gateway can be taken out directly on
a central node and all traffic is then redirected. Also the underlying
smart gateways are adapted. Currently the link multiplier is often used
to control a faulty node, but it is not necessarily the best way to do
so.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit bdec65a6d9)
2021-08-14 14:45:44 +02:00
Nick Hainke
76a7bc7555 olsrd: update to 2021-06-21
- filtergw: add plugin allow to allow/block gateways
    (even smartgateway)

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit a302ee6265)
2021-08-14 14:45:44 +02:00
Nick Hainke
3912935ab1 olsrd: use SPDX
Use SPDX license headers to be machine readable.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 1326a6c252)
2021-08-14 14:45:44 +02:00
Matt Reeve
69e2fe6651 bird2: Fix bus error on OSPF on IPQ806X
On a Netgear R7800, if ospf v2 or v3 is configured in bird.conf, it fails to start with this error:

Fri Jun 11 14:41:11 2021 daemon.info bird: Started
Fri Jun 11 14:41:11 2021 kern.err kernel: [ 3500.853248] Alignment trap: not handling instruction f44c0a1f at [<00035848>] Fri Jun 11 14:41:11 2021 kern.alert kernel: [ 3500.853283] 8<--- cut here ---
Fri Jun 11 14:41:11 2021 kern.alert kernel: [ 3500.859363] Unhandled fault: alignment exception (0x801) at 0x007e0624
Fri Jun 11 14:41:11 2021 kern.alert kernel: [ 3500.862443] pgd = 0bbef4fd
Fri Jun 11 14:41:11 2021 kern.alert kernel: [ 3500.868821] [007e0624] *pgd=5d6ca835, *pte=5c40b75f, *ppte=5c40bc7f

The problem is due to a struct not being properly aligned on the ARMv7 architecture.

This patch fixes the problem by adding the "PACKED" macro to the affected struct. Note
that upstream may later fix this in another way, in which case this patch will not be required.

Signed-off-by: Matt Reeve <matt@mreeve.com>
2021-08-11 16:17:26 +02:00
Rob White
79a8e562a3 opennds: Release v9.3.0
Maintainer: Rob White rob@blue-wave.net
Compile tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, gl-inet b1300, gl-inet mt300n-v2, Snapshot, 21.02.0-rc3, 19.07.7

Description:
This version adds new functionality, and fixes some issues
  * Add - firewall passthrough mode for authenticated users [bluewave.net]
  * Add - use configured debuglevel in authmon [bluewave.net]
  * Add - automated log rotation and client_zone to binauth_log [bluewave.net]
  * Add - increased timeout interval for file downloads [bluewave.net]
  * Add - local interface to MeshZone and remove unneeded call to ip utility [bluewave.net]
  * Add - log_mountpoint and max_log_entries options [bluewave.net]
  * Add - config variables ext_interface and ext_gateway [bluewave.net]
  * Add - Start initial download of remotes only if online [bluewave.net]
  * Add - Router online/offline watchdog [bluewave.net]
  * Fix - Segfault when gatewayfqdn is disabled [bluewave.net]
  * Fix - missing clientmac when not using themespec [bluewave.net]
  * Fix - some compiler warnings [bluewave.net]
  * Fix - use configured value for webroot for remote image symlink to images folder [bluewave.net]
  * Fix - remove refrences to login.sh in documentation and comments [bluewave.net]
  * Fix - Prevent potential read overrun within the MHD page buffer [bluewave.net]
  * Remove - legacy get_ext_iface() function [bluewave.net]

Signed-off-by: Rob White <rob@blue-wave.net>
2021-08-09 17:07:40 +02:00
Nick Hainke
52aaf9052a naywatch: add naywatch
The network may crash on the SoCs, but the SoC itself does not. This
leads to a node no longer being accessible in a mesh network.  If the
node is placed in a location that is not easily accessible, e.g. in a
high tower, it can cause a lot of problems. Therefore we check the
link-local connectivity on the configured interfaces.

Signed-off-by: Nick Hainke <vincent@systemli.org>
Tested-by: Simon Polack <spolack+git@mailbox.org>
Signed-off-by: Simon Polack <spolack+git@mailbox.org>
(cherry picked from commit 1088e65440)
2021-08-01 22:10:59 +02:00
Nick Hainke
e7e25b873b olsrd: rename general to procd
It was requested to name the section "procd".

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 87be9afac6)
2021-08-01 11:28:27 +02:00
Nick Hainke
e93c57981d olsrd: make respawn_threshold configurable
Also make respawn_threshold configurable. Further, add default
values for:
- respawn_threshold 3600
- respawn_timeout 15
- respawn_retry 0

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 775d030a58)
2021-08-01 11:28:27 +02:00
Tobias Schwarz
0eb67d72d0 olsrd: improve respawn settings
This increases the amount of seconds to wait before a service restart
attempt from 5 to 15 seconds and allows unlimited retries. Olsrd
sometimes crashes together with a network interface and 5 seconds can
be too short to bring back up a crashed network interface, which is
required for olsrd to restart. It also adds the ability to configure
the wait time (respawn_timeout) and the number of retries
(respawn_retry).

Signed-off-by: Tobias Schwarz <info@tobias-schwarz.com>
(cherry picked from commit bc58bd99e8)
2021-08-01 11:28:27 +02:00
Rob White
0e24192903 opennds: [21.02] Backport of Release v9.2.0
Maintainer: Rob White rob@blue-wave.net
Compile tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, gl-inet b1300, gl-inet mt300n-v2, Snapshot, 21.02.0-rc3, 19.07.7

Description:
This version adds new functionality, improves performance, adds documentation and fixes an issue
  * Add - new config options to ndsctl status [bluewave.net]
  * Add - Readthedocs / man documentation for configuration options [bluewave.net]
  * Add - Faster convergence of average rates to configured rate quotas [bluewave.net]
  * Add - BinAuth parse authenticated client database for client data [bluewave.net]
  * Add - Use heap allocation for http page buffer allowing large page sizes [bluewave.net]
  * Fix - fail to serve downloaded images on custom themespec [bluewave.net]

Signed-off-by: Rob White <rob@blue-wave.net>
2021-07-15 11:44:34 +02:00
Martin Hübner
c53a640e44 olsrd: add olsrd-neigh.sh
This script originates from Freifunk Berlin. It prints a list of
all meshing neighbors known to olsrd on the command line.

Added: Error-checking for IPv4/IPv6-Hosts.

Signed-off-by: Martin Hübner <martin.hubner@web.de>
(cherry picked from commit eff944874c)
2021-07-11 19:53:11 +02:00
Nick Hainke
911c0cb45a olsrd: fix olsrd starting before network
Should fix #691.

Sometimes the wifi interface is not ready before olsrd tries to access
it. This leads to warnings in the form of:

daemon.info olsrd: /etc/rc.d/S65olsrd: olsrd_write_interface()
	Warning: Interface 'wireless0' not found, skipped
daemon.notice procd: /etc/rc.d/S65olsrd: olsrd: /etc/rc.d/S65olsrd:
	olsrd_write_interface() Warning: Interface 'wireless0' not found,			skipped

We make use of the "wait_for" procd command that allows us to wait for
the network before starting olsrd.

Tested-by: Noki
Signed-off-by: Nick Hainke <vincent@systemli.org>
2021-07-07 14:56:57 +02:00
Rob White
5a09ac1180 opennds: [21.02] Backport of Release v9.1.1
Maintainer: Rob White rob@blue-wave.net
Compile tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc
Run tested: arm_cortex-a7_neon-vfpv4, mipsel_24kc, gl-inet b1300, gl-inet mt300n-v2, Snapshot, 21.02.0-rc3, 19.07.7

Description:
This version fixes a compiler error, some compiler warnings and mutes a debug message
  * Fix - Compiler error, missing mode in call to open() [bluewave.net]
  * Fix - Compiler warning, ignored return value from call to lockf() [bluewave.net]
  * Fix - Compiler warning, ignored return value from call to system() [bluewave.net]
  * Fix - Compiler warning, ignored return value from call to fgets() [bluewave.net]
  * Fix - Remove debug message from call to get_client_interface library [bluewave.net]

Signed-off-by: Rob White <rob@blue-wave.net>
2021-07-06 10:11:27 +02:00
Nick Hainke
ce4d4578c7 olsrd: reload if config changed via uci
Fixes:
https://github.com/openwrt/luci/issues/5139

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 64aa8866b7)
2021-06-23 16:31:27 +02:00
Nick Hainke
2baff33918 olsrd: switch to procd
Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit dc0adf7dce)
2021-06-12 16:37:24 +02:00
Paul Spooren
9f74c2cc41 README: update content and use Markdown
The repository path changed and the information to manually add the feed
is outdated, since it enabled by default.

Also use Markdown to format the README since it looks much more
appealing.

Signed-off-by: Paul Spooren <mail@aparcar.org>
(cherry picked from commit 4bf9a5d5dc)
2021-06-11 11:05:40 -10:00
Nick Hainke
79c5c33d48 babeld: add me as maintainer
I am maintaining the ubus bindings and also the luci-app-babeld.
I am very glad that ubus is included and that is why I do not want
babeld maintainer to have extra work.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit e62b8b54b9)
2021-06-10 09:23:40 +02:00
Nick Hainke
c9bb4d3ebe babeld: update to 1.10
25 April 2021: babeld-1.10
  * Removed the disambiguation code: source-specific routing is no longer
    supported for IPv4, and for IPv6 only on Linux 3.11 or later.
  * Fixed an issue handling of retractions with no next hop, which caused
    interoperability problems with BIRD.  Thanks to Fabian Bläse.
  * If skip-kernel-setup is set, we no longer disable the rp_filter, which
    makes babeld work in containers.  Thanks to Martin Weinelt.

Remove upstreamed part of ubus patch:
-  local: make local_kind function accessible

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit dc22d38f91)
2021-06-10 09:23:40 +02:00
Nick Hainke
13461119bc olsrd: only pud depends on libgps
As a workaround for the glibc-fix the dependency on libgps was moved
to olsrd. However, only pud is using this library.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 27ac56adc6)
2021-06-08 22:21:51 +02:00
Nick Hainke
96ba5d184a olsrd: update to 2021-06-07
- pud: fix openwrt glibc compilation

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 4f7791a1fd)
2021-06-08 22:21:51 +02:00
Nick Hainke
f1f523117f olsrd: update olsrd to 2021-06-01
Update olsrd to new version.
Remove upstreamed patches:
- 010-musl.patch
- 011-bison.patch
- 012-gpsd.patch

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 6dac4d296c)
2021-06-08 22:21:51 +02:00
Nick Hainke
435ae43565 olsrd: add me as maintainer
I am now the maintainer of olsrd. Add me also as maintainer in the
openwrt-routing feed.

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit b455e1809a)
2021-06-08 22:21:51 +02:00
Nick Hainke
60874ceb56 olsrd: use $(AUTORELEASE)
Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit 8c7bcb7206)
2021-06-08 22:21:51 +02:00
Nick Hainke
fd950266f9 CI: fix building multi-arch-test-build
The sed is adding the package name as "PKGNAME/" and does not remove
the "/". That is why the buildchain currently fails.

Signed-off-by: Nick Hainke <vincent@systemli.org>
2021-06-08 20:38:50 +02:00
Nick Hainke
13fce79c38 CI: copy .github from openwrt-packages
Just copy .github from openwrt enabling:
- checking of formalities
- checking of build
- issue template
- pr template

Signed-off-by: Nick Hainke <vincent@systemli.org>
(cherry picked from commit d1ab87b7db)
2021-06-08 20:38:50 +02:00
Simon Wunderlich
57533a25e8
Merge pull request #659 from ecsv/batadv-for-21.02
openwrt-21.02: update packages to version 2021.1
2021-05-19 08:35:37 +02:00
Sven Eckelmann
7f259642fb alfred: update to version 2021.1
* Allow to force of alfred startup when the interfaces don't work/exist (yet)
* coding style cleanups and refactoring

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-05-18 19:18:08 +02:00
Sven Eckelmann
511211431b batctl: update to version 2021.1
* add various commands to print generic netlink replies as JSON
* coding style cleanups and refactoring

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-05-18 19:17:38 +02:00
Sven Eckelmann
5d09821ed7 batman-adv: Always send iface index+name in genlmsg
The batman-adv netlink messages often contain the interface index and
interface name in the same message. This makes it easy for the receiver to
operate on the incoming data when it either needs to print something or
needs to operate on the interface index.

But one of the attributes was missing for:

* neighbor table dumps
* originator table dumps
* gateway list dumps
* query of hardif information
* query of vid information

The userspace therefore had to implement special workarounds using
SIOCGIFNAME or SIOCGIFINDEX depending on what was actually provided.
Providing both information simplifies the userspace code massively without
adding a lot of extra overhead in the kernel portion.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-05-18 19:17:19 +02:00
Sven Eckelmann
9c2452c407 batman-adv: update to version 2021.1
* support latest kernels (4.4 - 5.13)
* coding style cleanups and refactoring
* bugs squashed:

  - correctly initialize padding when sending out translation table TVLVs

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-05-18 19:17:06 +02:00
Simon Wunderlich
0fc85a4b73
Merge pull request #657 from ecsv/batadv-for-21.02
openwrt-21.02: batman-adv: Merge bugfixes from 2021.1
2021-05-18 19:09:31 +02:00
Sven Eckelmann
9beb55d8fc batman-adv: Merge bugfixes from 2021.1
* initialize "struct batadv_tvlv_tt_vlan_data"->reserved field

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-05-14 20:54:45 +02:00
Sven Eckelmann
e7ea594077 alfred: use $(AUTORELEASE) for PKG_RELEASE
Use `$(AUTORELEASE)` variable rather than setting a PKG_RELEASE
on every commit manually.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-05-14 20:05:24 +02:00
Sven Eckelmann
7f513574e4 batctl: use $(AUTORELEASE) for PKG_RELEASE
Use `$(AUTORELEASE)` variable rather than setting a PKG_RELEASE
on every commit manually.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-05-14 20:05:24 +02:00
Sven Eckelmann
3f06277b92 batman-adv: use $(AUTORELEASE) for PKG_RELEASE
Use `$(AUTORELEASE)` variable rather than setting a PKG_RELEASE
on every commit manually.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
2021-05-14 20:05:24 +02:00
rob
126720145b opennds: Release v9.0.0
This version introduces major new functionality, some changes and fixes.

New Themed Splash pages are introduced, enabling rapid customisation. Theme placeholders can be populated from information provided in the config file. Remote files and image sources can be defined in the config file and these will be automatically downloaded as required.

Deprecated legacy code from previous versions has been removed.

Tested on OpenWrt, OpenSuse and Debian.

Signed-off-by: rob <rob@blue-wave.net>
2021-05-14 11:44:06 +02:00
Josef Schlehofer
5b4d4c7fb6 bird2: Makefile polishing
- Just small reodering of some rows to be more consistent with packages feed
- Fix deprecated SPDX License Identifier

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
(cherry picked from commit b38a46acd5)
2021-04-02 10:32:26 +02:00
Josef Schlehofer
08903b9418 bird2: update to version 2.0.8
- Removed all patches as they are now included in upstream release
- Removed --with-linux-headers option
(Fixes: configure: WARNING: unrecognized options: --with-linux-headers)

Changelog:
https://bird.network.cz/pipermail/bird-users/2021-March/015281.html

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
(cherry picked from commit dcff996cbe)
2021-04-02 10:32:26 +02:00
Rob White
6f29856e60 opennds: Release 8.1.1
This release fixes an issue where some firewall rules containing
the keyword "block" would cause openNDS to fail in startup.

Signed-off-by: Rob White <rob@blue-wave.net>
2021-02-22 22:06:41 +01:00
180 changed files with 14267 additions and 2110 deletions

View file

@ -1,6 +1,6 @@
Please make sure that the issue subject starts with `<package-name>: `
Also make sure that the package is maintained in this repository and not in OpenWrt-base, OpenWrt-packages or OpenWrt-LuCI.
Also make sure that the package is maintained in this repository and not in base which should be submitted at https://bugs.openwrt.org or in the LuCI repository which should be submitted at https://github.com/openwrt/luci/issues.
Issues related to releases below 18.06 and forks are not supported or maintained and will be closed.

View file

@ -1,91 +0,0 @@
name: Check autorelease deprecation
on:
pull_request_target:
types: [opened, synchronize, converted_to_draft, ready_for_review, edited]
jobs:
build:
name: Check autorelease deprecation
runs-on: ubuntu-latest
strategy:
fail-fast: false
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Determine branch name
run: |
BRANCH="${GITHUB_BASE_REF#refs/heads/}"
echo "Building for $BRANCH"
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
- name: Determine changed packages
run: |
RET=0
# only detect packages with changes
PKG_ROOTS=$(find . -name Makefile | \
grep -v ".*/src/Makefile" | \
sed -e 's@./\(.*\)/Makefile@\1/@')
CHANGES=$(git diff --diff-filter=d --name-only origin/$BRANCH...)
for ROOT in $PKG_ROOTS; do
for CHANGE in $CHANGES; do
if [[ "$CHANGE" == "$ROOT"* ]]; then
if grep -q '$(AUTORELEASE)' "$ROOT/Makefile"; then
CONTAINS_AUTORELEASE+="$ROOT"
fi
break
fi
done
done
if [ -n "$CONTAINS_AUTORELEASE" ]; then
RET=1
cat > "$GITHUB_WORKSPACE/pr_comment.md" << EOF
Please do no longer set *PKG_RELEASE* to *AUTORELEASE* as the
feature is deprecated. Please use an integer instead. Below is a
list of affected packages including correct *PKG_RELEASE*:
EOF
fi
for ROOT in $CONTAINS_AUTORELEASE; do
echo -n " - ${ROOT}Makefile: PKG_RELEASE:=" >> "$GITHUB_WORKSPACE/pr_comment.md"
last_bump="$(git log --pretty=format:'%h %s' "$ROOT" |
grep --max-count=1 -e ': [uU]pdate to ' -e ': [bB]ump to ' |
cut -f 1 -d ' ')"
if [ -n "$last_bump" ]; then
echo -n $(($(git rev-list --count "$last_bump..HEAD" "$ROOT") + 2)) >> "$GITHUB_WORKSPACE/pr_comment.md"
else
echo -n $(($(git rev-list --count HEAD "$ROOT") + 2)) >> "$GITHUB_WORKSPACE/pr_comment.md"
fi
echo >> "$GITHUB_WORKSPACE/pr_comment.md"
done
exit $RET
- name: Find Comment
uses: peter-evans/find-comment@v2
if: ${{ failure() }}
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
- name: Create or update comment
uses: peter-evans/create-or-update-comment@v2
if: ${{ failure() }}
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body-file: 'pr_comment.md'
edit-mode: replace

View file

@ -26,24 +26,10 @@ for PKG in /ci/*.ipk; do
echo "Testing package $PKG_NAME in version $PKG_VERSION from $PKG_SOURCE"
export PKG_NAME PKG_VERSION CI_HELPER
PRE_TEST_SCRIPT=$(find /ci/ -name "$PKG_SOURCE" -type d)/pre-test.sh
if [ -f "$PRE_TEST_SCRIPT" ]; then
echo "Use package specific pre-test.sh"
if sh "$PRE_TEST_SCRIPT" "$PKG_NAME" "$PKG_VERSION"; then
echo "Pre-test successful"
else
echo "Pre-test failed"
exit 1
fi
else
echo "No pre-test.sh script available"
fi
opkg install "$PKG"
export PKG_NAME PKG_VERSION CI_HELPER
TEST_SCRIPT=$(find /ci/ -name "$PKG_SOURCE" -type d)/test.sh
if [ -f "$TEST_SCRIPT" ]; then
@ -58,5 +44,5 @@ for PKG in /ci/*.ipk; do
echo "No test.sh script available"
fi
opkg remove "$PKG_NAME" --force-removal-of-dependent-packages --force-remove --autoremove || true
opkg remove "$PKG_NAME" --force-removal-of-dependent-packages --force-remove
done

View file

@ -3,10 +3,6 @@ name: Test Build
on:
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
build:
name: Test ${{ matrix.arch }}
@ -15,37 +11,37 @@ jobs:
fail-fast: false
matrix:
include:
- arch: aarch64_generic
target: armsr-armv8
runtime_test: true
- arch: arm_cortex-a15_neon-vfpv4
target: armsr-armv7
runtime_test: true
- arch: arc_archs
target: archs38-generic
runtime_test: false
- arch: arm_cortex-a9_vfpv3-d16
target: mvebu-cortexa9
runtime_test: false
- arch: i386_pentium-mmx
target: x86-geode
runtime_test: true
- arch: mips_24kc
target: ath79-generic
runtime_test: true
runtime_test: false
- arch: powerpc_464fp
target: apm821xx-nand
runtime_test: false
- arch: powerpc_8548
- arch: powerpc_8540
target: mpc85xx-p1010
runtime_test: false
- arch: riscv64_riscv64
target: sifiveu-generic
runtime_test: false
- arch: aarch64_cortex-a53
target: mvebu-cortexa53
runtime_test: true
- arch: arm_cortex-a15_neon-vfpv4
target: armvirt-32
runtime_test: true
- arch: i386_pentium-mmx
target: x86-geode
runtime_test: true
- arch: x86_64
target: x86-64
@ -88,7 +84,6 @@ jobs:
- name: Generate build keys
run: |
sudo apt-get update
sudo apt-get install -y signify-openbsd
signify-openbsd -G -n -c 'DO NOT USE - OpenWrt packages feed CI' -p packages_ci.pub -s packages_ci.sec
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
@ -140,9 +135,7 @@ jobs:
- name: Register QEMU
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
run: |
sudo apt-get update
sudo apt-get install -y qemu-user-static binfmt-support
sudo update-binfmts --import
sudo docker run --rm --privileged aptman/qus -s -- -p
- name: Build Docker container
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}

View file

@ -3,19 +3,17 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=alfred
PKG_VERSION:=2024.0
PKG_RELEASE:=1
PKG_VERSION:=2021.1
PKG_RELEASE:=$(AUTORELEASE)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
PKG_HASH:=d029a43638ab16771e5f71e134bc843d1713d74041c65bcda18a31d18f5531bd
PKG_HASH:=94e2cf4dad885f9059fc8b8694a71eca51c9e184683bb99a79e3de8cb7485e88
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 \
@ -68,6 +66,9 @@ 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/

View file

@ -0,0 +1,22 @@
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;

View file

@ -1,17 +1,19 @@
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright (C) 2007-2021 OpenWrt.org
# Copyright (C) 2007-2009 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:=babeld
PKG_VERSION:=1.13.1
PKG_VERSION:=1.12.2
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://www.irif.fr/~jch/software/files/
PKG_HASH:=15f24d26da0ccfc073abcdef0309f281e4684f2aa71126f826572c4c845e8dd9
PKG_HASH:=1db22b6193070ea2450a1ab51196fd72f58a1329f780cb0388e2e4b2e7768cbb
PKG_MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>, \
Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>, \

View file

@ -9,7 +9,7 @@
struct timeval now;
unsigned char myid[8];
@@ -505,6 +507,9 @@ main(int argc, char **argv)
@@ -521,6 +523,9 @@ main(int argc, char **argv)
}
}
@ -19,7 +19,7 @@
init_signals();
rc = resize_receive_buffer(1500);
if(rc < 0)
@@ -597,6 +602,8 @@ main(int argc, char **argv)
@@ -616,6 +621,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) {
@@ -665,6 +672,9 @@ main(int argc, char **argv)
@@ -684,6 +691,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;
@@ -1024,7 +1026,8 @@ parse_option(int c, gnc_t gnc, void *clo
@@ -1036,7 +1038,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)
@@ -1042,6 +1045,8 @@ parse_option(int c, gnc_t gnc, void *clo
@@ -1054,6 +1057,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;

View file

@ -245,6 +245,23 @@ 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));
@ -257,6 +274,7 @@ 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)
@ -339,6 +357,7 @@ 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);
}

View file

@ -3,21 +3,18 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=batctl
PKG_VERSION:=2024.0
PKG_RELEASE:=1
PKG_VERSION:=2021.1
PKG_RELEASE:=$(AUTORELEASE)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
PKG_HASH:=76853e87201af63c411db152fd0c625a729a9733115897d1331604e2c5a67c7d
PKG_HASH:=44b28cebb46b8ba1bc170bedeef67f69d89503806c429ff8cb113cc01966e176
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
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
define Package/batctl/Default
@ -71,6 +68,20 @@ $(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"

View file

@ -0,0 +1,29 @@
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))

View file

@ -3,20 +3,18 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=batman-adv
PKG_VERSION:=2024.0
PKG_RELEASE:=2
PKG_VERSION:=2021.1
PKG_RELEASE:=$(AUTORELEASE)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
PKG_HASH:=61110697b5799f646a2a82a4dcf97faed4bb12a7cc43bf4683d2c4de4f6b40e7
PKG_HASH:=bf77843d8dead75342d673ce7021e4ad037447ce18c64056ae1e3202039934d0
PKG_EXTMOD_SUBDIRS:=net/batman-adv
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
STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h
PKG_CONFIG_DEPENDS += \

View file

@ -22,8 +22,4 @@ proto_batadv_vlan_setup() {
proto_send_update "$config"
}
proto_batadv_vlan_teardown() {
local cfg="$1"
}
add_protocol batadv_vlan

View file

@ -1,274 +0,0 @@
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>

View file

@ -0,0 +1,128 @@
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
@@ -1351,7 +1351,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,
@@ -1485,8 +1485,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),
};

View file

@ -0,0 +1,116 @@
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
@@ -18,7 +18,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>

View file

@ -1,19 +0,0 @@
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;

View file

@ -1,97 +0,0 @@
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>

View file

@ -0,0 +1,34 @@
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
@@ -454,9 +454,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;
@@ -485,6 +490,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;

View file

@ -1,69 +0,0 @@
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>

View file

@ -0,0 +1,111 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Mon, 10 May 2021 15:05:42 +0200
Subject: batman-adv: Always send iface index+name in genlmsg
The batman-adv netlink messages often contain the interface index and
interface name in the same message. This makes it easy for the receiver to
operate on the incoming data when it either needs to print something or
needs to operate on the interface index.
But one of the attributes was missing for:
* neighbor table dumps
* originator table dumps
* gateway list dumps
* query of hardif information
* query of vid information
The userspace therefore had to implement special workarounds using
SIOCGIFNAME or SIOCGIFINDEX depending on what was actually provided.
Providing both information simplifies the userspace code massively without
adding a lot of extra overhead in the kernel portion.
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/77c7d62618259f22f36427eaa62668e6e1c43090
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -1849,6 +1849,8 @@ batadv_iv_ogm_orig_dump_subentry(struct
orig_node->orig) ||
nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN,
neigh_node->addr) ||
+ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME,
+ neigh_node->if_incoming->net_dev->name) ||
nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
neigh_node->if_incoming->net_dev->ifindex) ||
nla_put_u8(msg, BATADV_ATTR_TQ, tq_avg) ||
@@ -2078,6 +2080,8 @@ batadv_iv_ogm_neigh_dump_neigh(struct sk
if (nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN,
hardif_neigh->addr) ||
+ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME,
+ hardif_neigh->if_incoming->net_dev->name) ||
nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
hardif_neigh->if_incoming->net_dev->ifindex) ||
nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS,
@@ -2459,6 +2463,8 @@ static int batadv_iv_gw_dump_entry(struc
router->addr) ||
nla_put_string(msg, BATADV_ATTR_HARD_IFNAME,
router->if_incoming->net_dev->name) ||
+ nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
+ router->if_incoming->net_dev->ifindex) ||
nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_DOWN,
gw_node->bandwidth_down) ||
nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_UP,
--- a/net/batman-adv/bat_v.c
+++ b/net/batman-adv/bat_v.c
@@ -145,6 +145,8 @@ batadv_v_neigh_dump_neigh(struct sk_buff
if (nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN,
hardif_neigh->addr) ||
+ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME,
+ hardif_neigh->if_incoming->net_dev->name) ||
nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
hardif_neigh->if_incoming->net_dev->ifindex) ||
nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS,
@@ -297,6 +299,8 @@ batadv_v_orig_dump_subentry(struct sk_bu
if (nla_put(msg, BATADV_ATTR_ORIG_ADDRESS, ETH_ALEN, orig_node->orig) ||
nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN,
neigh_node->addr) ||
+ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME,
+ neigh_node->if_incoming->net_dev->name) ||
nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
neigh_node->if_incoming->net_dev->ifindex) ||
nla_put_u32(msg, BATADV_ATTR_THROUGHPUT, throughput) ||
@@ -737,6 +741,12 @@ static int batadv_v_gw_dump_entry(struct
genlmsg_cancel(msg, hdr);
goto out;
}
+
+ if (nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
+ router->if_incoming->net_dev->ifindex)) {
+ genlmsg_cancel(msg, hdr);
+ goto out;
+ }
if (nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_DOWN,
gw_node->bandwidth_down)) {
--- a/net/batman-adv/netlink.c
+++ b/net/batman-adv/netlink.c
@@ -813,6 +813,10 @@ static int batadv_netlink_hardif_fill(st
bat_priv->soft_iface->ifindex))
goto nla_put_failure;
+ if (nla_put_string(msg, BATADV_ATTR_MESH_IFNAME,
+ bat_priv->soft_iface->name))
+ goto nla_put_failure;
+
if (nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
net_dev->ifindex) ||
nla_put_string(msg, BATADV_ATTR_HARD_IFNAME,
@@ -1044,6 +1048,10 @@ static int batadv_netlink_vlan_fill(stru
bat_priv->soft_iface->ifindex))
goto nla_put_failure;
+ if (nla_put_string(msg, BATADV_ATTR_MESH_IFNAME,
+ bat_priv->soft_iface->name))
+ goto nla_put_failure;
+
if (nla_put_u32(msg, BATADV_ATTR_VLANID, vlan->vid & VLAN_VID_MASK))
goto nla_put_failure;

View file

@ -0,0 +1,31 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Tue, 18 May 2021 21:00:27 +0200
Subject: batman-adv: Avoid WARN_ON timing related checks
The soft/batadv interface for a queued OGM can be changed during the time
the OGM was queued for transmission and when the OGM is actually
transmitted by the worker.
But WARN_ON must be used to denote kernel bugs and not to print simple
warnings. A warning can simply be printed using pr_warn.
Reported-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Reported-by: syzbot+c0b807de416427ff3dd1@syzkaller.appspotmail.com
Fixes: 29b9256e6631 ("batman-adv: consider outgoing interface in OGM sending")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/5061f9c502d7101912089d8f4a7866e0a926a49a
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -409,8 +409,10 @@ static void batadv_iv_ogm_emit(struct ba
if (WARN_ON(!forw_packet->if_outgoing))
return;
- if (WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface))
+ if (forw_packet->if_outgoing->soft_iface != soft_iface) {
+ pr_warn("%s: soft interface switch for queued OGM\n", __func__);
return;
+ }
if (forw_packet->if_incoming->if_status != BATADV_IF_ACTIVE)
return;

View file

@ -0,0 +1,162 @@
From: Pavel Skripkin <paskripkin@gmail.com>
Date: Sun, 24 Oct 2021 16:13:56 +0300
Subject: batman-adv: fix error handling
Syzbot reported ODEBUG warning in batadv_nc_mesh_free(). The problem was
in wrong error handling in batadv_mesh_init().
Before this patch batadv_mesh_init() was calling batadv_mesh_free() in case
of any batadv_*_init() calls failure. This approach may work well, when
there is some kind of indicator, which can tell which parts of batadv are
initialized; but there isn't any.
All written above lead to cleaning up uninitialized fields. Even if we hide
ODEBUG warning by initializing bat_priv->nc.work, syzbot was able to hit
GPF in batadv_nc_purge_paths(), because hash pointer in still NULL. [1]
To fix these bugs we can unwind batadv_*_init() calls one by one.
It is good approach for 2 reasons: 1) It fixes bugs on error handling
path 2) It improves the performance, since we won't call unneeded
batadv_*_free() functions.
So, this patch makes all batadv_*_init() clean up all allocated memory
before returning with an error to no call correspoing batadv_*_free()
and open-codes batadv_mesh_free() with proper order to avoid touching
uninitialized fields.
Link: https://lore.kernel.org/netdev/000000000000c87fbd05cef6bcb0@google.com/ [1]
Reported-and-tested-by: syzbot+28b0702ada0bf7381f58@syzkaller.appspotmail.com
Fixes: 21e838760727 ("[batman-adv] fix various race conditions during startup & shutdown")
Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0631e0825c8129cd3896926da62a09ac00bf13a0
--- a/net/batman-adv/bridge_loop_avoidance.c
+++ b/net/batman-adv/bridge_loop_avoidance.c
@@ -1556,10 +1556,14 @@ int batadv_bla_init(struct batadv_priv *
return 0;
bat_priv->bla.claim_hash = batadv_hash_new(128);
- bat_priv->bla.backbone_hash = batadv_hash_new(32);
+ if (!bat_priv->bla.claim_hash)
+ return -ENOMEM;
- if (!bat_priv->bla.claim_hash || !bat_priv->bla.backbone_hash)
+ bat_priv->bla.backbone_hash = batadv_hash_new(32);
+ if (!bat_priv->bla.backbone_hash) {
+ batadv_hash_destroy(bat_priv->bla.claim_hash);
return -ENOMEM;
+ }
batadv_hash_set_lock_class(bat_priv->bla.claim_hash,
&batadv_claim_hash_lock_class_key);
--- a/net/batman-adv/main.c
+++ b/net/batman-adv/main.c
@@ -189,29 +189,41 @@ int batadv_mesh_init(struct net_device *
bat_priv->gw.generation = 0;
- ret = batadv_v_mesh_init(bat_priv);
- if (ret < 0)
- goto err;
-
ret = batadv_originator_init(bat_priv);
- if (ret < 0)
- goto err;
+ if (ret < 0) {
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+ goto err_orig;
+ }
ret = batadv_tt_init(bat_priv);
- if (ret < 0)
- goto err;
+ if (ret < 0) {
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+ goto err_tt;
+ }
+
+ ret = batadv_v_mesh_init(bat_priv);
+ if (ret < 0) {
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+ goto err_v;
+ }
ret = batadv_bla_init(bat_priv);
- if (ret < 0)
- goto err;
+ if (ret < 0) {
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+ goto err_bla;
+ }
ret = batadv_dat_init(bat_priv);
- if (ret < 0)
- goto err;
+ if (ret < 0) {
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+ goto err_dat;
+ }
ret = batadv_nc_mesh_init(bat_priv);
- if (ret < 0)
- goto err;
+ if (ret < 0) {
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+ goto err_nc;
+ }
batadv_gw_init(bat_priv);
batadv_mcast_init(bat_priv);
@@ -221,8 +233,20 @@ int batadv_mesh_init(struct net_device *
return 0;
-err:
- batadv_mesh_free(soft_iface);
+err_nc:
+ batadv_dat_free(bat_priv);
+err_dat:
+ batadv_bla_free(bat_priv);
+err_bla:
+ batadv_v_mesh_free(bat_priv);
+err_v:
+ batadv_tt_free(bat_priv);
+err_tt:
+ batadv_originator_free(bat_priv);
+err_orig:
+ batadv_purge_outstanding_packets(bat_priv, NULL);
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
+
return ret;
}
--- a/net/batman-adv/network-coding.c
+++ b/net/batman-adv/network-coding.c
@@ -152,8 +152,10 @@ int batadv_nc_mesh_init(struct batadv_pr
&batadv_nc_coding_hash_lock_class_key);
bat_priv->nc.decoding_hash = batadv_hash_new(128);
- if (!bat_priv->nc.decoding_hash)
+ if (!bat_priv->nc.decoding_hash) {
+ batadv_hash_destroy(bat_priv->nc.coding_hash);
goto err;
+ }
batadv_hash_set_lock_class(bat_priv->nc.decoding_hash,
&batadv_nc_decoding_hash_lock_class_key);
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -4193,8 +4193,10 @@ int batadv_tt_init(struct batadv_priv *b
return ret;
ret = batadv_tt_global_init(bat_priv);
- if (ret < 0)
+ if (ret < 0) {
+ batadv_tt_local_table_free(bat_priv);
return ret;
+ }
batadv_tvlv_handler_register(bat_priv, batadv_tt_tvlv_ogm_handler_v1,
batadv_tt_tvlv_unicast_handler_v1,

View file

@ -0,0 +1,182 @@
From: Linus Lüssing <linus.luessing@c0d3.blue>
Date: Mon, 1 Nov 2021 21:46:17 +0100
Subject: batman-adv: allow netlink usage in unprivileged containers
Currently, creating a batman-adv interface in an unprivileged LXD
container and attaching secondary interfaces to it with "ip" or "batctl"
works fine. However all batctl debug and configuration commands
fail:
root@container:~# batctl originators
Error received: Operation not permitted
root@container:~# batctl orig_interval
1000
root@container:~# batctl orig_interval 2000
root@container:~# batctl orig_interval
1000
To fix this change the generic netlink permissions from GENL_ADMIN_PERM
to GENL_UNS_ADMIN_PERM. This way a batman-adv interface is fully
maintainable as root from within a user namespace, from an unprivileged
container.
All except one batman-adv netlink setting are per interface and do not
leak information or change settings from the host system and are
therefore save to retrieve or modify as root from within an unprivileged
container.
"batctl routing_algo" / BATADV_CMD_GET_ROUTING_ALGOS is the only
exception: It provides the batman-adv kernel module wide default routing
algorithm. However it is read-only from netlink and an unprivileged
container is still not allowed to modify
/sys/module/batman_adv/parameters/routing_algo. Instead it is advised to
use the newly introduced "batctl if create routing_algo RA_NAME" /
IFLA_BATADV_ALGO_NAME to set the routing algorithm on interface
creation, which already works fine in an unprivileged container.
Cc: Tycho Andersen <tycho@tycho.pizza>
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/055fa41b73ca8dae1c1ed41777e32a8f02e80c82
--- /dev/null
+++ b/compat-include/uapi/linux/genetlink.h
@@ -0,0 +1,22 @@
+/* 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_UAPI_LINUX_GENETLINK_H_
+#define _NET_BATMAN_ADV_COMPAT_UAPI_LINUX_GENETLINK_H_
+
+#include <linux/version.h>
+#include_next <uapi/linux/genetlink.h>
+
+#if LINUX_VERSION_IS_LESS(4, 6, 0)
+
+#define GENL_UNS_ADMIN_PERM GENL_ADMIN_PERM
+
+#endif /* LINUX_VERSION_IS_LESS(4, 6, 0) */
+
+#endif /* _NET_BATMAN_ADV_COMPAT_UAPI_LINUX_GENETLINK_H_ */
--- a/net/batman-adv/netlink.c
+++ b/net/batman-adv/netlink.c
@@ -1369,21 +1369,21 @@ static const struct genl_ops batadv_netl
{
.cmd = BATADV_CMD_TP_METER,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.doit = batadv_netlink_tp_meter_start,
.internal_flags = BATADV_FLAG_NEED_MESH,
},
{
.cmd = BATADV_CMD_TP_METER_CANCEL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.doit = batadv_netlink_tp_meter_cancel,
.internal_flags = BATADV_FLAG_NEED_MESH,
},
{
.cmd = BATADV_CMD_GET_ROUTING_ALGOS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_algo_dump,
},
{
@@ -1398,68 +1398,68 @@ static const struct genl_ops batadv_netl
{
.cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_tt_local_dump,
},
{
.cmd = BATADV_CMD_GET_TRANSTABLE_GLOBAL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_tt_global_dump,
},
{
.cmd = BATADV_CMD_GET_ORIGINATORS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_orig_dump,
},
{
.cmd = BATADV_CMD_GET_NEIGHBORS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_hardif_neigh_dump,
},
{
.cmd = BATADV_CMD_GET_GATEWAYS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_gw_dump,
},
{
.cmd = BATADV_CMD_GET_BLA_CLAIM,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_bla_claim_dump,
},
{
.cmd = BATADV_CMD_GET_BLA_BACKBONE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_bla_backbone_dump,
},
{
.cmd = BATADV_CMD_GET_DAT_CACHE,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_dat_cache_dump,
},
{
.cmd = BATADV_CMD_GET_MCAST_FLAGS,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.dumpit = batadv_mcast_flags_dump,
},
{
.cmd = BATADV_CMD_SET_MESH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.doit = batadv_netlink_set_mesh,
.internal_flags = BATADV_FLAG_NEED_MESH,
},
{
.cmd = BATADV_CMD_SET_HARDIF,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.doit = batadv_netlink_set_hardif,
.internal_flags = BATADV_FLAG_NEED_MESH |
BATADV_FLAG_NEED_HARDIF,
@@ -1475,7 +1475,7 @@ static const struct genl_ops batadv_netl
{
.cmd = BATADV_CMD_SET_VLAN,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
- .flags = GENL_ADMIN_PERM,
+ .flags = GENL_UNS_ADMIN_PERM,
.doit = batadv_netlink_set_vlan,
.internal_flags = BATADV_FLAG_NEED_MESH |
BATADV_FLAG_NEED_VLAN,

View file

@ -0,0 +1,165 @@
From: Linus Lüssing <linus.luessing@c0d3.blue>
Date: Sat, 1 Jan 2022 06:27:13 +0100
Subject: batman-adv: mcast: don't send link-local multicast to mcast routers
The addition of routable multicast TX handling introduced a
bug/regression for packets with a link-local multicast destination:
These packets would be sent to all batman-adv nodes with a multicast
router and to all batman-adv nodes with an old version without multicast
router detection.
This even disregards the batman-adv multicast fanout setting, which can
potentially lead to an unwanted, high number of unicast transmissions or
even congestion.
Fixing this by avoiding to send link-local multicast packets to nodes in
the multicast router list.
Fixes: 3a8df00cd969 ("batman-adv: mcast: apply optimizations for routable packets, too")
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/ee013870947b9175847aa46a0686ca01dd480af4
--- a/net/batman-adv/multicast.c
+++ b/net/batman-adv/multicast.c
@@ -1380,6 +1380,7 @@ batadv_mcast_forw_rtr_node_get(struct ba
* @bat_priv: the bat priv with all the soft interface information
* @skb: The multicast packet to check
* @orig: an originator to be set to forward the skb to
+ * @is_routable: stores whether the destination is routable
*
* Return: the forwarding mode as enum batadv_forw_mode and in case of
* BATADV_FORW_SINGLE set the orig to the single originator the skb
@@ -1387,17 +1388,16 @@ batadv_mcast_forw_rtr_node_get(struct ba
*/
enum batadv_forw_mode
batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
- struct batadv_orig_node **orig)
+ struct batadv_orig_node **orig, int *is_routable)
{
int ret, tt_count, ip_count, unsnoop_count, total_count;
bool is_unsnoopable = false;
unsigned int mcast_fanout;
struct ethhdr *ethhdr;
- int is_routable = 0;
int rtr_count = 0;
ret = batadv_mcast_forw_mode_check(bat_priv, skb, &is_unsnoopable,
- &is_routable);
+ is_routable);
if (ret == -ENOMEM)
return BATADV_FORW_NONE;
else if (ret < 0)
@@ -1410,7 +1410,7 @@ batadv_mcast_forw_mode(struct batadv_pri
ip_count = batadv_mcast_forw_want_all_ip_count(bat_priv, ethhdr);
unsnoop_count = !is_unsnoopable ? 0 :
atomic_read(&bat_priv->mcast.num_want_all_unsnoopables);
- rtr_count = batadv_mcast_forw_rtr_count(bat_priv, is_routable);
+ rtr_count = batadv_mcast_forw_rtr_count(bat_priv, *is_routable);
total_count = tt_count + ip_count + unsnoop_count + rtr_count;
@@ -1730,6 +1730,7 @@ batadv_mcast_forw_want_rtr(struct batadv
* @bat_priv: the bat priv with all the soft interface information
* @skb: the multicast packet to transmit
* @vid: the vlan identifier
+ * @is_routable: stores whether the destination is routable
*
* Sends copies of a frame with multicast destination to any node that signaled
* interest in it, that is either via the translation table or the according
@@ -1742,7 +1743,7 @@ batadv_mcast_forw_want_rtr(struct batadv
* is neither IPv4 nor IPv6. NET_XMIT_SUCCESS otherwise.
*/
int batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb,
- unsigned short vid)
+ unsigned short vid, int is_routable)
{
int ret;
@@ -1758,12 +1759,16 @@ int batadv_mcast_forw_send(struct batadv
return ret;
}
+ if (!is_routable)
+ goto skip_mc_router;
+
ret = batadv_mcast_forw_want_rtr(bat_priv, skb, vid);
if (ret != NET_XMIT_SUCCESS) {
kfree_skb(skb);
return ret;
}
+skip_mc_router:
consume_skb(skb);
return ret;
}
--- a/net/batman-adv/multicast.h
+++ b/net/batman-adv/multicast.h
@@ -43,7 +43,8 @@ enum batadv_forw_mode {
enum batadv_forw_mode
batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
- struct batadv_orig_node **mcast_single_orig);
+ struct batadv_orig_node **mcast_single_orig,
+ int *is_routable);
int batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
struct sk_buff *skb,
@@ -51,7 +52,7 @@ int batadv_mcast_forw_send_orig(struct b
struct batadv_orig_node *orig_node);
int batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb,
- unsigned short vid);
+ unsigned short vid, int is_routable);
void batadv_mcast_init(struct batadv_priv *bat_priv);
@@ -68,7 +69,8 @@ void batadv_mcast_purge_orig(struct bata
static inline enum batadv_forw_mode
batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
- struct batadv_orig_node **mcast_single_orig)
+ struct batadv_orig_node **mcast_single_orig,
+ int *is_routable)
{
return BATADV_FORW_ALL;
}
@@ -85,7 +87,7 @@ batadv_mcast_forw_send_orig(struct batad
static inline int
batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb,
- unsigned short vid)
+ unsigned short vid, int is_routable)
{
kfree_skb(skb);
return NET_XMIT_DROP;
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -198,6 +198,7 @@ static netdev_tx_t batadv_interface_tx(s
int gw_mode;
enum batadv_forw_mode forw_mode = BATADV_FORW_SINGLE;
struct batadv_orig_node *mcast_single_orig = NULL;
+ int mcast_is_routable = 0;
int network_offset = ETH_HLEN;
__be16 proto;
@@ -300,7 +301,8 @@ static netdev_tx_t batadv_interface_tx(s
send:
if (do_bcast && !is_broadcast_ether_addr(ethhdr->h_dest)) {
forw_mode = batadv_mcast_forw_mode(bat_priv, skb,
- &mcast_single_orig);
+ &mcast_single_orig,
+ &mcast_is_routable);
if (forw_mode == BATADV_FORW_NONE)
goto dropped;
@@ -365,7 +367,8 @@ send:
ret = batadv_mcast_forw_send_orig(bat_priv, skb, vid,
mcast_single_orig);
} else if (forw_mode == BATADV_FORW_SOME) {
- ret = batadv_mcast_forw_send(bat_priv, skb, vid);
+ ret = batadv_mcast_forw_send(bat_priv, skb, vid,
+ mcast_is_routable);
} else {
if (batadv_dat_snoop_outgoing_arp_request(bat_priv,
skb))

View file

@ -0,0 +1,27 @@
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
@@ -135,7 +135,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;

View file

@ -0,0 +1,23 @@
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
@@ -135,7 +135,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)

View file

@ -0,0 +1,44 @@
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
@@ -149,22 +149,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");

View file

@ -0,0 +1,46 @@
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
@@ -215,14 +215,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;
}
@@ -232,9 +234,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:
if (hard_iface)

View file

@ -0,0 +1,86 @@
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
@@ -157,13 +157,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.. */
@@ -223,8 +225,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;
}
@@ -235,6 +236,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:

View file

@ -0,0 +1,46 @@
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
@@ -477,6 +477,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;

View file

@ -0,0 +1,43 @@
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
@@ -729,6 +729,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;

View file

@ -5,45 +5,49 @@
#include <linux/version.h> /* LINUX_VERSION_CODE */
#include <linux/types.h>
#if LINUX_VERSION_IS_LESS(6, 0, 0)
#if LINUX_VERSION_IS_LESS(5, 10, 0)
#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)
#include <linux/if_bridge.h>
#endif /* LINUX_VERSION_IS_LESS(6, 0, 0) */
struct batadv_br_ip {
union {
__be32 ip4;
#if IS_ENABLED(CONFIG_IPV6)
struct in6_addr ip6;
#endif
} dst;
__be16 proto;
__u16 vid;
};
#if LINUX_VERSION_IS_LESS(6, 2, 0)
struct batadv_br_ip_list {
struct list_head list;
struct batadv_br_ip addr;
};
#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()
#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.
*/
static inline struct vlan_ethhdr *skb_vlan_eth_hdr(const struct sk_buff *skb)
inline void __batadv_br_ip_list_check(void)
{
return (struct vlan_ethhdr *)skb->data;
}
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));
#endif /* LINUX_VERSION_IS_LESS(6, 4, 0) */
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));
}
#endif
#define br_ip batadv_br_ip
#define br_ip_list batadv_br_ip_list
#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */
/* <DECLARE_EWMA> */

View file

@ -22,8 +22,6 @@ PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
PKG_MIRROR_HASH:=ceb8e0e399f79b1b663594fcf9642e1efc40e696a7604daf709c77da9b6ec52f
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/batmand

View file

@ -6,6 +6,8 @@ Subject: Allow one to disable forking to background in debug_mode 0
posix/init.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/posix/init.c b/posix/init.c
index afd409f..901c65a 100644
--- a/posix/init.c
+++ b/posix/init.c
@@ -44,6 +44,7 @@
@ -16,7 +18,7 @@ Subject: Allow one to disable forking to background in debug_mode 0
@@ -159,6 +160,7 @@ void apply_init_args( int argc, char *ar
@@ -159,6 +160,7 @@ void apply_init_args( int argc, char *argv[] ) {
{"purge-timeout", required_argument, 0, 'q'},
{"disable-aggregation", no_argument, 0, 'x'},
{"disable-client-nat", no_argument, 0, 'z'},
@ -24,16 +26,16 @@ Subject: Allow one to disable forking to background in debug_mode 0
{0, 0, 0, 0}
};
@@ -169,7 +171,7 @@ void apply_init_args( int argc, char *ar
if ( strstr( SOURCE_VERSION, "-" ) != NULL )
printf( "WARNING: You are using the unstable batman branch. If you are interested in *using* batman get the latest stable release !\n" );
@@ -166,7 +168,7 @@ void apply_init_args( int argc, char *argv[] ) {
stop = 0;
prog_name = argv[0];
- while ( ( optchar = getopt_long( argc, argv, "a:A:bcd:hHio:g:p:r:s:vV", long_options, &option_index ) ) != -1 ) {
+ while ( ( optchar = getopt_long( argc, argv, "a:A:bcd:hHio:g:p:r:s:vVD", long_options, &option_index ) ) != -1 ) {
switch ( optchar ) {
@@ -381,6 +383,11 @@ void apply_init_args( int argc, char *ar
@@ -378,6 +380,11 @@ void apply_init_args( int argc, char *argv[] ) {
found_args++;
break;
@ -45,7 +47,7 @@ Subject: Allow one to disable forking to background in debug_mode 0
case 'h':
default:
usage();
@@ -539,12 +546,14 @@ void apply_init_args( int argc, char *ar
@@ -536,12 +543,14 @@ void apply_init_args( int argc, char *argv[] ) {
/* daemonize */
if (debug_level == 0) {

View file

@ -0,0 +1,342 @@
<!--
---------------------------------------------------------------------
(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.

166
bird1-openwrt/Makefile Normal file
View file

@ -0,0 +1,166 @@
# 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)))

80
bird1-openwrt/README.md Normal file
View file

@ -0,0 +1,80 @@
# 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
```

View file

@ -0,0 +1,345 @@
<!--
---------------------------------------------------------------------
(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.

View file

@ -0,0 +1,33 @@
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'

View file

@ -0,0 +1,52 @@
--[[
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

View file

@ -0,0 +1,233 @@
#!/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
}

View file

@ -0,0 +1,590 @@
# 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 " "
}

View file

@ -0,0 +1,282 @@
--[[
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

View file

@ -0,0 +1,77 @@
--[[
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

View file

@ -0,0 +1,77 @@
--[[
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

View file

@ -0,0 +1,263 @@
--[[
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

View file

@ -0,0 +1,76 @@
--[[
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

View file

@ -0,0 +1,53 @@
--[[
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

View file

@ -0,0 +1,33 @@
#!/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

View file

@ -0,0 +1,13 @@
#!/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

View file

@ -0,0 +1,41 @@
<%-
-- 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%>

View file

@ -0,0 +1,5 @@
<%+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%>

View file

@ -0,0 +1,36 @@
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'

View file

@ -0,0 +1,52 @@
--[[
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

View file

@ -0,0 +1,225 @@
#!/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
}

View file

@ -0,0 +1,476 @@
# 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 " "
}

View file

@ -0,0 +1,286 @@
--[[
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

View file

@ -0,0 +1,77 @@
--[[
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

View file

@ -0,0 +1,77 @@
--[[
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

View file

@ -0,0 +1,266 @@
--[[
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

View file

@ -0,0 +1,85 @@
--[[
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

View file

@ -0,0 +1,53 @@
--[[
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

View file

@ -0,0 +1,33 @@
#!/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

View file

@ -0,0 +1,13 @@
#!/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

View file

@ -0,0 +1,41 @@
<%-
-- 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%>

View file

@ -0,0 +1,5 @@
<%+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 Normal file
View file

@ -0,0 +1,225 @@
#
# 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))

121
bird1/files/bird4.conf Normal file
View file

@ -0,0 +1,121 @@
# 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
# };
#}

26
bird1/files/bird4.init Normal file
View file

@ -0,0 +1,26 @@
#!/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
}

121
bird1/files/bird6.conf Normal file
View file

@ -0,0 +1,121 @@
# 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
# };
#}

26
bird1/files/bird6.init Normal file
View file

@ -0,0 +1,26 @@
#!/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
}

View file

@ -0,0 +1,11 @@
--- 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)

View file

@ -7,12 +7,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=bird2
PKG_VERSION:=2.14
PKG_VERSION:=2.13.1
PKG_RELEASE:=1
PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird
PKG_HASH:=b0b9f6f8566541b9be4af1f0cac675c5a3785601a55667a7ec3d7de29735a786
PKG_HASH:=97bb8d57be9bc5083e2b566416d27e314162856a12ca7c77e202e467d20d4080
PKG_MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
PKG_LICENSE:=GPL-2.0-or-later

View file

@ -3,7 +3,6 @@
USE_PROCD=1
START=70
STOP=10
BIRD_BIN="/usr/sbin/bird"
BIRD_CONF="/etc/bird.conf"

155
bmx6/Makefile Normal file
View file

@ -0,0 +1,155 @@
# Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
#
# 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 2 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, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# The full GNU General Public License is included in this distribution in
# the file called "COPYING".
#
# Contibutors:
# Axel Neumann, Simó Albert i Beltran, Pau Escrich
#
include $(TOPDIR)/rules.mk
PKG_NAME:=bmx6
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/bmx-routing/bmx6.git
PKG_REV:=d8869ec69797be0ca2da06abb344e60198a8a275
PKG_MIRROR_HASH:=4aae08158666f5976c952e195b3a1369a5f7bba26fedd5d5ea33b35956e24ec6
PKG_VERSION:=r2018051214
PKG_RELEASE:=2
PKG_LICENSE:=GPL-2.0
PKG_SOURCE_VERSION:=$(PKG_REV)
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
include $(INCLUDE_DIR)/package.mk
TARGET_CFLAGS += $(FPIC)
MAKE_ARGS += \
EXTRA_CFLAGS="$(TARGET_CFLAGS) -I. -I$(STAGING_DIR)/usr/include -DNO_DEBUG_ALL -DNO_DEBUG_DUMP" \
EXTRA_LDFLAGS="-L$(STAGING_DIR)/usr/lib " \
GIT_REV="$(PKG_REV)" \
CC="$(TARGET_CC)" \
INSTALL_DIR="$(PKG_INSTALL_DIR)" \
STRIP="/bin/false" \
build_all
define Package/bmx6/Default
SECTION:=net
CATEGORY:=Network
SUBMENU:=Routing and Redirection
TITLE:=BMX6 layer 3 routing daemon
URL:=http://bmx6.net/
MAINTAINER:=Axel Neumann <neumann@cgws.de>
DEPENDS:=+kmod-ip6-tunnel +kmod-iptunnel6 +kmod-tun
endef
define Package/bmx6/description
BMX6 layer 3 routing daemon supporting IPv4, IPv6, and IPv4 over IPv6
endef
define Package/bmx6
$(call Package/bmx6/Default)
MENU:=1
endef
define Package/bmx6-uci-config
$(call Package/bmx6/Default)
DEPENDS:=bmx6 +libuci
TITLE:=configuration plugin based on uci (recommended!)
endef
define Package/bmx6-json
$(call Package/bmx6/Default)
DEPENDS:=bmx6 +libjson-c
TITLE:=json plugin based on json-c
endef
define Package/bmx6-sms
$(call Package/bmx6/Default)
DEPENDS:=bmx6
TITLE:=sms plugin
endef
#define Package/bmx6-quagga
# $(call Package/bmx6/Default)
# DEPENDS:=bmx6 +qmp-quagga @BROKEN
# TITLE:=bmx6 quagga plugin to redistribute/export routes (needs manet/bmx6 patched quagga 0.99.21)
#endef
define Package/bmx6-table
$(call Package/bmx6/Default)
DEPENDS:=bmx6
TITLE:=bmx6 table plugin to automatic announce routing-table routes via ip6ip tunnels
endef
define Build/Configure
mkdir -p $(PKG_INSTALL_DIR)
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_ARGS)
endef
define Package/bmx6/install
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bmx6 $(1)/usr/sbin/bmx6
endef
define Package/bmx6-uci-config/conffiles
/etc/config/bmx6
endef
define Package/bmx6-uci-config/install
$(INSTALL_DIR) $(1)/usr/lib $(1)/etc/config $(1)/etc/init.d
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_uci_config/bmx6_config.so $(1)/usr/lib/bmx6_config.so
$(INSTALL_BIN) ./files/etc/init.d/bmx6 $(1)/etc/init.d/bmx6
$(INSTALL_DATA) ./files/etc/config/bmx6 $(1)/etc/config/bmx6
endef
define Package/bmx6-json/install
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_json/bmx6_json.so $(1)/usr/lib/bmx6_json.so
endef
define Package/bmx6-sms/install
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_sms/bmx6_sms.so $(1)/usr/lib/bmx6_sms.so
endef
define Package/bmx6-table/install
$(INSTALL_DIR) $(1)/usr/lib
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_table/bmx6_table.so $(1)/usr/lib/bmx6_table.so
endef
#define Package/bmx6-quagga/install
# $(INSTALL_DIR) $(1)/usr/lib
# $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_quagga/bmx6_quagga.so $(1)/usr/lib/bmx6_quagga.so
#endef
$(eval $(call BuildPackage,bmx6))
$(eval $(call BuildPackage,bmx6-uci-config))
$(eval $(call BuildPackage,bmx6-json))
$(eval $(call BuildPackage,bmx6-sms))
#$(eval $(call BuildPackage,bmx6-quagga))
$(eval $(call BuildPackage,bmx6-table))

View file

@ -0,0 +1,82 @@
# for more information:
# http://bmx6.net/projects/bmx6/wiki
# options execute: bmx6 --help
config 'bmx6' 'general'
# option 'runtimeDir' '/var/run/bmx6'
# option 'tun4Address' '10.202.0.116/32'
# option 'tun4Address' '10.254.10.0/32'
# option 'tun6Address' '2012:0:0:1000::1/64'
#config 'ipVersion' 'ipVersion'
# option 'ipVersion' '6' # default is 4
# option 'throwRules' '0'
#config 'plugin'
# option 'plugin' 'bmx6_config.so'
#config 'plugin'
# option 'plugin' 'bmx6_json.so'
#config 'plugin'
# option 'plugin' 'bmx6_sms.so'
config 'dev' 'mesh_1'
option 'dev' 'eth0.12'
config 'dev' 'mesh_2'
option 'dev' 'ath0.12'
#config 'hna' 'my_global_prefix'
# option 'hna' '2012:0:0:74:0:0:0:0/64'
#config 'tunOut'
# option 'tunOut' 'ip6'
# option 'network' '2012::/16'
# option 'exportDistance' '0'
#config 'tunOut'
# option 'tunOut' 'ip4'
# option 'network' '10.254.0.0/16'
# option 'exportDistance' '0' # requires quagga plugin !
# option 'minPrefixLen' '27'
#config 'plugin'
# option 'plugin' 'bmx6_quagga.so'
#config 'redistribute'
# option 'redistribute' 'ospf6'
# option 'network' '10.0.0.0/8'
# option 'minPrefixLen' '10'
# option 'bandwidth' '10000000'
# option 'ospf6' '1'
# option 'aggregatePrefixLen' '16'
#config 'redistribute'
# option 'redistribute' 'bgp'
# option 'network' '0.0.0.0/0'
# option 'minPrefixLen' '0'
# option 'maxPrefixLen' '24'
# option 'bandwidth' '10000000'
# option 'bgp' '1'
# option 'aggregatePrefixLen' '8'

37
bmx6/files/etc/init.d/bmx6 Executable file
View file

@ -0,0 +1,37 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2017 Gui Iribarren <gui@altermundi.net>
# Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
#
# This is free software, licensed under the GNU General Public License v3.
START=91
STOP=91
USE_PROCD=1
NAME=bmx6
BIN=/usr/sbin/bmx6
CONF=/etc/config/bmx6
PID=/var/run/bmx6/pid
DEBUG=0
start_service() {
procd_open_instance "$NAME"
procd_set_param command "$BIN" -f "$CONF" -d "$DEBUG"
### Respawn automatically when process dies, after waiting respawn_timeout seconds
### If respawn_retry consecutives respawns die before respawn_threshold seconds (i.e. they crash)
### it will stop trying and leave it dead.
procd_set_param respawn ${respawn_threshold:-60} ${respawn_timeout:-3} ${respawn_retry:-5}
procd_set_param limits core="20000" # Equivalent to 'ulimit -c 20000'
procd_close_instance
}
reload_service() {
"$BIN" -c configReload
}
service_triggers()
{
procd_add_reload_trigger "bmx6" # Call reload_service() when /etc/config/bmx6 changed and reload_config is run
}

View file

@ -0,0 +1,40 @@
--- a/schedule.c
+++ b/schedule.c
@@ -356,7 +356,9 @@ loop4Event:
continue;
}
+#ifdef SIOCGSTAMP
ioctl(pb.i.iif->rx_mcast_sock, SIOCGSTAMP, &(pb.i.tv_stamp)) ;
+#endif
rx_packet( &pb );
@@ -381,8 +383,10 @@ loop4Event:
continue;
}
-
+
+#ifdef SIOCGSTAMP
ioctl(pb.i.iif->rx_fullbrc_sock, SIOCGSTAMP, &(pb.i.tv_stamp)) ;
+#endif
rx_packet( &pb );
@@ -432,10 +436,15 @@ loop4Event:
}
}
#endif
+#ifdef SIOCGSTAMP
if ( tv_stamp == NULL )
ioctl( pb.i.iif->unicast_sock, SIOCGSTAMP, &(pb.i.tv_stamp) );
else
timercpy( tv_stamp, &(pb.i.tv_stamp) );
+#else
+ if (tv_stamp)
+ timercpy( tv_stamp, &(pb.i.tv_stamp) );
+#endif
rx_packet( &pb );

View file

@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=bmx7
PKG_VERSION:=7.1.1
PKG_RELEASE:=5
PKG_RELEASE:=4
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/bmx-routing/bmx7/tar.gz/v$(PKG_VERSION)?

View file

@ -18,7 +18,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=cjdns
PKG_VERSION:=v21.1
PKG_RELEASE:=5
PKG_RELEASE:=4
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/cjdelisle/cjdns/tar.gz/$(PKG_NAME)-$(PKG_VERSION)?
@ -78,10 +78,10 @@ define Build/Compile
$(INSTALL_DIR) $(PKG_BUILD_DIR)/tmp
(cd $(PKG_BUILD_DIR) && \
CROSS="true" \
CC="$(TARGET_CC_NOCACHE)" \
CC="$(TARGET_CC)" \
AR="$(TARGET_AR)" \
RANLIB="$(TARGET_RANLIB)" \
CFLAGS="$(TARGET_CFLAGS) -U_FORTIFY_SOURCE -Wno-error=array-bounds -Wno-error=stringop-overflow -Wno-error=stringop-overread" \
CFLAGS="$(TARGET_CFLAGS) -U_FORTIFY_SOURCE -Wno-error=array-bounds -Wno-error=stringop-overflow" \
LDFLAGS="$(TARGET_LDFLAGS)" \
SYSTEM="linux" \
TARGET_ARCH="$(CONFIG_ARCH)" \

View file

@ -1,23 +0,0 @@
--- 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,

View file

@ -1,15 +0,0 @@
--- 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

339
luci-app-bmx6/COPYING Normal file
View file

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

99
luci-app-bmx6/Makefile Normal file
View file

@ -0,0 +1,99 @@
# Copyright (C) 2011 Pau Escrich <pau@dabax.net>
#
# 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 2 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, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# The full GNU General Public License is included in this distribution in
# the file called "COPYING".
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-bmx6
PKG_RELEASE:=6
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
PKG_LICENSE:=GPL-2.0+
include $(INCLUDE_DIR)/package.mk
define Package/luci-app-bmx6
SECTION:=luci
CATEGORY:=LuCI
SUBMENU:=3. Applications
TITLE:= bmx6 configuration, status and visualization module
DEPENDS:=+luci-lib-json +luci-base +luci-lib-httpclient +bmx6 +luci-lib-jquery-1-4 +luci-lib-dracula
MAINTAINER:= Pau Escrich <p4u@dabax.net>
endef
define Package/luci-lib-jquery-1-4
SECTION:=luci
CATEGORY:=LuCI
TITLE:=LuCI - Lua Configuration Interface
MAINTAINER:=Gui Iribarren <gui@altermundi.net>
SUBMENU:=6. Libraries
TITLE:=jQuery 1.4 javascript library
endef
define Package/luci-lib-dracula
SECTION:=luci
CATEGORY:=LuCI
TITLE:=LuCI - Lua Configuration Interface
MAINTAINER:=Pau Escrich <p4u@dabax.net>
SUBMENU:=6. Libraries
TITLE:=dracula graph javascript library
endef
define Package/luci-app-bmx6/description
bmx6 web application (status and configuration) for LuCi web interface
endef
define Package/luci-lib-jquery-1-4/description
minified javascript jQuery 1.4 library
endef
define Package/luci-lib-dracula-graph/description
minified dracula javascript graph library
endef
define Package/luci-app-bmx6/conffiles
/etc/config/luci-bmx6
endef
define Build/Prepare
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/luci-app-bmx6/install
$(CP) ./bmx6/* $(1)/
chmod 755 $(1)/www/cgi-bin/bmx6-info
endef
define Package/luci-lib-jquery-1-4/install
$(INSTALL_DIR) $(1)/www/luci-static/resources/jquery/
$(CP) ./jquery/* $(1)/www/luci-static/resources/jquery/
endef
define Package/luci-lib-dracula/install
$(INSTALL_DIR) $(1)/www/luci-static/resources/dracula
$(CP) ./dracula/* $(1)/www/luci-static/resources/dracula/
endef
$(eval $(call BuildPackage,luci-app-bmx6))
$(eval $(call BuildPackage,luci-lib-jquery-1-4))
$(eval $(call BuildPackage,luci-lib-dracula))

View file

@ -0,0 +1,7 @@
config 'bmx6' 'luci'
option ignore '0'
option place 'admin network BMX6'
#option place 'qmp Mesh'
option position '3'
#option json 'http://127.0.0.1/cgi-bin/bmx6-info?'
option json 'exec:/www/cgi-bin/bmx6-info -s'

View file

@ -0,0 +1,277 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
Contributors Jo-Philipp Wich <xm@subsignal.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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
local bmx6json = require("luci.model.bmx6json")
module("luci.controller.bmx6", package.seeall)
function index()
local place = {}
local ucim = require "luci.model.uci"
local uci = ucim.cursor()
-- checking if ignore is on
if uci:get("luci-bmx6","luci","ignore") == "1" then
return nil
end
-- getting value from uci database
local uci_place = uci:get("luci-bmx6","luci","place")
-- default values
if uci_place == nil then
place = {"bmx6"}
else
local util = require "luci.util"
place = util.split(uci_place," ")
end
-- getting position of menu
local uci_position = uci:get("luci-bmx6","luci","position")
---------------------------
-- Starting with the pages
---------------------------
--- status (default)
entry(place,call("action_nodes_j"),place[#place],tonumber(uci_position))
table.insert(place,"Status")
entry(place,call("action_status_j"),"Status",0)
table.remove(place)
--- nodes
table.insert(place,"Nodes")
entry(place,call("action_nodes_j"),"Nodes",1)
table.remove(place)
--- links
table.insert(place,"Links")
entry(place,call("action_links"),"Links",2).leaf = true
table.remove(place)
-- Tunnels
table.insert(place,"Tunnels")
entry(place,call("action_tunnels_j"), "Tunnels", 3).leaf = true
table.remove(place)
--- Chat
table.insert(place,"Chat")
entry(place,call("action_chat"),"Chat",5)
table.remove(place)
--- Graph
table.insert(place,"Graph")
entry(place, template("bmx6/graph"), "Graph",4)
table.remove(place)
--- Topology (hidden)
table.insert(place,"topology")
entry(place, call("action_topology"), nil)
table.remove(place)
--- configuration (CBI)
table.insert(place,"Configuration")
entry(place, cbi("bmx6/main"), "Configuration",6).dependent=false
table.insert(place,"General")
entry(place, cbi("bmx6/main"), "General",1)
table.remove(place)
table.insert(place,"Advanced")
entry(place, cbi("bmx6/advanced"), "Advanced",5)
table.remove(place)
table.insert(place,"Interfaces")
entry(place, cbi("bmx6/interfaces"), "Interfaces",2)
table.remove(place)
table.insert(place,"Tunnels")
entry(place, cbi("bmx6/tunnels"), "Tunnels",3)
table.remove(place)
table.insert(place,"Plugins")
entry(place, cbi("bmx6/plugins"), "Plugins",6)
table.remove(place)
table.insert(place,"HNAv6")
entry(place, cbi("bmx6/hna"), "HNAv6",4)
table.remove(place)
table.remove(place)
end
function action_status_j()
luci.template.render("bmx6/status_j", {})
end
function action_nodes_j()
local http = require "luci.http"
local link_non_js = "/cgi-bin/luci" .. http.getenv("PATH_INFO") .. '/nodes_nojs'
luci.template.render("bmx6/nodes_j", {link_non_js=link_non_js})
end
function action_gateways_j()
luci.template.render("bmx6/gateways_j", {})
end
function action_tunnels_j()
luci.template.render("bmx6/tunnels_j", {})
end
function action_links(host)
local links = bmx6json.get("links", host)
local devlinks = {}
local _,l
if links ~= nil then
links = links.links
for _,l in ipairs(links) do
devlinks[l.viaDev] = {}
end
for _,l in ipairs(links) do
l.name = luci.util.split(l.name,'.')[1]
table.insert(devlinks[l.viaDev],l)
end
end
luci.template.render("bmx6/links", {links=devlinks})
end
function action_topology()
local originators = bmx6json.get("originators/all")
local o,i,l,i2
local first = true
local topology = '[ '
local cache = '/tmp/bmx6-topology.json'
local offset = 60
local cachefd = io.open(cache,r)
local update = false
if cachefd ~= nil then
local lastupdate = tonumber(cachefd:read("*line")) or 0
if os.time() >= lastupdate + offset then
update = true
else
topology = cachefd:read("*all")
end
cachefd:close()
end
if cachefd == nil or update then
for i,o in ipairs(originators) do
local links = bmx6json.get("links",o.primaryIp)
if links then
if first then
first = false
else
topology = topology .. ', '
end
topology = topology .. '{ "name": "%s", "links": [' %o.name
local first2 = true
for i2,l in ipairs(links.links) do
if first2 then
first2 = false
else
topology = topology .. ', '
end
name = l.name or l.llocalIp or "unknown"
topology = topology .. '{ "name": "%s", "rxRate": %s, "txRate": %s }'
%{ name, l.rxRate, l.txRate }
end
topology = topology .. ']}'
end
end
topology = topology .. ' ]'
-- Upgrading the content of the cache file
cachefd = io.open(cache,'w+')
cachefd:write(os.time()..'\n')
cachefd:write(topology)
cachefd:close()
end
luci.http.prepare_content("application/json")
luci.http.write(topology)
end
function action_chat()
local sms_dir = "/var/run/bmx6/sms"
local rcvd_dir = sms_dir .. "/rcvdSms"
local send_file = sms_dir .. "/sendSms/chat"
local sms_list = bmx6json.get("rcvdSms")
local sender = ""
local sms_file = ""
local chat = {}
local to_send = nil
local sent = ""
local fd = nil
if luci.sys.call("test -d " .. sms_dir) ~= 0 then
luci.template.render("bmx6/error", {txt="sms plugin disabled or some problem with directory " .. sms_dir})
return nil
end
sms_list = luci.util.split(luci.util.exec("ls "..rcvd_dir.."/*:chat"))
for _,sms_path in ipairs(sms_list) do
if #sms_path > #rcvd_dir then
sms_file = luci.util.split(sms_path,'/')
sms_file = sms_file[#sms_file]
sender = luci.util.split(sms_file,':')[1]
-- Trying to clean the name
if string.find(sender,".") ~= nil then
sender = luci.util.split(sender,".")[1]
end
fd = io.open(sms_path,"r")
chat[sender] = fd:read()
fd:close()
end
end
to_send = luci.http.formvalue("toSend")
if to_send ~= nil and #to_send > 1 then
fd = io.open(send_file,"w")
fd:write(to_send)
fd:close()
sent = to_send
else
sent = luci.util.exec("cat "..send_file)
end
luci.template.render("bmx6/chat", {chat=chat,sent=sent})
end

View file

@ -0,0 +1,224 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
Contributors Jo-Philipp Wich <xm@subsignal.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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
local ltn12 = require("luci.ltn12")
local json = require("luci.json")
local util = require("luci.util")
local uci = require("luci.model.uci")
local sys = require("luci.sys")
local template = require("luci.template")
local http = require("luci.http")
local string = require("string")
local table = require("table")
local nixio = require("nixio")
local nixiofs = require("nixio.fs")
local ipairs = ipairs
module "luci.model.bmx6json"
-- Returns a LUA object from bmx6 JSON daemon
function get(field, host)
local url
if host ~= nil then
if host:match(":") then
url = 'http://[%s]/cgi-bin/bmx6-info?' % host
else
url = 'http://%s/cgi-bin/bmx6-info?' % host
end
else
url = uci.cursor():get("luci-bmx6","luci","json")
end
if url == nil then
print_error("bmx6 json url not configured, cannot fetch bmx6 daemon data",true)
return nil
end
local json_url = util.split(url,":")
local raw = ""
if json_url[1] == "http" then
raw,err = wget(url..field,1000)
sys.exec("")
else
if json_url[1] == "exec" then
raw = sys.exec(json_url[2]..' '..field)
else
print_error("bmx6 json url not recognized, cannot fetch bmx6 daemon data. Use http: or exec:",true)
return nil
end
end
local data = nil
if raw and raw:len() > 10 then
local decoder = json.Decoder()
ltn12.pump.all(ltn12.source.string(raw), decoder:sink())
data = decoder:get()
-- else
-- print_error("Cannot get data from bmx6 daemon",true)
-- return nil
end
return data
end
function print_error(txt,popup)
util.perror(txt)
sys.call("logger -t bmx6json " .. txt)
if popup then
http.write('<script type="text/javascript">alert("Some error detected, please check it: '..txt..'");</script>')
else
http.write("<h1>Dammit! some error detected</h1>")
http.write("bmx6-luci: " .. txt)
http.write('<p><FORM><INPUT TYPE="BUTTON" VALUE="Go Back" ONCLICK="history.go(-1)"></FORM></p>')
end
end
function text2html(txt)
txt = string.gsub(txt,"<","{")
txt = string.gsub(txt,">","}")
txt = util.striptags(txt)
return txt
end
function wget(url, timeout)
local rfd, wfd = nixio.pipe()
local pid = nixio.fork()
if pid == 0 then
rfd:close()
nixio.dup(wfd, nixio.stdout)
-- candidates for wget, try first ones with SSL support
local candidates = {{"/usr/bin/wget-ssl",1},{"/usr/bin/wget",0},{"/bin/wget",0}}
local _, bin
for _, bin in ipairs(candidates) do
if nixiofs.access(bin[1], "x") then
if bin[2] == 0 then
nixio.exec(bin[1], "-q", "-O", "-", url)
else
nixio.exec(bin[1], "--no-check-certificate", "-q", "-O", "-", url)
end
end
end
return
else
wfd:close()
rfd:setblocking(false)
local buffer = { }
local err1, err2
while true do
local ready = nixio.poll({{ fd = rfd, events = nixio.poll_flags("in") }}, timeout)
if not ready then
nixio.kill(pid, nixio.const.SIGKILL)
err1 = "timeout"
break
end
local rv = rfd:read(4096)
if rv then
-- eof
if #rv == 0 then
break
end
buffer[#buffer+1] = rv
else
-- error
if nixio.errno() ~= nixio.const.EAGAIN and
nixio.errno() ~= nixio.const.EWOULDBLOCK then
err1 = "error"
err2 = nixio.errno()
end
end
end
nixio.waitpid(pid, "nohang")
if not err1 then
return table.concat(buffer)
else
return nil, err1, err2
end
end
end
function getOptions(name)
-- Getting json and Checking if bmx6-json is avaiable
local options = get("options")
if options == nil or options.OPTIONS == nil then
m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
return nil
else
options = options.OPTIONS
end
-- Filtering by the option name
local i,_
local namedopt = nil
if name ~= nil then
for _,i in ipairs(options) do
if i.name == name and i.CHILD_OPTIONS ~= nil then
namedopt = i.CHILD_OPTIONS
break
end
end
end
return namedopt
end
-- Rturns a help string formated to be used in HTML scope
function getHtmlHelp(opt)
if opt == nil then return nil end
local help = ""
if opt.help ~= nil then
help = text2html(opt.help)
end
if opt.syntax ~= nil then
help = help .. "<br/><b>Syntax: </b>" .. text2html(opt.syntax)
end
return help
end
function testandreload()
local test = sys.call('bmx6 -c --test > /tmp/bmx6-luci.err.tmp')
if test ~= 0 then
return sys.exec("cat /tmp/bmx6-luci.err.tmp")
end
local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
if err ~= 0 then
return sys.exec("cat /tmp/bmx6-luci.err.tmp")
end
return nil
end

View file

@ -0,0 +1,75 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
m = Map("bmx6", "bmx6")
local bmx6json = require("luci.model.bmx6json")
local util = require("luci.util")
local http = require("luci.http")
local sys = require("luci.sys")
local options = bmx6json.get("options")
if options == nil or options.OPTIONS == nil then
m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
options = {}
else
options = options.OPTIONS
end
local general = m:section(NamedSection,"general","bmx6")
general.addremove = true
local name = ""
local help = ""
local value = nil
local _,o
for _,o in ipairs(options) do
if o.name ~= nil and o.CHILD_OPTIONS == nil and o.configurable == 1 then
help = ""
name = o.name
if o.help ~= nil then
help = bmx6json.text2html(o.help)
end
if o.syntax ~= nil then
help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
end
if o.def ~= nil then
help = help .. "<strong> Default: </strong>" .. o.def
end
value = general:option(Value,name,name,help)
end
end
function m.on_commit(self,map)
local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
if err ~= 0 then
m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
end
end
return m

View file

@ -0,0 +1,47 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
local sys = require("luci.sys")
m = Map("bmx6", "bmx6")
local hna = m:section(TypedSection,"unicastHna","IPv6 HNA")
hna.addremove = true
hna.anonymous = true
local hna_option = hna:option(Value,"unicastHna", "IPv6 Host Network Announcement. Syntax <NETADDR>/<PREFIX>")
--function hna_option:validate(value)
-- local err = sys.call('bmx6 -c --test -a ' .. value)
-- if err ~= 0 then
-- return nil
-- end
-- return value
--end
function m.on_commit(self,map)
local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
if err ~= 0 then
m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
end
end
return m

View file

@ -0,0 +1,77 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
local sys = require("luci.sys")
local bmx6json = require("luci.model.bmx6json")
local m = Map("bmx6", "bmx6")
local eth_int = sys.net.devices()
local interfaces = m:section(TypedSection,"dev","Devices","")
interfaces.addremove = true
interfaces.anonymous = true
local intlv = interfaces:option(ListValue,"dev","Device")
for _,i in ipairs(eth_int) do
intlv:value(i,i)
end
-- Getting json and looking for device section
local json = bmx6json.get("options")
if json == nil or json.OPTIONS == nil then
m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
json = {}
else
json = json.OPTIONS
end
local dev = {}
for _,j in ipairs(json) do
if j.name == "dev" and j.CHILD_OPTIONS ~= nil then
dev = j.CHILD_OPTIONS
break
end
end
local help = ""
local name = ""
for _,o in ipairs(dev) do
if o.name ~= nil then
help = ""
name = o.name
if o.help ~= nil then
help = bmx6json.text2html(o.help)
end
if o.syntax ~= nil then
help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
end
value = interfaces:option(Value,name,name,help)
value.optional = true
end
end
return m

View file

@ -0,0 +1,105 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
local sys = require("luci.sys")
local bmx6json = require("luci.model.bmx6json")
m = Map("bmx6", "bmx6")
-- Getting json and Checking if bmx6-json is avaiable
local options = bmx6json.get("options")
if options == nil or options.OPTIONS == nil then
m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
return m
else
options = options.OPTIONS
end
-- Getting a list of interfaces
local eth_int = luci.sys.net.devices()
local tunDev = m:section(TypedSection,"tunDev",translate("Tunnel device"),translate("Define incoming ipip tunnel interface name"))
tunDev.addremove = true
tunDev.anonymous = true
tunDev:option(Value,"tunDev",translate("Name"),translate("Name for the tunnel network device"))
tunDev:option(Value,"tun4Address", translate("IPv4 address/length"),translate("Specify default IPv4 tunnel address and announced range (ex. 10.1.2.3/24)"))
tunDev:option(Value,"tun6Address", translate("IPv6 address/length"),translate("Specify default IPv6 tunnel address and announced range (ex. 2012:0:0:123:0:0:0:1/64)"))
-- IP section
local ipV = m:section(NamedSection,"ipVersion","ipVersion",translate("Miscellaneous IP options"))
ipV.addremove = false
local lipv = ipV:option(ListValue,"ipVersion",translate("IP version"))
lipv:value("6","6")
lipv.default = "6"
-- rest of ip options are optional, getting them from json
local ipoptions = {}
for _,o in ipairs(options) do
if o.name == "ipVersion" and o.CHILD_OPTIONS ~= nil then
ipoptions = o.CHILD_OPTIONS
break
end
end
local help = ""
local name = ""
local value = nil
for _,o in ipairs(ipoptions) do
if o.name ~= nil then
help = ""
name = o.name
if o.help ~= nil then
help = bmx6json.text2html(o.help)
end
if o.syntax ~= nil then
help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
end
if o.def ~= nil then
help = help .. "<br/><strong> Default: </strong>" .. bmx6json.text2html(o.def)
end
value = ipV:option(Value,name,name,help)
value.optional = true
end
end
-- Interfaces section
local interfaces = m:section(TypedSection,"dev",translate("Devices"),translate("Network devices to mesh with"))
interfaces.addremove = true
interfaces.anonymous = true
local intlv = interfaces:option(ListValue,"dev",translate("Device"))
for _,i in ipairs(eth_int) do
intlv:value(i,i)
end
function m.on_commit(self,map)
local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
if err ~= 0 then
m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
end
end
return m

View file

@ -0,0 +1,50 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
local sys = require("luci.sys")
m = Map("bmx6", "bmx6")
plugins_dir = {"/usr/lib/","/var/lib","/lib"}
plugin = m:section(TypedSection,"plugin","Plugin")
plugin.addremove = true
plugin.anonymous = true
plv = plugin:option(ListValue,"plugin", "Plugin")
for _,d in ipairs(plugins_dir) do
pl = luci.sys.exec("cd "..d..";ls bmx6_*")
if #pl > 6 then
for _,v in ipairs(luci.util.split(pl,"\n")) do
plv:value(v,v)
end
end
end
function m.on_commit(self,map)
local err = sys.call('/etc/init.d/bmx6 restart')
if err ~= 0 then
m.message = sys.exec("Cannot restart bmx6")
end
end
return m

View file

@ -0,0 +1,70 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
local sys = require("luci.sys")
local bmx6json = require("luci.model.bmx6json")
m = Map("bmx6", "bmx6")
-- tunOut
local tunnelsOut = m:section(TypedSection,"tunOut",translate("Networks to fetch"),translate("Gateways announcements to fetch"))
tunnelsOut.addremove = true
tunnelsOut.anonymous = true
tunnelsOut:option(Value,"tunOut","Name")
tunnelsOut:option(Value,"network", translate("Network to fetch"))
local tunoptions = bmx6json.getOptions("tunOut")
local _,o
for _,o in ipairs(tunoptions) do
if o.name ~= nil and o.name ~= "network" then
help = bmx6json.getHtmlHelp(o)
value = tunnelsOut:option(Value,o.name,o.name,help)
value.optional = true
end
end
-- tunOut
local tunnelsIn = m:section(TypedSection,"tunIn",translate("Networks to offer"),translate("Gateways to announce in the network"))
tunnelsIn.addremove = true
tunnelsIn.anonymous = true
tunnelsIn:option(Value,"tunIn","Name")
tunnelsIn:option(Value,"network", translate("Network to offer"))
local tunInoptions = bmx6json.getOptions("tunIn")
local _,o
for _,o in ipairs(tunInoptions) do
if o.name ~= nil and o.name ~= "network" then
help = bmx6json.getHtmlHelp(o)
value = tunnelsIn:option(Value,o.name,o.name,help)
value.optional = true
end
end
function m.on_commit(self,map)
--Not working. If test returns error the changes are still commited
local msg = bmx6json.testandreload()
if msg ~= nil then
m.message = msg
end
end
return m

View file

@ -0,0 +1,108 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(5, '/cgi-bin/bmx6-info', { 'neighbours': '' },
function(x, st)
{
var originators = st.neighbours[0].originators;
var descriptions = st.neighbours[1].descriptions;
var tb = document.getElementById('descriptions_table');
if ( originators.length != descriptions.length )
{
var tr = tb.insertRow(-1);
tr.className = 'cbi-section-table-row';
var td = tr.insertCell(-1);
td.colSpan = 7;
td.innerHTML = '<em><br /><%:Some problem with JSON: lenght of originators and descriptions different. %></em>';
return 1;
}
if ( originators && descriptions && tb)
{
/* clear all rows */
while( tb.rows.length > 1 )
tb.deleteRow(1);
for( var i = 0; i < descriptions.length; i++ )
{
var tr = tb.insertRow(-1);
tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
tr.insertCell(-1).innerHTML = descriptions[i].DESC_ADV.globalId.replace(/\.[^\.]+$/,"");
var extensions = descriptions[i].DESC_ADV.extensions;
//Looking for the extensions
var hna6 = [];
for( var e = 0; e < extensions.length; e++)
{
if( extensions[e].HNA6_EXTENSION )
{
hna6 = extensions[e].HNA6_EXTENSION;
break;
}
}
//Adding first HNA with prefix=128 as main address
var ipstxt = '';
var address;
var prefix;
for( var e = 0; e < hna6.length; e++ )
{
address = hna6[e].address;
prefix = hna6[e].prefixlen;
if ( prefix == '128' )
{
ipstxt += address;
break;
}
}
tr.insertCell(-1).innerHTML = ipstxt;
tr.insertCell(-1).innerHTML = originators[i].viaDev;
tr.insertCell(-1).innerHTML = originators[i].metric;
tr.insertCell(-1).innerHTML = originators[i].lastDesc;
tr.insertCell(-1).innerHTML = originators[i].lastRef;
tr.insertCell(-1).innerHTML = originators[i].blocked;
}
if( tb.rows.length == 1 )
{
var tr = tb.insertRow(-1);
tr.className = 'cbi-section-table-row';
var td = tr.insertCell(-1);
td.colSpan = 7;
td.innerHTML = '<em><br /><%:There are no nodes available.%></em>';
}
}
}
);
//]]></script>
<div class="cbi-map">
<fieldset class="cbi-section">
<legend><%:Mesh nodes%></legend>
<table class="cbi-section-table" id="descriptions_table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"><%:Hostname%></th>
<th class="cbi-section-table-cell"><%:Primary IP%></th>
<th class="cbi-section-table-cell"><%:Via Device%></th>
<th class="cbi-section-table-cell"><%:Metric%></th>
<th class="cbi-section-table-cell"><%:Last Desc%></th>
<th class="cbi-section-table-cell"><%:Last Ref%></th>
<th class="cbi-section-table-cell"><%:Blocked%></th>
</tr>
<tr class="cbi-section-table-row">
<td colspan="7"><em><br /><%:Collecting data...%></em></td>
</tr>
</table>
</fieldset>
</div>

View file

@ -0,0 +1,35 @@
<%+header%>
<meta http-equiv="refresh" content="60" />
<h2><a id="content" name="content"><%:Chat%></a></h2>
<p>This is sms a chat where all bmx6 nodes can participate. The data is replayed using routing packets, so there is a limit of 2040 bytes. Use it only to send short messages.</p>
<p>Each participant can only send one sms at same time.</p>
<br />
<strong>Received SMS</strong>
<br />
<pre style="background-color:#dadbe6;">
<% for orig,sms in pairs(chat) do %>
<u><%=orig%></u>:<%=sms%>
<% end %>
</pre>
<form action=".">
<input type="submit" value="refresh" />
</form>
<br />
<form action="." method="post">
<input type="text" name="toSend" />
<input type="submit" value="send sms" />
</form>
<br />
<table>
<tr>
<td><strong>Your last sms: </strong></td>
<td><pre><%=sent%></pre></td>
</tr>
</table>
<%+footer%>

View file

@ -0,0 +1,10 @@
<%+header%>
<h2><a id="content" name="content"><%:ERROR%></a></h2>
<strong>Some error has occurred</strong>
<br />
<pre>
<%=txt%>
</pre>
<br />
<%+footer%>

View file

@ -0,0 +1,120 @@
<%+header%>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript">//<![CDATA[
var displayExtraInfo = function ( id ) {
document.getElementById('extra-info').innerHTML = document.getElementById(id).innerHTML;
}
XHR.poll(5, '/cgi-bin/bmx6-info', { 'descriptions/all': '' },
function(x, st)
{
var tb = document.getElementById('descriptions_table');
var rowcount = 0;
var tunicon = "<%=resource%>/icons/tunnel.png";
/* clear all rows */
while( tb.rows.length > 1 ) tb.deleteRow(1);
for ( var k in st )
{
var description = st[k].DESC_ADV;
var tun4in6;
for ( var k in description.extensions )
{
var value = description.extensions[k];
if ( value.TUN4IN6_NET_EXTENSION )
{
tun4in6 = value.TUN4IN6_NET_EXTENSION;
break;
}
}
if ( tun4in6 )
{
var nodename = description.globalId.replace(/\..+$/,'');
for( var i = 0; i < tun4in6.length; i++ )
{
var tr = tb.insertRow(-1);
var network = tun4in6[i].network;
var network_len = tun4in6[i].networklen;
var network_bw = tun4in6[i].bandwidth;
if ( network_len >= 32 ) continue;
tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((rowcount++ % 2) + 1);
tr.insertCell(-1).innerHTML = String.format('<a href="/cgi-bin/bmx6control?function=gwselect&amp;node=%s"><img src="%s" /></a>',nodename,tunicon);
tr.insertCell(-1).innerHTML = nodename;
tr.insertCell(-1).innerHTML = network + '/' + network_len;
tr.insertCell(-1).innerHTML = network_bw;
}
if( tb.rows.length == 1 )
{
var tr = tb.insertRow(-1);
tr.className = 'cbi-section-table-row';
var td = tr.insertCell(-1);
td.colSpan = 4;
td.innerHTML = '<em><br /><%:There are no gateways announced in the network.%></em>';
}
}
}
}
);
//]]></script>
<style>
div.hideme{
display: none;
}
div.info{
background: #FFF;
border: solid 1px;
height: 80px;
display: block;
overflow: auto;
}
div.inforow{
text-align:left;
display:inline-block;
width:20%;
margin:5px;
vertical-align:top;
}
#extra-info ul { list-style: none outside none; margin-left: 0em; }
</style>
<div class="cbi-map">
<h2>Originators</h2>
<div class="cbi-map-descr"></div>
<fieldset class="cbi-section">
<legend><%:Mesh gateways%></legend>
<table class="cbi-section-table" id="descriptions_table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"></th>
<th class="cbi-section-table-cell"><%:Node%></th>
<th class="cbi-section-table-cell"><%:Network%></th>
<th class="cbi-section-table-cell"><%:Bandwidth%></th>
</tr>
<tr class="cbi-section-table-row">
<td colspan="4"><em><br /><%:Collecting data...%></em></td>
</tr>
</table>
</fieldset>
</div>
<%+footer%>

View file

@ -0,0 +1,49 @@
<%#
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
Contributors Jo-Philip
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
-%>
<%
luci.http.prepare_content("text/html")
local location = { unpack(luci.dispatcher.context.path) }
location[#location] = "topology"
%>
<%+header%>
<button id="redraw" onclick="redraw();">&nbsp redraw &nbsp</button>
<div id="wait" style="text-align: center">
<br /><br />
<img src="<%=resource%>/icons/loading.gif" />
<%:Collecting data...%>
</div>
<div id="canvas" style="min-width:1024px; min-height:1024px"></div>
<script type="text/javascript" src="<%=resource%>/jquery/jquery-1.4.js"></script>
<script type="text/javascript" src="<%=resource%>/dracula/raphael-min.js"></script>
<script type="text/javascript" src="<%=resource%>/dracula/dracula_graffle.js"></script>
<script type="text/javascript" src="<%=resource%>/dracula/dracula_graph.js"></script>
<script type="text/javascript" src="<%=resource%>/bmx6/js/bmx6-graph.js"></script>
<%+footer%>

View file

@ -0,0 +1,55 @@
<%+header%>
<meta http-equiv="refresh" content="10" />
<h2><a id="content" name="content"><%:Links%></a></h2>
<br />
<div id="links" style="position:relative;padding-left:2px">
<% for j,d in pairs(links) do %>
<table>
<tr>
<td><img src="/luci-static/resources/bmx6/wifi.png"/></td>
<td><strong><%=j%></strong></td>
</tr>
</table>
<div style="display:table">
<% for i,l in ipairs(d) do %>
<div id="link" style="background-color:#dadbe9;left:50px;width:300px;margin:10px;float:left;position:relative">
<table>
<tr><th colspan="2">
<span style="color:grey;font-weight:700;text-align:left;">
<%=l.name%>
<br />
</span>
</th></tr>
<tr>
<td><img src="/luci-static/resources/bmx6/link.png"/></td>
<td>
<ul>
<li>Local IP: <a href="[<%=l.llocalIp%>]"><%=l.llocalIp%></a></li>
<li>Device: <%=l.viaDev%></li>
<li>Rate (rx/tx):
<% if l.rxRate+l.txRate < 120 then %>
<span style="color:red;">
<% else %>
<span style="color:green;">
<% end %>
<%=l.rxRate%>/<%=l.txRate%>
</span>
</li>
<li>Routes: <%=l.routes%></li>
</ul>
</td>
</tr>
</table>
</div>
<% end %>
</div>
<% end %>
</div>
<br />
<br />
<%+footer%>

Some files were not shown because too many files have changed in this diff Show more