Compare commits
656 commits
openwrt-18
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
61f15a76a6 | ||
|
9090aefa69 | ||
|
6a7a1a5dab | ||
|
5b1caf1968 | ||
|
b40ad195c2 | ||
|
6f74738b72 | ||
|
96b5fa139c | ||
|
a5ec54aee3 | ||
|
f0f1b0a33e | ||
|
28b8a5eafe | ||
|
b69c62925f | ||
|
1bdab4b1b5 | ||
|
601bd6c045 | ||
|
2a725e7cbe | ||
|
49da9e9f46 | ||
|
fe1c67fb3d | ||
|
c2124dd2ad | ||
|
9fb9d9343e | ||
|
88c98c910a | ||
|
d86c0c24c8 | ||
|
364379c056 | ||
|
6f6bcba663 | ||
|
167d93cc32 | ||
|
8fd009ed71 | ||
|
e7ee4c55de | ||
|
5beb3be9b8 | ||
|
e4a53c1354 | ||
|
3eb9aa3056 | ||
|
967dde509b | ||
|
eb8978ebf7 | ||
|
91e07907fa | ||
|
0221a2a001 | ||
|
c7bc308c78 | ||
|
fa136b70df | ||
|
9e13652bbf | ||
|
26f5f0f812 | ||
|
bdf923742a | ||
|
04a287eea0 | ||
|
f165789ced | ||
|
06b7d9b665 | ||
|
5aa683be13 | ||
|
299ee2b1cf | ||
|
89cf0d5619 | ||
|
28d204148a | ||
|
61997c86b0 | ||
|
f818fe716e | ||
|
53a53b8ee3 | ||
|
7928f7d399 | ||
|
b3b01af314 | ||
|
c993ee8a89 | ||
|
7b1911020b | ||
|
aab3b64e09 | ||
|
dc5e428ee4 | ||
|
618e80a06a | ||
|
593a514ab5 | ||
|
04bbb0a87e | ||
|
3d6c7c64a9 | ||
|
b23dadccf2 | ||
|
6afc0452c2 | ||
|
e8856b93da | ||
|
c9a8f2d032 | ||
|
03ca0722f7 | ||
|
51c05a1030 | ||
|
3e96c851a7 | ||
|
a26e3441d8 | ||
|
e2eb84791c | ||
|
67ad3b9b96 | ||
|
9febc56a44 | ||
|
8fe743c2a1 | ||
|
2eb71d7d7a | ||
|
1b063f315e | ||
|
c37fbab8f5 | ||
|
d32f93e049 | ||
|
6697ca291f | ||
|
914c27aeb6 | ||
|
5d87b95697 | ||
|
3f74d8a16a | ||
|
521a4068de | ||
|
8a82f32d3f | ||
|
7d6f3c0492 | ||
|
14afd9b172 | ||
|
20e1b16a97 | ||
|
bb65c3a18d | ||
|
3d5c0b5532 | ||
|
64fbf9a16c | ||
|
b70ac8f9da | ||
|
b4034e4ae1 | ||
|
18168b3468 | ||
|
d27be8dad9 | ||
|
c8ba43a99b | ||
|
7d5e0de8a6 | ||
|
53ab677c9e | ||
|
b65ef40e46 | ||
|
c470bff2d8 | ||
|
a1d97192f8 | ||
|
7086d85595 | ||
|
d5c4ef98c9 | ||
|
6c31b5bd1c | ||
|
a3843dd321 | ||
|
5ca59df102 | ||
|
fb4beaee20 | ||
|
081291592e | ||
|
c2f9428ac5 | ||
|
079c922b54 | ||
|
88ee3e69d6 | ||
|
fb41ed5cc8 | ||
|
6cccf1fd65 | ||
|
290ed82bd8 | ||
|
b6f063dcca | ||
|
6af0f221b2 | ||
|
5db5b129f8 | ||
|
0e88798681 | ||
|
4a2b53b10d | ||
|
9abed61018 | ||
|
1fa9fa339c | ||
|
cfd82729a9 | ||
|
bb5bbc6afd | ||
|
d705f79890 | ||
|
217330bb5e | ||
|
09d5ceb923 | ||
|
e2d72c5775 | ||
|
80817c8d59 | ||
|
983096d308 | ||
|
9028f67afd | ||
|
50e02d4cff | ||
|
4216c909aa | ||
|
8770d8ffb6 | ||
|
b35766330b | ||
|
6a5c3db321 | ||
|
4868b8941c | ||
|
b65a8ca03a | ||
|
20621cf8a1 | ||
|
0fd4ed1d3e | ||
|
d929509b12 | ||
|
b1d9a55b49 | ||
|
500352d44f | ||
|
73195d63da | ||
|
8574cb411a | ||
|
65f747a8bc | ||
|
5702d2e40b | ||
|
2134c56d12 | ||
|
93efc5b8e1 | ||
|
dbff012a2f | ||
|
a618159d33 | ||
|
e3c6842923 | ||
|
d078190b84 | ||
|
319fac32b1 | ||
|
1cd72bff83 | ||
|
fe7f1936d1 | ||
|
d5a7e526c7 | ||
|
8ec1cd2f67 | ||
|
528bb41cc9 | ||
|
c9a7659f2f | ||
|
c64e02c5b5 | ||
|
eefb80705e | ||
|
699106ac8e | ||
|
9652952036 | ||
|
e06a6c962b | ||
|
88dd5412d6 | ||
|
19e0ca1951 | ||
|
282af3f8bc | ||
|
56fc0d7226 | ||
|
4a65336e08 | ||
|
3bc3fc3c63 | ||
|
6bfc5220fd | ||
|
0beeb0794c | ||
|
1b00a068e5 | ||
|
91230a4c14 | ||
|
823acb605b | ||
|
abc95d7807 | ||
|
13e7e88610 | ||
|
4afbe17480 | ||
|
d7adf188eb | ||
|
3aa4cfbe7b | ||
|
911a4bab8e | ||
|
55a8827ad8 | ||
|
879725ce3e | ||
|
3852004435 | ||
|
0bffe620b4 | ||
|
817240b07c | ||
|
24285ce4fc | ||
|
cf34c5a4a1 | ||
|
576967a2a3 | ||
|
abc3468e28 | ||
|
e3035a6c9e | ||
|
d0884e3e31 | ||
|
65585a746d | ||
|
3d6b699668 | ||
|
a2fe1d4131 | ||
|
523821c195 | ||
|
ec33ebf0f6 | ||
|
5f10800d46 | ||
|
3b4a117349 | ||
|
ca6c9edc3e | ||
|
212cf4be36 | ||
|
c28f02f679 | ||
|
7e555f1cdd | ||
|
4a4268524a | ||
|
edc1736704 | ||
|
260e16b32a | ||
|
4f235865e7 | ||
|
9cb03f0a2f | ||
|
564ca99e2c | ||
|
ade1fa6ebc | ||
|
e9d5f990a3 | ||
|
ce0b8b1e55 | ||
|
b51394fdd7 | ||
|
e7e6800c67 | ||
|
2ac3accf36 | ||
|
71c11ab1b7 | ||
|
2cf253b3df | ||
|
6d463ca97c | ||
|
0bb6aa04f6 | ||
|
e35255710b | ||
|
7fb22c4ad2 | ||
|
e43c272acb | ||
|
645064d727 | ||
|
4c5c285373 | ||
|
a7b79a1d4f | ||
|
fffa9cb161 | ||
|
7684cdd73d | ||
|
85a8ceeb75 | ||
|
f399156f45 | ||
|
d37f84e402 | ||
|
5eda02f74c | ||
|
47cd2a4b62 | ||
|
383c52ff8d | ||
|
d4ff15eb4c | ||
|
f4251ccf69 | ||
|
0a23eb0fd9 | ||
|
1088e65440 | ||
|
87be9afac6 | ||
|
775d030a58 | ||
|
bc58bd99e8 | ||
|
8483b6d99f | ||
|
eff944874c | ||
|
5311c844b6 | ||
|
17b6e99825 | ||
|
64aa8866b7 | ||
|
b81e9c8bab | ||
|
9a90e3dd65 | ||
|
034ec30869 | ||
|
27987162f7 | ||
|
1d10931616 | ||
|
d709225ed0 | ||
|
519d7bae29 | ||
|
a302ee6265 | ||
|
4bf9a5d5dc | ||
|
dc0adf7dce | ||
|
1326a6c252 | ||
|
771427cc27 | ||
|
a46eb8b842 | ||
|
cfd8ab958f | ||
|
27ac56adc6 | ||
|
4f7791a1fd | ||
|
bdec65a6d9 | ||
|
e62b8b54b9 | ||
|
7ca6e2827f | ||
|
6dac4d296c | ||
|
b455e1809a | ||
|
8c7bcb7206 | ||
|
b65879895a | ||
|
d1ab87b7db | ||
|
dc22d38f91 | ||
|
83774bf54a | ||
|
6cd369d1aa | ||
|
71bb32684b | ||
|
8a58147d3e | ||
|
39da22d04a | ||
|
1c3233ca67 | ||
|
473f467f29 | ||
|
ec2d554762 | ||
|
b6a5577fab | ||
|
54fd237d8b | ||
|
b38a46acd5 | ||
|
dcff996cbe | ||
|
1c9bb999e1 | ||
|
0f1d89c2e9 | ||
|
d63eda01ff | ||
|
ad85bc8142 | ||
|
993f03cecb | ||
|
86991248ac | ||
|
72408a9cf8 | ||
|
519c1ff731 | ||
|
2e602f7b33 | ||
|
58e0a4d5c3 | ||
|
8de6e21ec5 | ||
|
6c81fc2916 | ||
|
39cf9f5b47 | ||
|
ea4a3f28dc | ||
|
bb95bffc16 | ||
|
25d53e8462 | ||
|
0907cf0a94 | ||
|
4407369e70 | ||
|
3dd7f27558 | ||
|
330a0cc9d4 | ||
|
068a0613a9 | ||
|
52be3011ec | ||
|
4f2528a796 | ||
|
7dba1fdbff | ||
|
331bc1cd3b | ||
|
89d7857d0e | ||
|
aca51f8149 | ||
|
3e6059ff4a | ||
|
22a5a2286f | ||
|
f690ecb7e0 | ||
|
0193fa585b | ||
|
e15d793a49 | ||
|
094170ac0d | ||
|
9a89e57d76 | ||
|
a30eca4a0a | ||
|
c3c3be6457 | ||
|
186b2117f4 | ||
|
b389738677 | ||
|
6e72bcffa5 | ||
|
9cfb2ea631 | ||
|
7e01ee3b8e | ||
|
025f05fd42 | ||
|
ef0fe62653 | ||
|
d30adf2d53 | ||
|
a42325b471 | ||
|
de3a284abc | ||
|
ee39c58637 | ||
|
a7bf414264 | ||
|
d59c3f1f6f | ||
|
1d00adeb94 | ||
|
b309086fa2 | ||
|
5cc8e05885 | ||
|
741a6b9f77 | ||
|
c201b00922 | ||
|
4e7401602b | ||
|
7091b78760 | ||
|
b25be11308 | ||
|
94a8e1ade5 | ||
|
fa7998661e | ||
|
4a1a536059 | ||
|
3970efa5a1 | ||
|
78d72b68f5 | ||
|
9c4bb575b2 | ||
|
e4b5d31049 | ||
|
14668df74b | ||
|
33ddb02b91 | ||
|
9916479e7c | ||
|
ff5f25a6ef | ||
|
f0f0a892d8 | ||
|
587e2d8b9c | ||
|
fdd74f951c | ||
|
ffa7f2c6ea | ||
|
8f9aa112b5 | ||
|
4ae3c3f280 | ||
|
94d87cd7e8 | ||
|
9852b614a2 | ||
|
f6e792907f | ||
|
47d63604bc | ||
|
52a15799f8 | ||
|
ee1125153c | ||
|
c78adaf400 | ||
|
2b6a4e1beb | ||
|
272cd4c998 | ||
|
920a0457a2 | ||
|
71d7806ba1 | ||
|
4cff2b1bd6 | ||
|
83a3fa91b0 | ||
|
5e4756d7e7 | ||
|
75fab33c4a | ||
|
aa8705683e | ||
|
2f54cd50a3 | ||
|
346e1b59f3 | ||
|
7dc6600115 | ||
|
d6ba424d34 | ||
|
6d40c78639 | ||
|
43e4da9ac5 | ||
|
0aa846dec7 | ||
|
f43bc85647 | ||
|
07bdc8f422 | ||
|
f71d733392 | ||
|
b9ff16ecd5 | ||
|
512240f480 | ||
|
e002648835 | ||
|
cc0ce25bb0 | ||
|
4561a42ac4 | ||
|
b3f1370d9a | ||
|
00de979415 | ||
|
bacc8c1385 | ||
|
05da6ef2ca | ||
|
6c4c46fc34 | ||
|
d79eeefa1c | ||
|
196e771be0 | ||
|
520356e3f6 | ||
|
51b370e1ce | ||
|
b92f82ad1f | ||
|
c9ae9c8c50 | ||
|
c225724e8f | ||
|
6debd2f564 | ||
|
ba199245ec | ||
|
13f4c0d909 | ||
|
4f945bba16 | ||
|
5544be5234 | ||
|
94ec27ffb5 | ||
|
5bd07eb12b | ||
|
4a418ce7bb | ||
|
68fbe6d74a | ||
|
31407945f9 | ||
|
102ae19b73 | ||
|
c5004988d3 | ||
|
612bd5e5f6 | ||
|
4b457916ea | ||
|
d0e785aff3 | ||
|
79a4543cf0 | ||
|
f75b19d42f | ||
|
381f09346f | ||
|
87d0884fa5 | ||
|
ca06c3fc17 | ||
|
bb8a0621c6 | ||
|
366c9e0078 | ||
|
23ecedee92 | ||
|
8219168994 | ||
|
face529e09 | ||
|
56df2cc303 | ||
|
08ba5e50aa | ||
|
534121e1fe | ||
|
97ffe0b5de | ||
|
def3cd50d8 | ||
|
f131d73979 | ||
|
2fd125f516 | ||
|
ff5100e759 | ||
|
76a5139334 | ||
|
96d96eda8a | ||
|
3e3d16338d | ||
|
06f821adc1 | ||
|
4d62e08852 | ||
|
7eeee8124a | ||
|
5a7cf37dc0 | ||
|
6a92b45fac | ||
|
8a47b231b0 | ||
|
559619d9d9 | ||
|
c687bd3055 | ||
|
5d7f4af534 | ||
|
9403a5d816 | ||
|
c1a41b1740 | ||
|
ec287ab088 | ||
|
ecb7132f01 | ||
|
cf802f8607 | ||
|
157da8c4ee | ||
|
ce3569e159 | ||
|
34b730e6ab | ||
|
a03d198516 | ||
|
a74938ea46 | ||
|
89bcb4b22f | ||
|
c953099d06 | ||
|
7fc5c6e56f | ||
|
9f5d42692e | ||
|
66121b8879 | ||
|
d4b95cd0be | ||
|
aa050789fe | ||
|
5802c44e3c | ||
|
f921555cf7 | ||
|
44e375c0a3 | ||
|
4c4b836d89 | ||
|
eb8a4e8e87 | ||
|
8b9a7bba78 | ||
|
a3b7910782 | ||
|
ebc6f4d5b3 | ||
|
ec9d4a6c42 | ||
|
cb3f9d2436 | ||
|
9e7dbf9ba9 | ||
|
d3d9ee26c0 | ||
|
c46019e7ad | ||
|
542db8a71d | ||
|
ff7c509caa | ||
|
a56d996b94 | ||
|
5934ad834f | ||
|
ca83636b2f | ||
|
33aab05acd | ||
|
ac8fc386fc | ||
|
b3ebe49dab | ||
|
e8799fb2ad | ||
|
e87a25f408 | ||
|
67875e2069 | ||
|
eeea3e980e | ||
|
490971e8e5 | ||
|
35b886649b | ||
|
e26096ae1d | ||
|
bf475d6493 | ||
|
fdc37cac29 | ||
|
c514a2a49c | ||
|
d1acf62a57 | ||
|
1ff00eebae | ||
|
7b7da0cddb | ||
|
7accd688e3 | ||
|
37f8c509e0 | ||
|
040b8e8750 | ||
|
0be5aa99e0 | ||
|
f36879fe22 | ||
|
e40f6891e5 | ||
|
0c867de323 | ||
|
312fd8afc1 | ||
|
0a2547a111 | ||
|
9e8aaf9911 | ||
|
55a7a224e1 | ||
|
f049dfde5b | ||
|
b01e4b0e7c | ||
|
20b9ab3cea | ||
|
4265df9dcc | ||
|
1a22e00eeb | ||
|
1cca73b59f | ||
|
a952ac8c88 | ||
|
6141d5d182 | ||
|
409d35885d | ||
|
b57b8dc6d3 | ||
|
54af5a209e | ||
|
571b0b5672 | ||
|
5882b6049d | ||
|
278e98cb86 | ||
|
7d973599ef | ||
|
ad27ee7f9a | ||
|
fc37a1aa4d | ||
|
df9d2719fa | ||
|
ae9c14e8b0 | ||
|
3f0a7c4880 | ||
|
89bc1bc1a1 | ||
|
502d1232f7 | ||
|
203ee34d9c | ||
|
34e4913b57 | ||
|
2d31531737 | ||
|
25916fb99f | ||
|
e29142379e | ||
|
6e8cf7689e | ||
|
e6fc697d41 | ||
|
5d3a71f342 | ||
|
0ba9fa2ba7 | ||
|
13a4dad69a | ||
|
be91e9d6dc | ||
|
f796748997 | ||
|
bc431ae65f | ||
|
498463cd59 | ||
|
1299868252 | ||
|
29d4160f4b | ||
|
f438333a6a | ||
|
fce1287bd7 | ||
|
2c9f89cc76 | ||
|
6c63383f0d | ||
|
a7c447903c | ||
|
2cc3c50bed | ||
|
9bc518e8c8 | ||
|
b6815d5942 | ||
|
940d621757 | ||
|
3264d15492 | ||
|
3e259f8ec5 | ||
|
a7d7f4baa8 | ||
|
9345df949e | ||
|
a31ebca77e | ||
|
a1e102093f | ||
|
db1869971d | ||
|
3d97690ba3 | ||
|
4167ad2c62 | ||
|
8936141bf0 | ||
|
3528a5df09 | ||
|
2681019264 | ||
|
6151c44f22 | ||
|
9bc898b8f4 | ||
|
71664bae65 | ||
|
c3b60d4c84 | ||
|
6a25fd5ce5 | ||
|
0db66160aa | ||
|
45c12f406f | ||
|
c5092c6e78 | ||
|
726b00dc9f | ||
|
c7f14ce932 | ||
|
e6a8135faa | ||
|
3736630676 | ||
|
c903a445a8 | ||
|
542a63720f | ||
|
8112737cdc | ||
|
003607ac1e | ||
|
4303ca68a6 | ||
|
bab933d4ca | ||
|
c5094aac9b | ||
|
372ed0da13 | ||
|
4bfb63f25b | ||
|
a8d3f89007 | ||
|
02e3cb6db9 | ||
|
22fd5c5f06 | ||
|
99430a87e3 | ||
|
89edf8c15d | ||
|
00a6bef40b | ||
|
c394f54b63 | ||
|
cc7986a774 | ||
|
9d7a3f6428 | ||
|
b6efcd5cba | ||
|
0b21cb77d9 | ||
|
f18bdeab6c | ||
|
02966f80c1 | ||
|
938e4dbaa3 | ||
|
e737f4f9c7 | ||
|
dfe80970d5 | ||
|
85d01f8280 | ||
|
6f82d5128e | ||
|
1a27c9a34d | ||
|
9333cdff05 | ||
|
76773ec5dd | ||
|
c7d0e1c7a4 | ||
|
e46736e78c | ||
|
fa70e4cdc6 | ||
|
512084e948 | ||
|
52e2545198 | ||
|
4c7b4a349b | ||
|
45db0e60d2 | ||
|
d01c661c6d | ||
|
afba8ae2c0 | ||
|
afc7b8f64c | ||
|
ce461f8484 | ||
|
7a9336380a | ||
|
303c282565 | ||
|
247499d2b0 | ||
|
643e41c9d6 | ||
|
b30eb65d2f | ||
|
0726085a2d | ||
|
69d016ebe5 | ||
|
ccc93a4c45 | ||
|
74e9124611 | ||
|
846efa2305 | ||
|
0013176125 | ||
|
4f16bcfaaf | ||
|
61ec956a1e | ||
|
43449bcbbd | ||
|
d82d299a27 | ||
|
c299f8bcea | ||
|
3b0ad89f33 | ||
|
440ad460b2 | ||
|
f785dc0e9b | ||
|
633130f8b5 | ||
|
013dcc6817 | ||
|
23c04022c6 | ||
|
688901a664 | ||
|
ecbdeb0500 | ||
|
453de2136e | ||
|
307cf4c1a7 | ||
|
a71ecc3ddd | ||
|
ae4dda6dad | ||
|
ba5d2fc76e | ||
|
0bf3b72c33 | ||
|
23aa2e7b4a | ||
|
fd8f9285e7 | ||
|
68e3498edb | ||
|
3349cae243 | ||
|
069da036cb | ||
|
7ae81c8311 | ||
|
00ae77674f | ||
|
ff7b5da265 | ||
|
2098770710 | ||
|
2f90fe406c | ||
|
fdaa4cde3b | ||
|
4bff0b3c65 | ||
|
135bc605b4 | ||
|
17fccad969 |
280 changed files with 7117 additions and 14601 deletions
16
.github/issue_template
vendored
Normal file
16
.github/issue_template
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
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.
|
||||
|
||||
Issues related to releases below 18.06 and forks are not supported or maintained and will be closed.
|
||||
|
||||
# Issue template (remove lines from top till here)
|
||||
|
||||
Maintainer: @\<github-user> (find it by checking history of the package Makefile)
|
||||
Environment: (put here arch, model, OpenWrt version)
|
||||
|
||||
Description:
|
||||
|
||||
```
|
||||
Formating code blocks by wrapping them with pairs of ```
|
||||
```
|
5
.github/pull_request_template
vendored
Normal file
5
.github/pull_request_template
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
Maintainer: me / @\<github-user> (find it by checking history of the package Makefile)
|
||||
Compile tested: (put here arch, model, OpenWrt version)
|
||||
Run tested: (put here arch, model, OpenWrt version, tests done)
|
||||
|
||||
Description:
|
6
.github/workflows/Dockerfile
vendored
Normal file
6
.github/workflows/Dockerfile
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
ARG ARCH=x86-64
|
||||
FROM openwrt/rootfs:$ARCH
|
||||
|
||||
ADD entrypoint.sh /entrypoint.sh
|
||||
|
||||
CMD ["/entrypoint.sh"]
|
91
.github/workflows/check-autorelease-deprecation.yml
vendored
Normal file
91
.github/workflows/check-autorelease-deprecation.yml
vendored
Normal file
|
@ -0,0 +1,91 @@
|
|||
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
|
26
.github/workflows/ci_helpers.sh
vendored
Normal file
26
.github/workflows/ci_helpers.sh
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
#!/bin/sh
|
||||
|
||||
color_out() {
|
||||
printf "\e[0;$1m$PKG_NAME: %s\e[0;0m\n" "$2"
|
||||
}
|
||||
|
||||
success() {
|
||||
color_out 32 "$1"
|
||||
}
|
||||
|
||||
info() {
|
||||
color_out 36 "$1"
|
||||
}
|
||||
|
||||
err() {
|
||||
color_out 31 "$1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
color_out 33 "$1"
|
||||
}
|
||||
|
||||
err_die() {
|
||||
err "$1"
|
||||
exit 1
|
||||
}
|
62
.github/workflows/entrypoint.sh
vendored
Executable file
62
.github/workflows/entrypoint.sh
vendored
Executable file
|
@ -0,0 +1,62 @@
|
|||
#!/bin/sh
|
||||
|
||||
# not enabling `errtrace` and `pipefail` since those are bash specific
|
||||
set -o errexit # failing commands causes script to fail
|
||||
set -o nounset # undefined variables causes script to fail
|
||||
|
||||
echo "src/gz packages_ci file:///ci" >> /etc/opkg/distfeeds.conf
|
||||
|
||||
FINGERPRINT="$(usign -F -p /ci/packages_ci.pub)"
|
||||
cp /ci/packages_ci.pub "/etc/opkg/keys/$FINGERPRINT"
|
||||
|
||||
mkdir -p /var/lock/
|
||||
|
||||
opkg update
|
||||
|
||||
[ -n "${CI_HELPER:=''}" ] || CI_HELPER="/ci/.github/workflows/ci_helpers.sh"
|
||||
|
||||
for PKG in /ci/*.ipk; do
|
||||
tar -xzOf "$PKG" ./control.tar.gz | tar xzf - ./control
|
||||
# package name including variant
|
||||
PKG_NAME=$(sed -ne 's#^Package: \(.*\)$#\1#p' ./control)
|
||||
# package version without release
|
||||
PKG_VERSION=$(sed -ne 's#^Version: \(.*\)-[0-9]*$#\1#p' ./control)
|
||||
# package source contianing test.sh script
|
||||
PKG_SOURCE=$(sed -ne 's#^Source: .*/\(.*\)$#\1#p' ./control)
|
||||
|
||||
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"
|
||||
|
||||
TEST_SCRIPT=$(find /ci/ -name "$PKG_SOURCE" -type d)/test.sh
|
||||
|
||||
if [ -f "$TEST_SCRIPT" ]; then
|
||||
echo "Use package specific test.sh"
|
||||
if sh "$TEST_SCRIPT" "$PKG_NAME" "$PKG_VERSION"; then
|
||||
echo "Test succesful"
|
||||
else
|
||||
echo "Test failed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "No test.sh script available"
|
||||
fi
|
||||
|
||||
opkg remove "$PKG_NAME" --force-removal-of-dependent-packages --force-remove --autoremove || true
|
||||
done
|
63
.github/workflows/formal.yml
vendored
Normal file
63
.github/workflows/formal.yml
vendored
Normal file
|
@ -0,0 +1,63 @@
|
|||
name: Test Formalities
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Test Formalities
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
||||
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: Test formalities
|
||||
run: |
|
||||
source .github/workflows/ci_helpers.sh
|
||||
|
||||
RET=0
|
||||
for commit in $(git rev-list HEAD ^origin/$BRANCH); do
|
||||
info "=== Checking commit '$commit'"
|
||||
if git show --format='%P' -s $commit | grep -qF ' '; then
|
||||
err "Pull request should not include merge commits"
|
||||
RET=1
|
||||
fi
|
||||
|
||||
author="$(git show -s --format=%aN $commit)"
|
||||
if echo $author | grep -q '\S\+\s\+\S\+'; then
|
||||
success "Author name ($author) seems ok"
|
||||
else
|
||||
err "Author name ($author) need to be your real name 'firstname lastname'"
|
||||
RET=1
|
||||
fi
|
||||
|
||||
subject="$(git show -s --format=%s $commit)"
|
||||
if echo "$subject" | grep -q -e '^[0-9A-Za-z,+/_-]\+: ' -e '^Revert '; then
|
||||
success "Commit subject line seems ok ($subject)"
|
||||
else
|
||||
err "Commit subject line MUST start with '<package name>: ' ($subject)"
|
||||
RET=1
|
||||
fi
|
||||
|
||||
body="$(git show -s --format=%b $commit)"
|
||||
sob="$(git show -s --format='Signed-off-by: %aN <%aE>' $commit)"
|
||||
if echo "$body" | grep -qF "$sob"; then
|
||||
success "Signed-off-by match author"
|
||||
else
|
||||
err "Signed-off-by is missing or doesn't match author (should be '$sob')"
|
||||
RET=1
|
||||
fi
|
||||
done
|
||||
|
||||
exit $RET
|
157
.github/workflows/multi-arch-test-build.yml
vendored
Normal file
157
.github/workflows/multi-arch-test-build.yml
vendored
Normal file
|
@ -0,0 +1,157 @@
|
|||
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 }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
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: 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
|
||||
|
||||
- arch: powerpc_464fp
|
||||
target: apm821xx-nand
|
||||
runtime_test: false
|
||||
|
||||
- arch: powerpc_8548
|
||||
target: mpc85xx-p1010
|
||||
runtime_test: false
|
||||
|
||||
- arch: riscv64_riscv64
|
||||
target: sifiveu-generic
|
||||
runtime_test: false
|
||||
|
||||
- arch: x86_64
|
||||
target: x86-64
|
||||
runtime_test: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
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: |
|
||||
# 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
|
||||
PACKAGES+=$(echo "$ROOT" | sed -e 's@\(.*\)/@\1 @')
|
||||
break
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# fallback to test packages if nothing explicitly changes this is
|
||||
# should run if other mechanics in packages.git changed
|
||||
PACKAGES="${PACKAGES:-bird2 cjdns olsrd}"
|
||||
|
||||
echo "Building $PACKAGES"
|
||||
echo "PACKAGES=$PACKAGES" >> $GITHUB_ENV
|
||||
|
||||
- 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)
|
||||
echo "KEY_BUILD<<$EOF" >> $GITHUB_ENV
|
||||
cat packages_ci.sec >> $GITHUB_ENV
|
||||
echo "$EOF" >> $GITHUB_ENV
|
||||
|
||||
- name: Build
|
||||
uses: openwrt/gh-action-sdk@v5
|
||||
env:
|
||||
ARCH: ${{ matrix.arch }}-${{ env.BRANCH }}
|
||||
FEEDNAME: packages_ci
|
||||
INDEX: 1
|
||||
KEY_BUILD: ${{ env.KEY_BUILD }}
|
||||
|
||||
- name: Move created packages to project dir
|
||||
run: cp bin/packages/${{ matrix.arch }}/packages_ci/* . || true
|
||||
|
||||
- name: Store packages
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{env.ARCHIVE_NAME}}-packages
|
||||
path: |
|
||||
Packages
|
||||
Packages.*
|
||||
*.ipk
|
||||
PKG-INFO
|
||||
|
||||
- name: Store logs
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ matrix.arch}}-logs
|
||||
path: logs/
|
||||
|
||||
- name: Remove logs
|
||||
run: sudo rm -rf logs/ || true
|
||||
|
||||
- name: Check if any packages were built
|
||||
run: |
|
||||
if [ -n "$(find . -maxdepth 1 -type f -name '*.ipk' -print -quit)" ]; then
|
||||
echo "Found *.ipk files"
|
||||
HAVE_IPKS=true
|
||||
else
|
||||
echo "No *.ipk files found"
|
||||
HAVE_IPKS=false
|
||||
fi
|
||||
echo "HAVE_IPKS=$HAVE_IPKS" >> $GITHUB_ENV
|
||||
|
||||
- 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
|
||||
|
||||
- name: Build Docker container
|
||||
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
|
||||
run: |
|
||||
docker build -t test-container --build-arg ARCH .github/workflows/
|
||||
env:
|
||||
ARCH: ${{ matrix.arch }}-${{ env.BRANCH }}
|
||||
|
||||
- name: Test via Docker container
|
||||
if: ${{ matrix.runtime_test && fromJSON(env.HAVE_IPKS) }}
|
||||
run: |
|
||||
docker run --rm -v $GITHUB_WORKSPACE:/ci test-container
|
18
README
18
README
|
@ -1,18 +0,0 @@
|
|||
This is an OpenWrt package feed containing community maintained routing packages.
|
||||
|
||||
To use these packages, add the following line to the feeds.conf
|
||||
in the OpenWrt buildroot:
|
||||
|
||||
src-git routing git://github.com/openwrt-routing/packages.git
|
||||
|
||||
Update the feed:
|
||||
|
||||
./scripts/feeds update routing
|
||||
|
||||
Activate the package:
|
||||
|
||||
./scripts/feeds install -a -p routing
|
||||
|
||||
The routing packages should now appear in menuconfig.
|
||||
|
||||
|
21
README.md
Normal file
21
README.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
# OpenWrt Routing Feed
|
||||
|
||||
## Description
|
||||
|
||||
This OpenWrt package feed contains community maintained routing packages.
|
||||
|
||||
## Usage
|
||||
|
||||
|
||||
This repository is intended to be layered on-top of an OpenWrt buildroot.
|
||||
If you do not have an OpenWrt buildroot installed, see the documentation at:
|
||||
[OpenWrt Buildroot – Installation][1] on the OpenWrt support site.
|
||||
|
||||
This feed is enabled by default. To install all its package definitions, run:
|
||||
|
||||
```
|
||||
./scripts/feeds update routing
|
||||
./scripts/feeds install -a -p routing
|
||||
```
|
||||
|
||||
[1]: https://openwrt.org/docs/guide-developer/build-system/install-buildsystem
|
|
@ -9,13 +9,15 @@ include $(TOPDIR)/rules.mk
|
|||
|
||||
PKG_NAME:=ahcpd
|
||||
PKG_VERSION:=0.53
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/files/
|
||||
PKG_MD5SUM:=a1a610bf20965aa522cd766bf3d5829a
|
||||
PKG_LICENSE:=MIT
|
||||
PKG_SOURCE_URL:=https://www.irif.fr/~jch/software/files/
|
||||
PKG_HASH:=a4622e817d2b2a9b878653f085585bd57f3838cc546cca6028d3b73ffcac0d52
|
||||
|
||||
PKG_MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
|
||||
PKG_LICENSE:=MIT
|
||||
PKG_LICENSE_FILES:=LICENCE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
@ -23,8 +25,7 @@ define Package/ahcpd
|
|||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
TITLE:=Ad-Hoc Configuration Protocol daemon
|
||||
URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/ahcp/
|
||||
MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
|
||||
URL:=https://www.irif.fr/~jch/software/ahcp/
|
||||
DEPENDS:=@IPV6 +ip +librt
|
||||
endef
|
||||
|
||||
|
|
|
@ -1,39 +1,45 @@
|
|||
#
|
||||
# Copyright (C) 2013 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=alfred
|
||||
PKG_VERSION:=2018.1
|
||||
PKG_RELEASE:=0
|
||||
PKG_HASH:=808fa6acf65c7a8e26405115176a5587157f746108cbe5dd974788eb05416d76
|
||||
PKG_VERSION:=2024.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
PKG_HASH:=d029a43638ab16771e5f71e134bc843d1713d74041c65bcda18a31d18f5531bd
|
||||
|
||||
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
PKG_LICENSE:=GPL-2.0-only MIT
|
||||
PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
PKG_BUILD_FLAGS:=gc-sections lto
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_ALFRED_NEEDS_lua \
|
||||
CONFIG_ALFRED_NEEDS_libgps \
|
||||
CONFIG_PACKAGE_ALFRED_VIS \
|
||||
CONFIG_PACKAGE_ALFRED_BATHOSTS \
|
||||
CONFIG_PACKAGE_ALFRED_GPSD
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
init-y := alfred
|
||||
|
||||
define Package/alfred
|
||||
URL:=https://www.open-mesh.org/
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
TITLE:=A.L.F.R.E.D. - Almighty Lightweight Fact Remote Exchange Daemon
|
||||
URL:=https://www.open-mesh.org/
|
||||
DEPENDS:= +libc @IPV6 +libnl-tiny +librt \
|
||||
+ALFRED_NEEDS_lua:lua \
|
||||
+ALFRED_NEEDS_libgps:libgps
|
||||
endef
|
||||
|
||||
define Package/alfred/description
|
||||
alfred is a user space daemon for distributing arbitrary local information over
|
||||
the mesh/network in a decentralized fashion. This data can be anything which
|
||||
appears to be useful - originally designed to replace the batman-adv
|
||||
alfred is a user space daemon for distributing arbitrary local information
|
||||
over the mesh/network in a decentralized fashion. This data can be anything
|
||||
which appears to be useful - originally designed to replace the batman-adv
|
||||
visualization (vis), you may distribute hostnames, phone books, administration
|
||||
information, DNS information, the local weather forecast ...
|
||||
|
||||
|
@ -54,21 +60,13 @@ define Package/alfred/config
|
|||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
MAKE_ALFRED_FLAGS=\
|
||||
MAKE_FLAGS += \
|
||||
CONFIG_ALFRED_VIS=$(if $(CONFIG_PACKAGE_ALFRED_VIS),y,n) \
|
||||
CONFIG_ALFRED_GPSD=$(if $(CONFIG_PACKAGE_ALFRED_GPSD),y,n) \
|
||||
CONFIG_ALFRED_CAPABILITIES=n \
|
||||
LIBNL_NAME="libnl-tiny" \
|
||||
LIBNL_GENL_NAME="libnl-tiny"
|
||||
|
||||
TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto
|
||||
TARGET_LDFLAGS += -Wl,--gc-sections -fuse-linker-plugin
|
||||
|
||||
define Build/Compile
|
||||
CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) $(MAKE_ALFRED_FLAGS) all
|
||||
endef
|
||||
LIBNL_GENL_NAME="libnl-tiny" \
|
||||
REVISION="$(PKG_VERSION)-openwrt-$(PKG_RELEASE)"
|
||||
|
||||
define Package/alfred/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
config 'alfred' 'alfred'
|
||||
option interface 'br-lan'
|
||||
list interface 'br-lan'
|
||||
option mode 'master'
|
||||
option batmanif 'bat0'
|
||||
option start_vis '1'
|
||||
|
|
|
@ -1,81 +1,41 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
|
||||
#
|
||||
# Copyright (C) 2013 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
START=99
|
||||
STOP=99
|
||||
USE_PROCD=1
|
||||
alfred_args=""
|
||||
vis_args=""
|
||||
facters_dir="/etc/alfred"
|
||||
pid_file_alfred="/var/run/alfred.pid"
|
||||
pid_file_vis="/var/run/batadv-vis.pid"
|
||||
enable=0
|
||||
vis_enable=0
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_WRITE_PID=1
|
||||
|
||||
wait_for_dir()
|
||||
append_interface()
|
||||
{
|
||||
local ifce="$1" dir="$2"
|
||||
|
||||
if ! [ -d "$dir" ] ; then
|
||||
timeout=30
|
||||
echo "${initscript}: waiting $timeout secs for $ifce interface..."
|
||||
for i in $(seq $timeout); do
|
||||
sleep 1
|
||||
[ -d "$dir" ] && break
|
||||
if [ $i == $timeout ] ; then
|
||||
echo "${initscript}: $ifce not detected, alfred not starting."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
append "interfaces" "$1" ","
|
||||
}
|
||||
|
||||
wait_for_ll_address()
|
||||
{
|
||||
local iface="$1"
|
||||
local timeout=30
|
||||
|
||||
echo "${initscript}: waiting $timeout secs for $iface address..."
|
||||
for i in $(seq $timeout); do
|
||||
# We look for
|
||||
# - the link-local address (starts with fe80)
|
||||
# - without tentative flag (bit 0x40 in the flags field; the first char of the flags field begins 38 columns after the fe80 prefix
|
||||
# - on interface $iface
|
||||
if awk '
|
||||
BEGIN { RET=1 }
|
||||
/^fe80.{37} [012389ab]/ { if ($6 == "'"$iface"'") RET=0 }
|
||||
END { exit RET }
|
||||
' /proc/net/if_inet6; then
|
||||
return
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "${initscript}: $iface address not detected, alfred not starting."
|
||||
exit 1
|
||||
}
|
||||
|
||||
alfred_start()
|
||||
{
|
||||
alfred_start() {
|
||||
local args=""
|
||||
local section="$1"
|
||||
local disabled interface mode
|
||||
local interfaces
|
||||
|
||||
# check if section is disabled
|
||||
config_get_bool disabled "$section" disabled 0
|
||||
[ $disabled = 0 ] || return 1
|
||||
|
||||
args=""
|
||||
args="-f"
|
||||
|
||||
config_list_foreach "$section" "interface" append_interface
|
||||
if [ -z "$interfaces" ]; then
|
||||
config_get interface "$section" interface
|
||||
append args "-i $interface"
|
||||
append_interface "$interface"
|
||||
fi
|
||||
append args "-i $interfaces"
|
||||
|
||||
config_get mode "$section" mode
|
||||
[ "$mode" = "master" ] && append args "-m"
|
||||
|
@ -83,12 +43,6 @@ alfred_start()
|
|||
config_get batmanif "$section" batmanif
|
||||
append args "-b $batmanif"
|
||||
|
||||
if [ "$batmanif" != "none" ]; then
|
||||
wait_for_dir "$batmanif" "/sys/class/net/$batmanif/mesh"
|
||||
fi
|
||||
|
||||
wait_for_ll_address "$interface"
|
||||
|
||||
append alfred_args "$args"
|
||||
enable=1
|
||||
|
||||
|
@ -103,41 +57,41 @@ alfred_start()
|
|||
return 0
|
||||
}
|
||||
|
||||
start()
|
||||
{
|
||||
start_service() {
|
||||
config_load "alfred"
|
||||
config_foreach alfred_start alfred
|
||||
|
||||
if [ "$enable" = "0" ]; then
|
||||
exit 0
|
||||
fi
|
||||
[ "$enable" = "0" ] && return 0
|
||||
|
||||
echo "${initscript}: starting alfred"
|
||||
SERVICE_PID_FILE="$pid_file_alfred"
|
||||
service_start /usr/sbin/alfred ${alfred_args}
|
||||
procd_open_instance "alfred"
|
||||
procd_set_param command /usr/sbin/alfred
|
||||
procd_append_param command ${alfred_args}
|
||||
procd_close_instance
|
||||
|
||||
if [ "$vis_enable" = "1" ]; then
|
||||
echo "${initscript}: starting batadv-vis"
|
||||
SERVICE_PID_FILE="$pid_file_vis"
|
||||
service_start /usr/sbin/batadv-vis ${vis_args}
|
||||
fi
|
||||
[ "$vis_enable" = "1" ] && {
|
||||
procd_open_instance "batadv-vis"
|
||||
procd_set_param command /usr/sbin/batadv-vis
|
||||
procd_append_param command ${vis_args}
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
if [ "$run_facters" = "1" ]; then
|
||||
[ "$run_facters" = "1" ] && {
|
||||
( for file in $facters_dir/* ; do [ -x $file ] && $file ; done )
|
||||
if ! ( grep -q "for file in $facters_dir/\* ; do " /etc/crontabs/root 2>/dev/null ) ; then
|
||||
echo "*/5 * * * * ( for file in $facters_dir/* ; do [ -x \$file ] && \$file ; done )" >> /etc/crontabs/root
|
||||
/etc/init.d/cron enable
|
||||
/etc/init.d/cron restart
|
||||
fi
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
stop()
|
||||
{
|
||||
SERVICE_PID_FILE="$pid_file_alfred"
|
||||
service_stop /usr/sbin/alfred
|
||||
SERVICE_PID_FILE="$pid_file_vis"
|
||||
[ -x /usr/sbin/batadv-vis ] && service_stop /usr/sbin/batadv-vis
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "alfred"
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
[ -e /etc/crontabs/root ] && {
|
||||
sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
|
||||
/etc/init.d/cron restart
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ PKG_RELEASE:=1
|
|||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/files/
|
||||
PKG_MD5SUM:=40d4931986913f5f8d9b5b70abf6fda5
|
||||
PKG_HASH:=c411430bb102f08d3d68d2fb5010b5da0149908b671ac0fb12abd8c8ee6380c5
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
|
|
@ -1,20 +1,23 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#
|
||||
# Copyright (C) 2007-2009 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
# Copyright (C) 2007-2021 OpenWrt.org
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=babeld
|
||||
PKG_VERSION:=1.8.1
|
||||
PKG_VERSION:=1.13.1
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://www.irif.fr/~jch/software/files/
|
||||
PKG_MD5SUM:=a57caa5be996c61bd6a1616fdc01d807
|
||||
PKG_HASH:=15f24d26da0ccfc073abcdef0309f281e4684f2aa71126f826572c4c845e8dd9
|
||||
|
||||
PKG_MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>, \
|
||||
Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>, \
|
||||
Nick Hainke <vincent@systemli.org>
|
||||
PKG_LICENSE:=MIT
|
||||
PKG_LICENSE_FILES:=LICENCE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
|
@ -22,21 +25,17 @@ define Package/babeld
|
|||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE:=A loop-free distance-vector routing protocol
|
||||
TITLE:=A loop-avoiding distance-vector routing protocol
|
||||
URL:=https://www.irif.fr/~jch/software/babel/
|
||||
MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>, \
|
||||
Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>
|
||||
DEPENDS:=@IPV6
|
||||
DEPENDS:=@IPV6 +libubus +libubox
|
||||
endef
|
||||
|
||||
define Package/babeld/description
|
||||
Babel is a loop-avoiding distance-vector routing protocol roughly based
|
||||
on DSDV and AODV, but with provisions for link cost estimation and
|
||||
redistribution of routes from other routing protocols.
|
||||
While it is optimised for wireless mesh networks, Babel will also work
|
||||
efficiently on wired networks. It will generate between 1.2 and 2.4 times
|
||||
the amount of routing traffic that RIPng would generate, while
|
||||
never counting to infinity.
|
||||
Babel is a loop-avoiding distance-vector routing protocol for IPv6 and IPv4
|
||||
with fast convergence properties. It is based on the ideas in DSDV, AODV and
|
||||
Cisco's EIGRP, but is designed to work well not only in wired networks but
|
||||
also in wireless mesh networks, and has been extended with support for
|
||||
overlay networks. Babel is an IETF standard protocol (RFC 8966).
|
||||
endef
|
||||
|
||||
define Package/babeld/conffiles
|
||||
|
@ -47,6 +46,7 @@ endef
|
|||
MAKE_FLAGS+= \
|
||||
CFLAGS="$(TARGET_CFLAGS)" \
|
||||
LDLIBS="" \
|
||||
LDLIBS+="-lubus -lubox"
|
||||
|
||||
define Package/babeld/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package babeld
|
||||
|
||||
# Detailed documentation: https://openwrt.org/docs/guide-user/services/babeld
|
||||
|
||||
# Babeld reads options from the following files (the last one takes precedence
|
||||
# if an option is defined in several places):
|
||||
# - the file defined by the option conf_file (default: /etc/babeld.conf),
|
||||
|
@ -22,6 +24,7 @@ config general
|
|||
## See comment at the top of this file for more details.
|
||||
# option 'conf_file' '/etc/babeld.conf'
|
||||
# option 'conf_dir' '/tmp/babel.d/'
|
||||
# option 'ubus_bindings' 'false'
|
||||
|
||||
config interface
|
||||
## Remove this line to enable babeld on this interface
|
||||
|
@ -39,7 +42,10 @@ config interface
|
|||
option 'ignore' 'true'
|
||||
## Physical interface name
|
||||
option 'ifname' 'tun-example'
|
||||
# option 'max_rtt_penalty' '90'
|
||||
## Specify the type of interface: tunnels use the RTT-based metric.
|
||||
option 'type' 'tunnel'
|
||||
## Other options that can be overriden.
|
||||
# option 'max_rtt_penalty' '96'
|
||||
|
||||
# A config interface without "option ifname" will set default options
|
||||
# for all interfaces. Interface-specific configuration always overrides
|
||||
|
@ -49,27 +55,49 @@ config interface
|
|||
# option 'update_interval' '30'
|
||||
|
||||
|
||||
# A filter consists of a type ('in', 'out' or 'redistribute'), an action
|
||||
# ('allow', 'deny' or 'metric xxx') and a set of selectors ('ip', 'eq',
|
||||
# etc.). See babeld man page ("Filtering rules") for more details.
|
||||
# Here is a sample filter wich redistributes the default route if its
|
||||
# protocol number is "boot", e.g. when it installed by dhcp. It is
|
||||
# disabled by default.
|
||||
# A filter consists of a type ('in', 'out', 'redistribute' or 'install'),
|
||||
# a set of selectors ('ip', 'eq', etc.) and a set of actions to perform
|
||||
# ('allow', 'deny', 'metric xxx', 'src-prefix xxx', 'table xxx', 'pref-src xxx').
|
||||
# See babeld man page ("Filtering rules") for more details.
|
||||
|
||||
# Below is a sample filter that redistributes the default route if its
|
||||
# protocol number is "boot", e.g. when it is installed by dhcp (see
|
||||
# /etc/iproute2/rt_protos). This filter is disabled thanks to the 'ignore'
|
||||
# setting.
|
||||
config filter
|
||||
option 'ignore' 'true'
|
||||
# Type
|
||||
# Type of filter
|
||||
option 'type' 'redistribute'
|
||||
# Selectors: ip, eq, le, ge, src_ip, src_eq, src_le, src_ge, neigh, id,
|
||||
# proto, local, if.
|
||||
option 'ip' '0.0.0.0/0'
|
||||
option 'eq' '0'
|
||||
option 'proto' '3'
|
||||
# Action (one of: allow, deny, metric XXX, src-prefix XXX).
|
||||
# Action, which can be any of: allow, deny, metric <NUMBER>, src-prefix <PREFIX>,
|
||||
# table <ID>, pref-src <IP>.
|
||||
# The action defaults to "allow" if not specified. Here, we specify a higher
|
||||
# redistribution metric than the default (0).
|
||||
option 'action' 'metric 128'
|
||||
|
||||
# Notice that the 'local' selector is a boolean.
|
||||
# Another example filter: don't redistribute local addresses in a certain IP prefix.
|
||||
# By default, babeld redistributes *all* local addresses.
|
||||
config filter
|
||||
option 'ignore' 'true'
|
||||
option 'type' 'redistribute'
|
||||
# Only apply to routes/addresses within this prefix.
|
||||
option 'ip' '198.51.100.0/24'
|
||||
# Notice that the 'local' selector is a boolean.
|
||||
option 'local' 'true'
|
||||
# No action means "allow"
|
||||
# Don't redistribute.
|
||||
option 'action' 'deny'
|
||||
|
||||
# Example install filter, to change or filter routes before they are inserted
|
||||
# into the kernel.
|
||||
config filter
|
||||
option 'ignore' 'true'
|
||||
option 'type' 'install'
|
||||
# Optional: only apply to routes within 2001:db8:cafe::/48
|
||||
option 'ip' '2001:db8:cafe::/48'
|
||||
# We specify the kernel routing table and the preferred source address to use for these routes.
|
||||
# "Allow" is implicit.
|
||||
option 'action' 'table 200 pref-src 2001:db8:ba:be1::42'
|
||||
|
|
132
babeld/patches/600-add-ubus.patch
Normal file
132
babeld/patches/600-add-ubus.patch
Normal file
|
@ -0,0 +1,132 @@
|
|||
--- a/babeld.c
|
||||
+++ b/babeld.c
|
||||
@@ -54,6 +54,8 @@ THE SOFTWARE.
|
||||
#include "local.h"
|
||||
#include "version.h"
|
||||
|
||||
+#include "ubus.h"
|
||||
+
|
||||
struct timeval now;
|
||||
|
||||
unsigned char myid[8];
|
||||
@@ -505,6 +507,9 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
+ if(ubus_bindings)
|
||||
+ babeld_add_ubus();
|
||||
+
|
||||
init_signals();
|
||||
rc = resize_receive_buffer(1500);
|
||||
if(rc < 0)
|
||||
@@ -597,6 +602,8 @@ main(int argc, char **argv)
|
||||
FD_SET(local_sockets[i].fd, &readfds);
|
||||
maxfd = MAX(maxfd, local_sockets[i].fd);
|
||||
}
|
||||
+ if(ubus_bindings)
|
||||
+ maxfd = babeld_ubus_add_read_sock(&readfds, maxfd);
|
||||
rc = select(maxfd + 1, &readfds, NULL, NULL, &tv);
|
||||
if(rc < 0) {
|
||||
if(errno != EINTR) {
|
||||
@@ -665,6 +672,9 @@ main(int argc, char **argv)
|
||||
i++;
|
||||
}
|
||||
|
||||
+ if(ubus_bindings)
|
||||
+ babeld_ubus_receive(&readfds);
|
||||
+
|
||||
if(reopening) {
|
||||
kernel_dump_time = now.tv_sec;
|
||||
check_neighbours_timeout = now;
|
||||
--- a/generate-version.sh
|
||||
+++ b/generate-version.sh
|
||||
@@ -10,4 +10,4 @@ else
|
||||
version="unknown"
|
||||
fi
|
||||
|
||||
-echo "#define BABELD_VERSION \"$version\""
|
||||
+echo "#define BABELD_VERSION \"$version-ubus-mod\""
|
||||
--- a/configuration.c
|
||||
+++ b/configuration.c
|
||||
@@ -42,6 +42,8 @@ THE SOFTWARE.
|
||||
#include "hmac.h"
|
||||
#include "configuration.h"
|
||||
|
||||
+#include "ubus.h"
|
||||
+
|
||||
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
|
||||
strcmp(token, "daemonise") == 0 ||
|
||||
strcmp(token, "skip-kernel-setup") == 0 ||
|
||||
strcmp(token, "ipv6-subtrees") == 0 ||
|
||||
- strcmp(token, "reflect-kernel-metric") == 0) {
|
||||
+ strcmp(token, "reflect-kernel-metric") == 0 ||
|
||||
+ strcmp(token, "ubus-bindings") == 0) {
|
||||
int b;
|
||||
c = getbool(c, &b, gnc, closure);
|
||||
if(c < -1)
|
||||
@@ -1042,6 +1045,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
||||
has_ipv6_subtrees = b;
|
||||
else if(strcmp(token, "reflect-kernel-metric") == 0)
|
||||
reflect_kernel_metric = b;
|
||||
+ else if(strcmp(token, "ubus-bindings") == 0)
|
||||
+ ubus_bindings = b;
|
||||
else
|
||||
abort();
|
||||
} else if(strcmp(token, "protocol-group") == 0) {
|
||||
--- a/local.c
|
||||
+++ b/local.c
|
||||
@@ -42,6 +42,8 @@ THE SOFTWARE.
|
||||
#include "local.h"
|
||||
#include "version.h"
|
||||
|
||||
+#include "ubus.h"
|
||||
+
|
||||
int local_server_socket = -1;
|
||||
struct local_socket local_sockets[MAX_LOCAL_SOCKETS];
|
||||
int num_local_sockets = 0;
|
||||
@@ -191,6 +193,8 @@ local_notify_neighbour(struct neighbour
|
||||
if(local_sockets[i].monitor)
|
||||
local_notify_neighbour_1(&local_sockets[i], neigh, kind);
|
||||
}
|
||||
+ if(ubus_bindings)
|
||||
+ ubus_notify_neighbour(neigh, kind);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -228,6 +232,8 @@ local_notify_xroute(struct xroute *xrout
|
||||
if(local_sockets[i].monitor)
|
||||
local_notify_xroute_1(&local_sockets[i], xroute, kind);
|
||||
}
|
||||
+ if(ubus_bindings)
|
||||
+ ubus_notify_xroute(xroute, kind);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -273,6 +279,8 @@ local_notify_route(struct babel_route *r
|
||||
if(local_sockets[i].monitor)
|
||||
local_notify_route_1(&local_sockets[i], route, kind);
|
||||
}
|
||||
+ if(ubus_bindings)
|
||||
+ ubus_notify_route(route, kind);
|
||||
}
|
||||
|
||||
static void
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -11,11 +11,11 @@ LDLIBS = -lrt
|
||||
|
||||
SRCS = babeld.c net.c kernel.c util.c interface.c source.c neighbour.c \
|
||||
route.c xroute.c message.c resend.c configuration.c local.c \
|
||||
- hmac.c rfc6234/sha224-256.c BLAKE2/ref/blake2s-ref.c
|
||||
+ hmac.c ubus.c rfc6234/sha224-256.c BLAKE2/ref/blake2s-ref.c
|
||||
|
||||
OBJS = babeld.o net.o kernel.o util.o interface.o source.o neighbour.o \
|
||||
route.o xroute.o message.o resend.o configuration.o local.o \
|
||||
- hmac.o rfc6234/sha224-256.o BLAKE2/ref/blake2s-ref.o
|
||||
+ hmac.o ubus.o rfc6234/sha224-256.o BLAKE2/ref/blake2s-ref.o
|
||||
|
||||
babeld: $(OBJS)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o babeld $(OBJS) $(LDLIBS)
|
535
babeld/src/ubus.c
Normal file
535
babeld/src/ubus.c
Normal file
|
@ -0,0 +1,535 @@
|
|||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/select.h>
|
||||
|
||||
#include <libubox/blob.h>
|
||||
#include <libubox/blobmsg.h>
|
||||
#include <libubox/list.h>
|
||||
#include <libubus.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "babeld.h"
|
||||
#include "configuration.h"
|
||||
#include "interface.h"
|
||||
#include "kernel.h"
|
||||
#include "local.h"
|
||||
#include "message.h"
|
||||
#include "neighbour.h"
|
||||
#include "net.h"
|
||||
#include "resend.h"
|
||||
#include "route.h"
|
||||
#include "source.h"
|
||||
#include "util.h"
|
||||
#include "version.h"
|
||||
#include "xroute.h"
|
||||
|
||||
#include "ubus.h"
|
||||
|
||||
// Definition of header variable whether to enable ubus bindings.
|
||||
int ubus_bindings = 0;
|
||||
|
||||
// Shared state maintained throughout calls to handle ubus messages.
|
||||
static struct ubus_context *shared_ctx;
|
||||
|
||||
// List of exported routes (to be used with ubox's list helpers).
|
||||
struct xroute_list_entry {
|
||||
struct list_head list;
|
||||
struct xroute *xroute;
|
||||
};
|
||||
|
||||
// List of received routes (to be used with ubox's list helpers).
|
||||
struct route_list_entry {
|
||||
struct list_head list;
|
||||
struct babel_route *route;
|
||||
};
|
||||
|
||||
// List of neighbours (to be used with ubox's list helpers).
|
||||
struct neighbour_list_entry {
|
||||
struct list_head list;
|
||||
struct neighbour *neighbour;
|
||||
};
|
||||
|
||||
// Definition of interface function enums (to be used with ubox's blobmsg
|
||||
// helpers).
|
||||
enum { INTERFACE_IFNAME, __INTERFACE_MAX };
|
||||
|
||||
// Definition of interface parsing (to be used with ubox's blobmsg helpers).
|
||||
static const struct blobmsg_policy interface_policy[__INTERFACE_MAX] = {
|
||||
[INTERFACE_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
|
||||
};
|
||||
|
||||
// Definition of filter function enums (to be used with ubox's blobmsg
|
||||
// helpers).
|
||||
enum { FILTER_IFNAME, FILTER_TYPE, FILTER_METRIC, __FILTER_MAX };
|
||||
|
||||
// Definition of filter parsing (to be used with ubox's blobmsg helpers).
|
||||
static const struct blobmsg_policy filter_policy[__FILTER_MAX] = {
|
||||
[FILTER_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
|
||||
[FILTER_TYPE] = {"type", BLOBMSG_TYPE_INT32},
|
||||
[FILTER_METRIC] = {"metric", BLOBMSG_TYPE_INT32},
|
||||
};
|
||||
|
||||
// Adds a filter (ubus equivalent to "filter"-function).
|
||||
static int babeld_ubus_add_filter(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method, struct blob_attr *msg) {
|
||||
struct blob_attr *tb[__FILTER_MAX];
|
||||
struct blob_buf b = {0};
|
||||
struct filter *filter = NULL;
|
||||
char *ifname;
|
||||
int metric, type;
|
||||
|
||||
blobmsg_parse(filter_policy, __FILTER_MAX, tb, blob_data(msg), blob_len(msg));
|
||||
|
||||
if (!tb[FILTER_IFNAME])
|
||||
return UBUS_STATUS_INVALID_ARGUMENT;
|
||||
|
||||
if (!tb[FILTER_TYPE])
|
||||
return UBUS_STATUS_INVALID_ARGUMENT;
|
||||
|
||||
type = blobmsg_get_u32(tb[FILTER_TYPE]);
|
||||
|
||||
if (tb[FILTER_METRIC])
|
||||
metric = blobmsg_get_u32(tb[FILTER_METRIC]);
|
||||
|
||||
filter = calloc(1, sizeof(struct filter));
|
||||
if (filter == NULL)
|
||||
return UBUS_STATUS_UNKNOWN_ERROR;
|
||||
|
||||
filter->af = AF_INET6;
|
||||
filter->proto = 0;
|
||||
filter->plen_le = 128;
|
||||
filter->src_plen_le = 128;
|
||||
filter->action.add_metric = metric;
|
||||
|
||||
ifname = blobmsg_get_string(tb[FILTER_IFNAME]);
|
||||
filter->ifname = strdup(ifname);
|
||||
filter->ifindex = if_nametoindex(filter->ifname);
|
||||
|
||||
add_filter(filter, type);
|
||||
|
||||
return UBUS_STATUS_OK;
|
||||
}
|
||||
|
||||
// Adds an inteface (ubus equivalent to "interface"-function).
|
||||
static int babeld_ubus_add_interface(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method,
|
||||
struct blob_attr *msg) {
|
||||
struct blob_attr *tb[__INTERFACE_MAX];
|
||||
struct blob_buf b = {0};
|
||||
struct interface *ifp = NULL;
|
||||
char *ifname;
|
||||
|
||||
blobmsg_parse(interface_policy, __INTERFACE_MAX, tb, blob_data(msg),
|
||||
blob_len(msg));
|
||||
|
||||
if (!tb[INTERFACE_IFNAME])
|
||||
return UBUS_STATUS_INVALID_ARGUMENT;
|
||||
|
||||
ifname = blobmsg_get_string(tb[INTERFACE_IFNAME]);
|
||||
|
||||
ifp = add_interface(ifname, NULL);
|
||||
if (ifp == NULL)
|
||||
return UBUS_STATUS_UNKNOWN_ERROR;
|
||||
|
||||
return UBUS_STATUS_OK;
|
||||
}
|
||||
|
||||
// Sends a babel info message on ubus socket.
|
||||
static int babeld_ubus_babeld_info(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method, struct blob_attr *msg) {
|
||||
struct blob_buf b = {0};
|
||||
void *prefix;
|
||||
char host[64];
|
||||
int ret;
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
blobmsg_add_string(&b, "babeld-version", BABELD_VERSION);
|
||||
blobmsg_add_string(&b, "my-id", format_eui64(myid));
|
||||
if (!gethostname(host, sizeof(host)))
|
||||
blobmsg_add_string(&b, "host", host);
|
||||
|
||||
ret = ubus_send_reply(ctx_local, req, b.head);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
|
||||
|
||||
blob_buf_free(&b);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Appends an exported route message entry to the buffer.
|
||||
static void babeld_add_xroute_buf(struct xroute *xroute, struct blob_buf *b) {
|
||||
void *prefix;
|
||||
|
||||
prefix = blobmsg_open_table(b, format_prefix(xroute->prefix, xroute->plen));
|
||||
|
||||
blobmsg_add_string(b, "src-prefix",
|
||||
format_prefix(xroute->src_prefix, xroute->src_plen));
|
||||
blobmsg_add_u32(b, "metric", xroute->metric);
|
||||
blobmsg_close_table(b, prefix);
|
||||
}
|
||||
|
||||
// Sends an exported routes message on ubus socket, splitting apart IPv4 and
|
||||
// IPv6 routes.
|
||||
static int babeld_ubus_get_xroutes(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method, struct blob_attr *msg) {
|
||||
struct blob_buf b = {0};
|
||||
struct xroute_stream *xroutes;
|
||||
struct xroute_list_entry *cur, *tmp;
|
||||
void *ipv4, *ipv6;
|
||||
int ret;
|
||||
LIST_HEAD(xroute_ipv4_list);
|
||||
LIST_HEAD(xroute_ipv6_list);
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
|
||||
xroutes = xroute_stream();
|
||||
if (xroutes) {
|
||||
while (1) {
|
||||
struct xroute *xroute = xroute_stream_next(xroutes);
|
||||
if (xroute == NULL)
|
||||
break;
|
||||
|
||||
struct xroute_list_entry *xr =
|
||||
calloc(1, sizeof(struct xroute_list_entry));
|
||||
xr->xroute = xroute;
|
||||
|
||||
if (v4mapped(xroute->prefix)) {
|
||||
list_add(&xr->list, &xroute_ipv4_list);
|
||||
} else {
|
||||
list_add(&xr->list, &xroute_ipv6_list);
|
||||
}
|
||||
}
|
||||
xroute_stream_done(xroutes);
|
||||
}
|
||||
|
||||
ipv4 = blobmsg_open_table(&b, "IPv4");
|
||||
list_for_each_entry_safe(cur, tmp, &xroute_ipv4_list, list) {
|
||||
babeld_add_xroute_buf(cur->xroute, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv4);
|
||||
|
||||
ipv6 = blobmsg_open_table(&b, "IPv6");
|
||||
list_for_each_entry_safe(cur, tmp, &xroute_ipv6_list, list) {
|
||||
babeld_add_xroute_buf(cur->xroute, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv6);
|
||||
|
||||
ret = ubus_send_reply(ctx_local, req, b.head);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
|
||||
|
||||
blob_buf_free(&b);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Appends an route message entry to the buffer.
|
||||
static void babeld_add_route_buf(struct babel_route *route,
|
||||
struct blob_buf *b) {
|
||||
void *prefix;
|
||||
|
||||
prefix = blobmsg_open_table(
|
||||
b, format_prefix(route->src->prefix, route->src->plen));
|
||||
|
||||
blobmsg_add_string(
|
||||
b, "src-prefix",
|
||||
format_prefix(route->src->src_prefix, route->src->src_plen));
|
||||
blobmsg_add_u32(b, "route_metric", route_metric(route));
|
||||
blobmsg_add_u32(b, "route_smoothed_metric", route_smoothed_metric(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_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)
|
||||
blobmsg_add_string(b, "nexthop", format_address(route->nexthop));
|
||||
|
||||
blobmsg_add_u8(b, "installed", route->installed);
|
||||
blobmsg_add_u8(b, "feasible", route_feasible(route));
|
||||
|
||||
blobmsg_close_table(b, prefix);
|
||||
}
|
||||
|
||||
// Sends received routes message on ubus socket, splitting apart IPv4 and IPv6
|
||||
// routes.
|
||||
static int babeld_ubus_get_routes(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method, struct blob_attr *msg) {
|
||||
struct blob_buf b = {0};
|
||||
struct route_stream *routes;
|
||||
struct route_list_entry *cur, *tmp;
|
||||
void *prefix, *ipv4, *ipv6;
|
||||
int ret;
|
||||
LIST_HEAD(route_ipv4_list);
|
||||
LIST_HEAD(route_ipv6_list);
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
|
||||
routes = route_stream(0);
|
||||
if (routes) {
|
||||
while (1) {
|
||||
struct babel_route *route = route_stream_next(routes);
|
||||
if (route == NULL)
|
||||
break;
|
||||
struct route_list_entry *r = calloc(1, sizeof(struct route_list_entry));
|
||||
r->route = route;
|
||||
|
||||
if (v4mapped(route->src->prefix)) {
|
||||
list_add(&r->list, &route_ipv4_list);
|
||||
} else {
|
||||
list_add(&r->list, &route_ipv6_list);
|
||||
}
|
||||
}
|
||||
route_stream_done(routes);
|
||||
}
|
||||
|
||||
ipv4 = blobmsg_open_table(&b, "IPv4");
|
||||
list_for_each_entry_safe(cur, tmp, &route_ipv4_list, list) {
|
||||
babeld_add_route_buf(cur->route, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv4);
|
||||
|
||||
ipv6 = blobmsg_open_table(&b, "IPv6");
|
||||
list_for_each_entry_safe(cur, tmp, &route_ipv6_list, list) {
|
||||
babeld_add_route_buf(cur->route, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv6);
|
||||
|
||||
ret = ubus_send_reply(ctx_local, req, b.head);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
|
||||
|
||||
blob_buf_free(&b);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Appends an neighbour entry to the buffer.
|
||||
static void babeld_add_neighbour_buf(struct neighbour *neigh,
|
||||
struct blob_buf *b) {
|
||||
void *neighbour;
|
||||
|
||||
neighbour = blobmsg_open_table(b, format_address(neigh->address));
|
||||
blobmsg_add_string(b, "dev", neigh->ifp->name);
|
||||
blobmsg_add_u32(b, "hello-reach", neigh->hello.reach);
|
||||
blobmsg_add_u32(b, "uhello-reach", neigh->uhello.reach);
|
||||
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_u8(b, "if_up", if_up(neigh->ifp));
|
||||
blobmsg_close_table(b, neighbour);
|
||||
}
|
||||
|
||||
// Sends neighbours message on ubus socket, splitting apart IPv4 and IPv6
|
||||
// neighbours.
|
||||
static int babeld_ubus_get_neighbours(struct ubus_context *ctx_local,
|
||||
struct ubus_object *obj,
|
||||
struct ubus_request_data *req,
|
||||
const char *method,
|
||||
struct blob_attr *msg) {
|
||||
struct blob_buf b = {0};
|
||||
struct neighbour *neigh;
|
||||
struct neighbour_list_entry *cur, *tmp;
|
||||
void *ipv4, *ipv6;
|
||||
int ret;
|
||||
LIST_HEAD(neighbour_ipv4_list);
|
||||
LIST_HEAD(neighbour_ipv6_list);
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
|
||||
FOR_ALL_NEIGHBOURS(neigh) {
|
||||
struct neighbour_list_entry *n =
|
||||
calloc(1, sizeof(struct neighbour_list_entry));
|
||||
n->neighbour = neigh;
|
||||
if (v4mapped(neigh->address)) {
|
||||
list_add(&n->list, &neighbour_ipv4_list);
|
||||
} else {
|
||||
list_add(&n->list, &neighbour_ipv6_list);
|
||||
}
|
||||
}
|
||||
|
||||
ipv4 = blobmsg_open_table(&b, "IPv4");
|
||||
list_for_each_entry_safe(cur, tmp, &neighbour_ipv4_list, list) {
|
||||
babeld_add_neighbour_buf(cur->neighbour, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv4);
|
||||
|
||||
ipv6 = blobmsg_open_table(&b, "IPv6");
|
||||
list_for_each_entry_safe(cur, tmp, &neighbour_ipv6_list, list) {
|
||||
babeld_add_neighbour_buf(cur->neighbour, &b);
|
||||
list_del(&cur->list);
|
||||
free(cur);
|
||||
}
|
||||
blobmsg_close_table(&b, ipv6);
|
||||
|
||||
ret = ubus_send_reply(ctx_local, req, b.head);
|
||||
if (ret)
|
||||
fprintf(stderr, "Failed to send reply: %s\n", ubus_strerror(ret));
|
||||
|
||||
blob_buf_free(&b);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// List of functions we expose via the ubus bus.
|
||||
static const struct ubus_method babeld_methods[] = {
|
||||
UBUS_METHOD("add_interface", babeld_ubus_add_interface, interface_policy),
|
||||
UBUS_METHOD("add_filter", babeld_ubus_add_filter, filter_policy),
|
||||
UBUS_METHOD_NOARG("get_info", babeld_ubus_babeld_info),
|
||||
UBUS_METHOD_NOARG("get_xroutes", babeld_ubus_get_xroutes),
|
||||
UBUS_METHOD_NOARG("get_routes", babeld_ubus_get_routes),
|
||||
UBUS_METHOD_NOARG("get_neighbours", babeld_ubus_get_neighbours),
|
||||
};
|
||||
|
||||
// Definition of the ubus object type.
|
||||
static struct ubus_object_type babeld_object_type =
|
||||
UBUS_OBJECT_TYPE("babeld", babeld_methods);
|
||||
|
||||
// Object we announce via the ubus bus.
|
||||
static struct ubus_object babeld_object = {
|
||||
.name = "babeld",
|
||||
.type = &babeld_object_type,
|
||||
.methods = babeld_methods,
|
||||
.n_methods = ARRAY_SIZE(babeld_methods),
|
||||
};
|
||||
|
||||
// Registers handlers for babel methods in the global ubus context.
|
||||
static bool ubus_init_object() {
|
||||
int ret;
|
||||
|
||||
ret = ubus_add_object(shared_ctx, &babeld_object);
|
||||
if (ret) {
|
||||
fprintf(stderr, "Failed to add object: %s\n", ubus_strerror(ret));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Initializes the global ubus context, connecting to the bus to be able to
|
||||
// receive and send messages.
|
||||
static bool babeld_ubus_init(void) {
|
||||
if (shared_ctx)
|
||||
return true;
|
||||
|
||||
shared_ctx = ubus_connect(NULL);
|
||||
if (!shared_ctx)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ubus_notify_route(struct babel_route *route, int kind) {
|
||||
struct blob_buf b = {0};
|
||||
char method[50]; // possible methods are route.change, route.add, route.flush
|
||||
|
||||
if (!babeld_object.has_subscribers)
|
||||
return;
|
||||
|
||||
if (!route)
|
||||
return;
|
||||
|
||||
if (!shared_ctx)
|
||||
return;
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
babeld_add_route_buf(route, &b);
|
||||
snprintf(method, sizeof(method), "route.%s", local_kind(kind));
|
||||
ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
|
||||
blob_buf_free(&b);
|
||||
}
|
||||
|
||||
void ubus_notify_xroute(struct xroute *xroute, int kind) {
|
||||
struct blob_buf b = {0};
|
||||
char method[50]; // possible methods are xroute.change, xroute.add,
|
||||
// xroute.flush
|
||||
|
||||
if (!babeld_object.has_subscribers)
|
||||
return;
|
||||
|
||||
if (!xroute)
|
||||
return;
|
||||
|
||||
if (!shared_ctx)
|
||||
return;
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
babeld_add_xroute_buf(xroute, &b);
|
||||
snprintf(method, sizeof(method), "xroute.%s", local_kind(kind));
|
||||
ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
|
||||
blob_buf_free(&b);
|
||||
}
|
||||
|
||||
void ubus_notify_neighbour(struct neighbour *neigh, int kind) {
|
||||
struct blob_buf b = {0};
|
||||
char method[50]; // possible methods are neigh.change, neigh.add, neigh.flush
|
||||
|
||||
if (!babeld_object.has_subscribers)
|
||||
return;
|
||||
|
||||
if (!neigh)
|
||||
return;
|
||||
|
||||
if (!shared_ctx)
|
||||
return;
|
||||
|
||||
blob_buf_init(&b, 0);
|
||||
babeld_add_neighbour_buf(neigh, &b);
|
||||
snprintf(method, sizeof(method), "neigh.%s", local_kind(kind));
|
||||
ubus_notify(shared_ctx, &babeld_object, method, b.head, -1);
|
||||
blob_buf_free(&b);
|
||||
}
|
||||
|
||||
void babeld_ubus_receive(fd_set *readfds) {
|
||||
if (!shared_ctx)
|
||||
return;
|
||||
if (FD_ISSET(shared_ctx->sock.fd, readfds))
|
||||
ubus_handle_event(shared_ctx);
|
||||
}
|
||||
|
||||
int babeld_ubus_add_read_sock(fd_set *readfds, int maxfd) {
|
||||
if (!shared_ctx)
|
||||
return maxfd;
|
||||
|
||||
FD_SET(shared_ctx->sock.fd, readfds);
|
||||
return MAX(maxfd, shared_ctx->sock.fd);
|
||||
}
|
||||
|
||||
bool babeld_add_ubus() {
|
||||
if (!babeld_ubus_init()) {
|
||||
fprintf(stderr, "Failed to initialize ubus!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ubus_init_object()) {
|
||||
fprintf(stderr, "Failed to add objects to ubus!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
99
babeld/src/ubus.h
Normal file
99
babeld/src/ubus.h
Normal file
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
IPC integration of babeld with OpenWrt.
|
||||
|
||||
The ubus interface offers following functions:
|
||||
- add_filter '{"ifname":"eth0", "type":0, "metric":5000}'
|
||||
type:
|
||||
0: FILTER_TYPE_INPUT
|
||||
1: FILTER_TYPE_OUTPUT
|
||||
2: FILTER_TYPE_REDISTRIBUTE
|
||||
3: FILTER_TYPE_INSTALL
|
||||
- add_interface '{"ifname":"eth0"}'
|
||||
- get_info
|
||||
- get_neighbours
|
||||
- get_xroutes
|
||||
- get_routes
|
||||
|
||||
All output is divided into IPv4 and IPv6.
|
||||
|
||||
Ubus notifications are sent if we receive updates for
|
||||
- xroutes
|
||||
- routes
|
||||
- neighbours
|
||||
|
||||
The format is:
|
||||
- {route,xroute,neighbour}.add: Object was added
|
||||
- {route,xroute,neighbour}.change: Object was changed
|
||||
- {route,xroute,neighbour}.flush: Object was flushed
|
||||
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <sys/select.h>
|
||||
|
||||
struct babel_route;
|
||||
struct neighbour;
|
||||
struct xroute;
|
||||
|
||||
// Whether to enable ubus bindings (boolean option).
|
||||
extern int ubus_bindings;
|
||||
|
||||
/**
|
||||
* Initialize ubus interface.
|
||||
*
|
||||
* Connect to the ubus daemon and expose the ubus functions.
|
||||
*
|
||||
* @return if initializing ubus was successful
|
||||
*/
|
||||
bool babeld_add_ubus();
|
||||
|
||||
/**
|
||||
* Add ubus socket to given filedescriptor set.
|
||||
*
|
||||
* We need to check repeatedly if the ubus socket has something to read.
|
||||
* The functions allows to add the ubus socket to the normal while(1)-loop of
|
||||
* babeld.
|
||||
*
|
||||
* @param readfs: the filedescriptor set
|
||||
* @param maxfd: the current maximum file descriptor
|
||||
* @return the maximum file descriptor
|
||||
*/
|
||||
int babeld_ubus_add_read_sock(fd_set *readfds, int maxfd);
|
||||
|
||||
/**
|
||||
* Check and process ubus socket.
|
||||
*
|
||||
* If the ubus-socket signals that data is available, the ubus_handle_event is
|
||||
* called.
|
||||
*/
|
||||
void babeld_ubus_receive(fd_set *readfds);
|
||||
|
||||
/***
|
||||
* Notify the ubus bus that a new xroute is received.
|
||||
*
|
||||
* If a new xroute is received or changed, we will notify subscribers.
|
||||
*
|
||||
* @param xroute: xroute that experienced some change
|
||||
* @param kind: kind that describes if we have a flush, add or change
|
||||
*/
|
||||
void ubus_notify_xroute(struct xroute *xroute, int kind);
|
||||
|
||||
/***
|
||||
* Notify the ubus bus that a new route is received.
|
||||
*
|
||||
* If a new route is received or changed, we will notify subscribers.
|
||||
*
|
||||
* @param route: route that experienced some change
|
||||
* @param kind: kind that describes if we have a flush, add or change
|
||||
*/
|
||||
void ubus_notify_route(struct babel_route *route, int kind);
|
||||
|
||||
/***
|
||||
* Notify the ubus bus that a new neighbour is received.
|
||||
*
|
||||
* If a new neighbour is received or changed, we will notify subscribers.
|
||||
*
|
||||
* @param neigh: neighbour that experienced some change
|
||||
* @param kind: kind that describes if we have a flush, add or change
|
||||
*/
|
||||
void ubus_notify_neighbour(struct neighbour *neigh, int kind);
|
255
batctl/Makefile
255
batctl/Makefile
|
@ -1,33 +1,31 @@
|
|||
#
|
||||
# Copyright (C) 2014 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=batctl
|
||||
|
||||
PKG_VERSION:=2018.1
|
||||
PKG_RELEASE:=0
|
||||
PKG_HASH:=27877d0da6916f88a6cecbbb3f3d23cc4558ef7c7294324bf4fd050ed606b553
|
||||
PKG_VERSION:=2024.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
PKG_HASH:=76853e87201af63c411db152fd0c625a729a9733115897d1331604e2c5a67c7d
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(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
|
||||
URL:=https://www.open-mesh.org/
|
||||
define Package/batctl/Default
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
DEPENDS:=+kmod-batman-adv +libnl-tiny +libc +librt
|
||||
TITLE:=B.A.T.M.A.N. Advanced user space configuration tool batctl
|
||||
MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
URL:=https://www.open-mesh.org/
|
||||
DEPENDS:=+libnl-tiny +libc +librt
|
||||
PROVIDES:=batctl
|
||||
endef
|
||||
|
||||
define Package/batctl/description
|
||||
|
@ -37,45 +35,214 @@ additional tools for debugging as well. This package builds
|
|||
version $(PKG_VERSION) of the user space utility.
|
||||
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.
|
||||
define Package/batctl-tiny
|
||||
$(call Package/batctl/Default)
|
||||
TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Minimal)
|
||||
VARIANT:=tiny
|
||||
ALTERNATIVES:=100:/usr/sbin/batctl:/usr/libexec/batctl-tiny
|
||||
endef
|
||||
|
||||
TARGET_CFLAGS += -ffunction-sections -fdata-sections
|
||||
TARGET_LDFLAGS += -Wl,--gc-sections
|
||||
define Package/batctl-tiny/description
|
||||
$(Package/batctl/description)
|
||||
Only configuration relevant subcommands are enabled.
|
||||
endef
|
||||
|
||||
# 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.
|
||||
define Package/batctl-default
|
||||
$(call Package/batctl/Default)
|
||||
TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Default)
|
||||
VARIANT:=default
|
||||
ALTERNATIVES:=200:/usr/sbin/batctl:/usr/libexec/batctl-default
|
||||
endef
|
||||
|
||||
TARGET_CFLAGS += -flto
|
||||
TARGET_LDFLAGS += -fuse-linker-plugin
|
||||
define Package/batctl-default/description
|
||||
$(Package/batctl/description)
|
||||
Standard subcommands for configuration and online debugging are enabled.
|
||||
endef
|
||||
|
||||
MAKE_BATCTL_ENV += \
|
||||
CPPFLAGS="$(TARGET_CPPFLAGS)" \
|
||||
CFLAGS="$(TARGET_CFLAGS)" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
define Package/batctl-full
|
||||
$(call Package/batctl/Default)
|
||||
TITLE:=B.A.T.M.A.N. Advanced user space configuration tool (Full)
|
||||
VARIANT:=full
|
||||
ALTERNATIVES:=300:/usr/sbin/batctl:/usr/libexec/batctl-full
|
||||
endef
|
||||
|
||||
define Package/batctl-full/description
|
||||
$(Package/batctl/description)
|
||||
Subcommands for configuration, online and offline debugging are enabled.
|
||||
endef
|
||||
|
||||
MAKE_VARS += \
|
||||
LIBNL_NAME="libnl-tiny" \
|
||||
LIBNL_GENL_NAME="libnl-tiny"
|
||||
|
||||
MAKE_BATCTL_ARGS += \
|
||||
REVISION="$(PKG_BATCTL_SHORTREV)" \
|
||||
CC="$(TARGET_CC)" \
|
||||
DESTDIR="$(PKG_INSTALL_DIR)" \
|
||||
batctl install
|
||||
MAKE_FLAGS += \
|
||||
REVISION="$(PKG_VERSION)-openwrt-$(PKG_RELEASE)"
|
||||
|
||||
config-n := \
|
||||
aggregation \
|
||||
ap_isolation \
|
||||
backbonetable \
|
||||
bisect_iv \
|
||||
bonding \
|
||||
bla_backbone_json \
|
||||
bla_claim_json \
|
||||
bridge_loop_avoidance \
|
||||
claimtable \
|
||||
dat_cache \
|
||||
dat_cache_json \
|
||||
distributed_arp_table \
|
||||
elp_interval \
|
||||
event \
|
||||
fragmentation \
|
||||
gateways \
|
||||
gateways_json \
|
||||
gw_mode \
|
||||
hardif_json \
|
||||
hardifs_json \
|
||||
hop_penalty \
|
||||
interface \
|
||||
isolation_mark \
|
||||
loglevel \
|
||||
mcast_flags \
|
||||
mcast_flags_json \
|
||||
mesh_json \
|
||||
multicast_fanout \
|
||||
multicast_forceflood \
|
||||
multicast_mode \
|
||||
neighbors \
|
||||
neighbors_json \
|
||||
network_coding \
|
||||
orig_interval \
|
||||
originators \
|
||||
originators_json \
|
||||
ping \
|
||||
routing_algo \
|
||||
statistics \
|
||||
tcpdump \
|
||||
throughput_override \
|
||||
throughputmeter \
|
||||
traceroute \
|
||||
transglobal \
|
||||
translate \
|
||||
translocal \
|
||||
transtable_global_json \
|
||||
transtable_local_json \
|
||||
vlan_json \
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE_BATCTL_ENV) $(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_BATCTL_ARGS)
|
||||
config-settings := \
|
||||
aggregation \
|
||||
ap_isolation \
|
||||
bonding \
|
||||
bridge_loop_avoidance \
|
||||
distributed_arp_table \
|
||||
elp_interval \
|
||||
fragmentation \
|
||||
gw_mode \
|
||||
hop_penalty \
|
||||
interface \
|
||||
isolation_mark \
|
||||
loglevel \
|
||||
multicast_fanout \
|
||||
multicast_forceflood \
|
||||
multicast_mode \
|
||||
network_coding \
|
||||
orig_interval \
|
||||
routing_algo \
|
||||
throughput_override \
|
||||
|
||||
config-tables := \
|
||||
backbonetable \
|
||||
claimtable \
|
||||
dat_cache \
|
||||
gateways \
|
||||
mcast_flags \
|
||||
neighbors \
|
||||
originators \
|
||||
statistics \
|
||||
transglobal \
|
||||
translocal \
|
||||
|
||||
config-json := \
|
||||
bla_backbone_json \
|
||||
bla_claim_json \
|
||||
dat_cache_json \
|
||||
gateways_json \
|
||||
hardif_json \
|
||||
hardifs_json \
|
||||
mcast_flags_json \
|
||||
mesh_json \
|
||||
neighbors_json \
|
||||
originators_json \
|
||||
transtable_global_json \
|
||||
transtable_local_json \
|
||||
vlan_json \
|
||||
|
||||
config-tools := \
|
||||
event \
|
||||
ping \
|
||||
tcpdump \
|
||||
throughputmeter \
|
||||
traceroute \
|
||||
translate \
|
||||
|
||||
config-extratools := \
|
||||
bisect_iv \
|
||||
|
||||
ifeq ($(BUILD_VARIANT),tiny)
|
||||
|
||||
config-y := \
|
||||
$(config-settings) \
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),default)
|
||||
|
||||
config-y := \
|
||||
$(config-settings) \
|
||||
$(config-tables) \
|
||||
$(config-json) \
|
||||
$(config-tools) \
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),full)
|
||||
|
||||
config-y := \
|
||||
$(config-settings) \
|
||||
$(config-tables) \
|
||||
$(config-json) \
|
||||
$(config-tools) \
|
||||
$(config-extratools) \
|
||||
|
||||
endif
|
||||
|
||||
define ConfigVars
|
||||
$(subst $(space),,$(foreach opt,$(config-$(1)),CONFIG_$(opt)=$(1)
|
||||
))
|
||||
endef
|
||||
|
||||
define Build/Clean
|
||||
rm -rf $(BUILD_DIR)/$(PKG_NAME)/
|
||||
define batctl_config
|
||||
$(call ConfigVars,n)$(call ConfigVars,y)
|
||||
endef
|
||||
$(eval $(call shexport,batctl_config))
|
||||
|
||||
MAKE_FLAGS += $$$$$(call shvar,batctl_config)
|
||||
|
||||
define Package/batctl-tiny/install
|
||||
$(INSTALL_DIR) $(1)/usr/libexec
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-tiny
|
||||
endef
|
||||
|
||||
define Package/batctl/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/sbin/
|
||||
define Package/batctl-default/install
|
||||
$(INSTALL_DIR) $(1)/usr/libexec
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-default
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,batctl))
|
||||
define Package/batctl-full/install
|
||||
$(INSTALL_DIR) $(1)/usr/libexec
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/libexec/batctl-full
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,batctl-default))
|
||||
$(eval $(call BuildPackage,batctl-tiny))
|
||||
$(eval $(call BuildPackage,batctl-full))
|
||||
|
|
|
@ -1,35 +1,88 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2007-2019 B.A.T.M.A.N. contributors:
|
||||
#
|
||||
# Marek Lindner, Simon Wunderlich
|
||||
|
||||
config KMOD_BATMAN_ADV_DEBUG_LOG
|
||||
bool "enable verbose debug logging"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default n
|
||||
#
|
||||
# B.A.T.M.A.N meshing protocol
|
||||
#
|
||||
|
||||
config KMOD_BATMAN_ADV_BLA
|
||||
bool "enable bridge loop avoidance"
|
||||
config BATMAN_ADV_BATMAN_V
|
||||
bool "B.A.T.M.A.N. V protocol"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables the B.A.T.M.A.N. V protocol, the successor
|
||||
of the currently used B.A.T.M.A.N. IV protocol. The main
|
||||
changes include splitting of the OGM protocol into a neighbor
|
||||
discovery protocol (Echo Location Protocol, ELP) and a new OGM
|
||||
Protocol OGMv2 for flooding protocol information through the
|
||||
network, as well as a throughput based metric.
|
||||
B.A.T.M.A.N. V is currently considered experimental and not
|
||||
compatible to B.A.T.M.A.N. IV networks.
|
||||
|
||||
config KMOD_BATMAN_ADV_DAT
|
||||
bool "enable distributed arp table"
|
||||
config BATMAN_ADV_BLA
|
||||
bool "Bridge Loop Avoidance"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
select PACKAGE_kmod-lib-crc16
|
||||
default y
|
||||
help
|
||||
This option enables BLA (Bridge Loop Avoidance), a mechanism
|
||||
to avoid Ethernet frames looping when mesh nodes are connected
|
||||
to both the same LAN and the same mesh. If you will never use
|
||||
more than one mesh node in the same LAN, you can safely remove
|
||||
this feature and save some space.
|
||||
|
||||
config BATMAN_ADV_DAT
|
||||
bool "Distributed ARP Table"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables DAT (Distributed ARP Table), a DHT based
|
||||
mechanism that increases ARP reliability on sparse wireless
|
||||
mesh networks. If you think that your network does not need
|
||||
this option you can safely remove it and save some space.
|
||||
|
||||
config KMOD_BATMAN_ADV_DEBUGFS
|
||||
bool "enable debugfs support"
|
||||
config BATMAN_ADV_NC
|
||||
bool "Network Coding"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
help
|
||||
This option enables network coding, a mechanism that aims to
|
||||
increase the overall network throughput by fusing multiple
|
||||
packets in one transmission.
|
||||
Note that interfaces controlled by batman-adv must be manually
|
||||
configured to have promiscuous mode enabled in order to make
|
||||
network coding work.
|
||||
If you think that your network does not need this feature you
|
||||
can safely disable it and save some space.
|
||||
|
||||
config BATMAN_ADV_MCAST
|
||||
bool "Multicast optimisation"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables the multicast optimisation which aims to
|
||||
reduce the air overhead while improving the reliability of
|
||||
multicast messages.
|
||||
|
||||
config KMOD_BATMAN_ADV_MCAST
|
||||
bool "enable multicast transmission optimization"
|
||||
config BATMAN_ADV_DEBUG
|
||||
bool "B.A.T.M.A.N. debugging"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This is an option for use by developers; most people should
|
||||
say N here. This enables compilation of support for
|
||||
outputting debugging information to the debugfs log or tracing
|
||||
buffer. The output is controlled via the batadv netdev specific
|
||||
log_level setting.
|
||||
|
||||
config KMOD_BATMAN_ADV_NC
|
||||
bool "enable network coding [requires promisc mode support]"
|
||||
config BATMAN_ADV_TRACING
|
||||
bool "B.A.T.M.A.N. tracing support"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default n
|
||||
|
||||
config KMOD_BATMAN_ADV_BATMAN_V
|
||||
bool "enable batman v routing algorithm"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
select KERNEL_FTRACE
|
||||
select KERNEL_ENABLE_DEFAULT_TRACERS
|
||||
help
|
||||
This is an option for use by developers; most people should
|
||||
say N here. Select this option to gather traces like the debug
|
||||
messages using the generic tracing infrastructure of the kernel.
|
||||
BATMAN_ADV_DEBUG must also be selected to get trace events for
|
||||
batadv_dbg.
|
||||
|
|
|
@ -1,39 +1,52 @@
|
|||
#
|
||||
# Copyright (C) 2010 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=batman-adv
|
||||
|
||||
PKG_VERSION:=2018.1
|
||||
PKG_VERSION:=2024.0
|
||||
PKG_RELEASE:=2
|
||||
PKG_HASH:=b866b28dbbe5c9238abbdf5abbc30fc526dea56898ce4c1bd76d5c017843048b
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
PKG_HASH:=61110697b5799f646a2a82a4dcf97faed4bb12a7cc43bf4683d2c4de4f6b40e7
|
||||
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 += \
|
||||
CONFIG_BATMAN_ADV_BATMAN_V \
|
||||
CONFIG_BATMAN_ADV_BLA \
|
||||
CONFIG_BATMAN_ADV_DAT \
|
||||
CONFIG_BATMAN_ADV_NC \
|
||||
CONFIG_BATMAN_ADV_MCAST \
|
||||
CONFIG_BATMAN_ADV_DEBUG \
|
||||
CONFIG_BATMAN_ADV_TRACING
|
||||
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define KernelPackage/batman-adv
|
||||
URL:=https://www.open-mesh.org/
|
||||
MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
SUBMENU:=Network Support
|
||||
DEPENDS:=+KMOD_BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-crypto-crc32c +kmod-lib-crc32c +kmod-cfg80211
|
||||
TITLE:=B.A.T.M.A.N. Adv
|
||||
URL:=https://www.open-mesh.org/
|
||||
DEPENDS:=+BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-lib-crc32c +kmod-cfg80211 +batctl
|
||||
FILES:=$(PKG_BUILD_DIR)/net/batman-adv/batman-adv.$(LINUX_KMOD_SUFFIX)
|
||||
AUTOLOAD:=$(call AutoLoad,50,cfg80211 batman-adv)
|
||||
AUTOLOAD:=$(call AutoProbe,batman-adv)
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/description
|
||||
B.A.T.M.A.N. advanced is a kernel module which allows to
|
||||
build layer 2 mesh networks. This package builds
|
||||
version $(PKG_VERSION) of the kernel module.
|
||||
B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is
|
||||
a routing protocol for multi-hop ad-hoc mesh networks. The
|
||||
networks may be wired or wireless. See
|
||||
https://www.open-mesh.org/ for more information and user space
|
||||
tools. This package builds version $(PKG_VERSION) of the kernel
|
||||
module.
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/config
|
||||
|
@ -46,61 +59,43 @@ endef
|
|||
|
||||
PKG_EXTRA_KCONFIG:= \
|
||||
CONFIG_BATMAN_ADV=m \
|
||||
CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUG_LOG),y,n) \
|
||||
CONFIG_BATMAN_ADV_DEBUGFS=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUGFS),y,n) \
|
||||
CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_KMOD_BATMAN_ADV_BLA),y,n) \
|
||||
CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_KMOD_BATMAN_ADV_DAT),y,n) \
|
||||
CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),y,n) \
|
||||
CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_KMOD_BATMAN_ADV_NC),y,n) \
|
||||
CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_KMOD_BATMAN_ADV_BATMAN_V),y,n) \
|
||||
CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_BATMAN_ADV_DEBUG),y,n) \
|
||||
CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_BATMAN_ADV_BLA),y,n) \
|
||||
CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_BATMAN_ADV_DAT),y,n) \
|
||||
CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_BATMAN_ADV_MCAST),y,n) \
|
||||
CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_BATMAN_ADV_NC),y,n) \
|
||||
CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_BATMAN_ADV_BATMAN_V),y,n) \
|
||||
CONFIG_BATMAN_ADV_TRACING=$(if $(CONFIG_BATMAN_ADV_TRACING),y,n) \
|
||||
|
||||
PKG_EXTRA_CFLAGS:= \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(PKG_EXTRA_KCONFIG)))) \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(PKG_EXTRA_KCONFIG)))) \
|
||||
|
||||
NOSTDINC_FLAGS = \
|
||||
$(KERNEL_NOSTDINC_FLAGS) \
|
||||
-I$(PKG_BUILD_DIR)/net/batman-adv \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211-backport \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211 \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211/uapi \
|
||||
-I$(PKG_BUILD_DIR)/include/ \
|
||||
-include backport/autoconf.h \
|
||||
-include backport/backport.h \
|
||||
-include $(PKG_BUILD_DIR)/compat-hacks.h
|
||||
|
||||
COMPAT_SOURCES = \
|
||||
$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/core/skbuff.o,) \
|
||||
$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/ipv4/igmp.o,) \
|
||||
$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),../../compat-sources/net/ipv6/mcast_snoop.o,) \
|
||||
-include $(PKG_BUILD_DIR)/compat-hacks.h \
|
||||
-DBATADV_SOURCE_VERSION=\\\"$(PKG_VERSION)-openwrt-$(PKG_RELEASE)\\\"
|
||||
|
||||
define Build/Compile
|
||||
+env "batman-adv-y=$(COMPAT_SOURCES)" \
|
||||
$(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \
|
||||
ARCH="$(LINUX_KARCH)" \
|
||||
CROSS_COMPILE="$(TARGET_CROSS)" \
|
||||
SUBDIRS="$(PKG_BUILD_DIR)/net/batman-adv" \
|
||||
$(KERNEL_MAKE_FLAGS) \
|
||||
M="$(PKG_BUILD_DIR)/net/batman-adv" \
|
||||
$(PKG_EXTRA_KCONFIG) \
|
||||
EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS)" \
|
||||
NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \
|
||||
modules
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
$(CP) ./files/compat-hacks.h $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
|
||||
define Build/Clean
|
||||
rm -rf $(BUILD_DIR)/$(PKG_NAME)/
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/install
|
||||
$(INSTALL_DIR) $(1)/etc/config $(1)/etc/hotplug.d/net $(1)/etc/hotplug.d/iface $(1)/lib/batman-adv $(1)/usr/sbin $(1)/lib/netifd/proto
|
||||
$(INSTALL_DATA) ./files/etc/config/batman-adv $(1)/etc/config
|
||||
$(INSTALL_DATA) ./files/lib/batman-adv/config.sh $(1)/lib/batman-adv
|
||||
$(INSTALL_BIN) ./files/etc/hotplug.d/net/99-batman-adv $(1)/etc/hotplug.d/net
|
||||
$(INSTALL_BIN) ./files/lib/netifd/proto/batadv.sh $(1)/lib/netifd/proto
|
||||
$(INSTALL_BIN) ./files/lib/netifd/proto/batadv_vlan.sh $(1)/lib/netifd/proto
|
||||
$(CP) ./files/. $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,batman-adv))
|
||||
|
|
|
@ -1,440 +0,0 @@
|
|||
/* Please avoid adding hacks here - instead add it to mac80211/backports.git */
|
||||
|
||||
#undef CONFIG_MODULE_STRIPPED
|
||||
|
||||
#include <linux/version.h> /* LINUX_VERSION_CODE */
|
||||
#include <linux/types.h>
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
|
||||
|
||||
#define dev_get_iflink(_net_dev) ((_net_dev)->iflink)
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 1, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)
|
||||
|
||||
/* Linux 3.15 misses the uapi include.... */
|
||||
#include <uapi/linux/nl80211.h>
|
||||
|
||||
#endif /* < KERNEL_VERSION(3, 16, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info, extack) ({\
|
||||
BUILD_BUG_ON(upper_priv != NULL); \
|
||||
BUILD_BUG_ON(upper_info != NULL); \
|
||||
BUILD_BUG_ON(extack != NULL); \
|
||||
netdev_set_master(dev, upper_dev); \
|
||||
})
|
||||
|
||||
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info, extack) ({\
|
||||
BUILD_BUG_ON(upper_priv != NULL); \
|
||||
BUILD_BUG_ON(upper_info != NULL); \
|
||||
BUILD_BUG_ON(extack != NULL); \
|
||||
netdev_master_upper_dev_link(dev, upper_dev); \
|
||||
})
|
||||
|
||||
#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info, extack) ({\
|
||||
BUILD_BUG_ON(extack != NULL); \
|
||||
netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info); \
|
||||
})
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 5, 0) */
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
|
||||
|
||||
/* for batadv_v_elp_get_throughput which would have used
|
||||
* STATION_INFO_EXPECTED_THROUGHPUT in Linux 4.0.0
|
||||
*/
|
||||
#define NL80211_STA_INFO_EXPECTED_THROUGHPUT 28
|
||||
|
||||
/* wild hack for batadv_getlink_net only */
|
||||
#define get_link_net get_xstats_size || 1 ? fallback_net : (struct net*)netdev->rtnl_link_ops->get_xstats_size
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 0, 0) */
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0)
|
||||
|
||||
struct sk_buff *skb_checksum_trimmed(struct sk_buff *skb,
|
||||
unsigned int transport_len,
|
||||
__sum16(*skb_chkf)(struct sk_buff *skb));
|
||||
|
||||
int ip_mc_check_igmp(struct sk_buff *skb, struct sk_buff **skb_trimmed);
|
||||
|
||||
int ipv6_mc_check_mld(struct sk_buff *skb, struct sk_buff **skb_trimmed);
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 2, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
|
||||
|
||||
#define IFF_NO_QUEUE 0; dev->tx_queue_len = 0
|
||||
|
||||
static inline bool hlist_fake(struct hlist_node *h)
|
||||
{
|
||||
return h->pprev == &h->next;
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 3, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
|
||||
|
||||
#include <linux/ethtool.h>
|
||||
|
||||
#define ethtool_link_ksettings batadv_ethtool_link_ksettings
|
||||
|
||||
struct batadv_ethtool_link_ksettings {
|
||||
struct {
|
||||
__u32 speed;
|
||||
__u8 duplex;
|
||||
} base;
|
||||
};
|
||||
|
||||
#define __ethtool_get_link_ksettings(__dev, __link_settings) \
|
||||
batadv_ethtool_get_link_ksettings(__dev, __link_settings)
|
||||
|
||||
static inline int
|
||||
batadv_ethtool_get_link_ksettings(struct net_device *dev,
|
||||
struct ethtool_link_ksettings *link_ksettings)
|
||||
{
|
||||
struct ethtool_cmd cmd;
|
||||
int ret;
|
||||
|
||||
memset(&cmd, 0, sizeof(cmd));
|
||||
ret = __ethtool_get_settings(dev, &cmd);
|
||||
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
link_ksettings->base.duplex = cmd.duplex;
|
||||
link_ksettings->base.speed = ethtool_cmd_speed(&cmd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 6, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
|
||||
|
||||
#ifdef netif_trans_update
|
||||
#undef netif_trans_update
|
||||
#endif
|
||||
|
||||
#define netif_trans_update batadv_netif_trans_update
|
||||
static inline void batadv_netif_trans_update(struct net_device *dev)
|
||||
{
|
||||
dev->trans_start = jiffies;
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 7, 0) */
|
||||
|
||||
|
||||
#include_next <linux/netlink.h>
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
|
||||
|
||||
#include_next <net/netlink.h>
|
||||
|
||||
static inline bool batadv_nla_need_padding_for_64bit(struct sk_buff *skb);
|
||||
|
||||
static inline int batadv_nla_align_64bit(struct sk_buff *skb, int padattr)
|
||||
{
|
||||
if (batadv_nla_need_padding_for_64bit(skb) &&
|
||||
!nla_reserve(skb, padattr, 0))
|
||||
return -EMSGSIZE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct nlattr *batadv__nla_reserve_64bit(struct sk_buff *skb,
|
||||
int attrtype,
|
||||
int attrlen, int padattr)
|
||||
{
|
||||
if (batadv_nla_need_padding_for_64bit(skb))
|
||||
batadv_nla_align_64bit(skb, padattr);
|
||||
|
||||
return __nla_reserve(skb, attrtype, attrlen);
|
||||
}
|
||||
|
||||
static inline void batadv__nla_put_64bit(struct sk_buff *skb, int attrtype,
|
||||
int attrlen, const void *data,
|
||||
int padattr)
|
||||
{
|
||||
struct nlattr *nla;
|
||||
|
||||
nla = batadv__nla_reserve_64bit(skb, attrtype, attrlen, padattr);
|
||||
memcpy(nla_data(nla), data, attrlen);
|
||||
}
|
||||
|
||||
static inline bool batadv_nla_need_padding_for_64bit(struct sk_buff *skb)
|
||||
{
|
||||
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
/* The nlattr header is 4 bytes in size, that's why we test
|
||||
* if the skb->data _is_ aligned. A NOP attribute, plus
|
||||
* nlattr header for next attribute, will make nla_data()
|
||||
* 8-byte aligned.
|
||||
*/
|
||||
if (IS_ALIGNED((unsigned long)skb_tail_pointer(skb), 8))
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int batadv_nla_total_size_64bit(int payload)
|
||||
{
|
||||
return NLA_ALIGN(nla_attr_size(payload))
|
||||
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
+ NLA_ALIGN(nla_attr_size(0))
|
||||
#endif
|
||||
;
|
||||
}
|
||||
|
||||
static inline int batadv_nla_put_64bit(struct sk_buff *skb, int attrtype,
|
||||
int attrlen, const void *data,
|
||||
int padattr)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
if (batadv_nla_need_padding_for_64bit(skb))
|
||||
len = batadv_nla_total_size_64bit(attrlen);
|
||||
else
|
||||
len = nla_total_size(attrlen);
|
||||
if (unlikely(skb_tailroom(skb) < len))
|
||||
return -EMSGSIZE;
|
||||
|
||||
batadv__nla_put_64bit(skb, attrtype, attrlen, data, padattr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef nla_put_u64_64bit
|
||||
#undef nla_put_u64_64bit
|
||||
#endif
|
||||
|
||||
#define nla_put_u64_64bit(_skb, _attrtype, _value, _padattr) \
|
||||
batadv_nla_put_u64_64bit(_skb, _attrtype, _value, _padattr)
|
||||
static inline int batadv_nla_put_u64_64bit(struct sk_buff *skb, int attrtype,
|
||||
u64 value, int padattr)
|
||||
{
|
||||
return batadv_nla_put_64bit(skb, attrtype, sizeof(u64), &value,
|
||||
padattr);
|
||||
}
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 7, 0) */
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
|
||||
|
||||
#include_next <linux/cache.h>
|
||||
|
||||
/* hack for netlink.c which marked the family ops as ro */
|
||||
#ifdef __ro_after_init
|
||||
#undef __ro_after_init
|
||||
#endif
|
||||
#define __ro_after_init
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 10, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 9)
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
/* work around missing attribute needs_free_netdev and priv_destructor in
|
||||
* net_device
|
||||
*/
|
||||
#define ether_setup(dev) \
|
||||
void batadv_softif_free2(struct net_device *dev) \
|
||||
{ \
|
||||
batadv_softif_free(dev); \
|
||||
free_netdev(dev); \
|
||||
} \
|
||||
void (*t1)(struct net_device *dev) __attribute__((unused)); \
|
||||
bool t2 __attribute__((unused)); \
|
||||
ether_setup(dev)
|
||||
#define needs_free_netdev destructor = batadv_softif_free2; t2
|
||||
#define priv_destructor destructor = batadv_softif_free2; t1
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 11, 9) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0)
|
||||
|
||||
static inline void *batadv_skb_put(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
return (void *)skb_put(skb, len);
|
||||
}
|
||||
#ifdef skb_put
|
||||
#undef skb_put
|
||||
#endif
|
||||
|
||||
#define skb_put batadv_skb_put
|
||||
|
||||
static inline void *batadv_skb_put_zero(struct sk_buff *skb, unsigned int len)
|
||||
{
|
||||
void *tmp = skb_put(skb, len);
|
||||
|
||||
memset(tmp, 0, len);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
#ifdef skb_put_zero
|
||||
#undef skb_put_zero
|
||||
#endif
|
||||
|
||||
#define skb_put_zero batadv_skb_put_zero
|
||||
|
||||
static inline void *batadv_skb_put_data(struct sk_buff *skb, const void *data,
|
||||
unsigned int len)
|
||||
{
|
||||
void *tmp = skb_put(skb, len);
|
||||
|
||||
memcpy(tmp, data, len);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
#ifdef skb_put_data
|
||||
#undef skb_put_data
|
||||
#endif
|
||||
|
||||
#define skb_put_data batadv_skb_put_data
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 13, 0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)
|
||||
|
||||
#define batadv_softif_slave_add(__dev, __slave_dev, __extack) \
|
||||
batadv_softif_slave_add(__dev, __slave_dev)
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 15, 0) */
|
||||
|
||||
#ifndef from_timer
|
||||
|
||||
#define TIMER_DATA_TYPE unsigned long
|
||||
#define TIMER_FUNC_TYPE void (*)(TIMER_DATA_TYPE)
|
||||
|
||||
static inline void timer_setup(struct timer_list *timer,
|
||||
void (*callback)(struct timer_list *),
|
||||
unsigned int flags)
|
||||
{
|
||||
__setup_timer(timer, (TIMER_FUNC_TYPE)callback,
|
||||
(TIMER_DATA_TYPE)timer, flags);
|
||||
}
|
||||
|
||||
#define from_timer(var, callback_timer, timer_fieldname) \
|
||||
container_of(callback_timer, typeof(*var), timer_fieldname)
|
||||
|
||||
#endif /* !from_timer */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0)
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 18, 0)
|
||||
|
||||
#include <net/cfg80211.h>
|
||||
|
||||
/* cfg80211 fix: https://patchwork.kernel.org/patch/10449857/ */
|
||||
static inline int batadv_cfg80211_get_station(struct net_device *dev,
|
||||
const u8 *mac_addr,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
memset(sinfo, 0, sizeof(*sinfo));
|
||||
return cfg80211_get_station(dev, mac_addr, sinfo);
|
||||
}
|
||||
|
||||
#define cfg80211_get_station(dev, mac_addr, sinfo) \
|
||||
batadv_cfg80211_get_station(dev, mac_addr, sinfo)
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 18, 0) */
|
||||
|
||||
|
||||
#ifdef __CHECK_POLL
|
||||
typedef unsigned __bitwise __poll_t;
|
||||
#else
|
||||
typedef unsigned __poll_t;
|
||||
#endif
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 16, 0) */
|
||||
|
||||
/* <DECLARE_EWMA> */
|
||||
|
||||
#include <linux/version.h>
|
||||
#include_next <linux/average.h>
|
||||
|
||||
#include <linux/bug.h>
|
||||
|
||||
#ifdef DECLARE_EWMA
|
||||
#undef DECLARE_EWMA
|
||||
#endif /* DECLARE_EWMA */
|
||||
|
||||
/*
|
||||
* Exponentially weighted moving average (EWMA)
|
||||
*
|
||||
* This implements a fixed-precision EWMA algorithm, with both the
|
||||
* precision and fall-off coefficient determined at compile-time
|
||||
* and built into the generated helper funtions.
|
||||
*
|
||||
* The first argument to the macro is the name that will be used
|
||||
* for the struct and helper functions.
|
||||
*
|
||||
* The second argument, the precision, expresses how many bits are
|
||||
* used for the fractional part of the fixed-precision values.
|
||||
*
|
||||
* The third argument, the weight reciprocal, determines how the
|
||||
* new values will be weighed vs. the old state, new values will
|
||||
* get weight 1/weight_rcp and old values 1-1/weight_rcp. Note
|
||||
* that this parameter must be a power of two for efficiency.
|
||||
*/
|
||||
|
||||
#define DECLARE_EWMA(name, _precision, _weight_rcp) \
|
||||
struct ewma_##name { \
|
||||
unsigned long internal; \
|
||||
}; \
|
||||
static inline void ewma_##name##_init(struct ewma_##name *e) \
|
||||
{ \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
/* \
|
||||
* Even if you want to feed it just 0/1 you should have \
|
||||
* some bits for the non-fractional part... \
|
||||
*/ \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
e->internal = 0; \
|
||||
} \
|
||||
static inline unsigned long \
|
||||
ewma_##name##_read(struct ewma_##name *e) \
|
||||
{ \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
return e->internal >> (_precision); \
|
||||
} \
|
||||
static inline void ewma_##name##_add(struct ewma_##name *e, \
|
||||
unsigned long val) \
|
||||
{ \
|
||||
unsigned long internal = READ_ONCE(e->internal); \
|
||||
unsigned long weight_rcp = ilog2(_weight_rcp); \
|
||||
unsigned long precision = _precision; \
|
||||
\
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
\
|
||||
WRITE_ONCE(e->internal, internal ? \
|
||||
(((internal << weight_rcp) - internal) + \
|
||||
(val << precision)) >> weight_rcp : \
|
||||
(val << precision)); \
|
||||
}
|
||||
|
||||
/* </DECLARE_EWMA> */
|
|
@ -1,21 +0,0 @@
|
|||
|
||||
config 'mesh' 'bat0'
|
||||
option 'aggregated_ogms'
|
||||
option 'ap_isolation'
|
||||
option 'bonding'
|
||||
option 'fragmentation'
|
||||
option 'gw_bandwidth'
|
||||
option 'gw_mode'
|
||||
option 'gw_sel_class'
|
||||
option 'log_level'
|
||||
option 'orig_interval'
|
||||
option 'bridge_loop_avoidance'
|
||||
option 'distributed_arp_table'
|
||||
option 'multicast_mode'
|
||||
option 'network_coding'
|
||||
option 'hop_penalty'
|
||||
option 'isolation_mark'
|
||||
|
||||
# yet another batX instance
|
||||
# config 'mesh' 'bat5'
|
||||
# option 'interfaces' 'second_mesh'
|
|
@ -1,12 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
. /lib/batman-adv/config.sh
|
||||
|
||||
bat_load_module
|
||||
config_load batman-adv
|
||||
|
||||
case "$ACTION" in
|
||||
add)
|
||||
[ -d /sys/class/net/$INTERFACE/mesh/ ] && bat_config "$INTERFACE"
|
||||
;;
|
||||
esac
|
97
batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
Executable file
97
batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif
Executable file
|
@ -0,0 +1,97 @@
|
|||
#!/bin/sh
|
||||
|
||||
# This UCI-Defaults script will split the batadv proto network interfaces
|
||||
# in batadv_hardif and batadv proto. The configuration options from
|
||||
# /etc/config/batman-adv will be moved to the latter.
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
proto_batadv_to_batadv_hardif() {
|
||||
local section="$1"
|
||||
local proto
|
||||
local mesh
|
||||
local routing_algo
|
||||
|
||||
config_get proto "${section}" proto
|
||||
config_get mesh "${section}" mesh
|
||||
config_get routing_algo "${section}" routing_algo
|
||||
|
||||
if [ -z "$mesh" -o "${proto}" != "batadv" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
uci set network."${section}".proto="batadv_hardif"
|
||||
uci rename network."${section}".mesh="master"
|
||||
uci delete network."${section}".routing_algo
|
||||
|
||||
# create new section or adjust existing one
|
||||
uci set network."${mesh}"=interface
|
||||
uci set network."${mesh}".proto=batadv
|
||||
[ -n "${routing_algo}" ] && uci set network."${mesh}".routing_algo="${routing_algo}"
|
||||
}
|
||||
|
||||
mv_batadv_config_section() {
|
||||
local section="$1"
|
||||
local aggregated_ogms
|
||||
local ap_isolation
|
||||
local bonding
|
||||
local bridge_loop_avoidance
|
||||
local distributed_arp_table
|
||||
local fragmentation
|
||||
local gw_bandwidth
|
||||
local gw_mode
|
||||
local gw_sel_class
|
||||
local hop_penalty
|
||||
local isolation_mark
|
||||
local log_level
|
||||
local multicast_mode
|
||||
local network_coding
|
||||
local orig_interval
|
||||
|
||||
config_get aggregated_ogms "${section}" aggregated_ogms
|
||||
config_get ap_isolation "${section}" ap_isolation
|
||||
config_get bonding "${section}" bonding
|
||||
config_get bridge_loop_avoidance "${section}" bridge_loop_avoidance
|
||||
config_get distributed_arp_table "${section}" distributed_arp_table
|
||||
config_get fragmentation "${section}" fragmentation
|
||||
config_get gw_bandwidth "${section}" gw_bandwidth
|
||||
config_get gw_mode "${section}" gw_mode
|
||||
config_get gw_sel_class "${section}" gw_sel_class
|
||||
config_get hop_penalty "${section}" hop_penalty
|
||||
config_get isolation_mark "${section}" isolation_mark
|
||||
config_get log_level "${section}" log_level
|
||||
config_get multicast_mode "${section}" multicast_mode
|
||||
config_get network_coding "${section}" network_coding
|
||||
config_get orig_interval "${section}" orig_interval
|
||||
|
||||
# update section in case it exists
|
||||
[ -n "${aggregated_ogms}" ] && uci set network."${section}".aggregated_ogms="${aggregated_ogms}"
|
||||
[ -n "${ap_isolation}" ] && uci set network."${section}".ap_isolation="${ap_isolation}"
|
||||
[ -n "${bonding}" ] && uci set network."${section}".bonding="${bonding}"
|
||||
[ -n "${bridge_loop_avoidance}" ] && uci set network."${section}".bridge_loop_avoidance="${bridge_loop_avoidance}"
|
||||
[ -n "${distributed_arp_table}" ] && uci set network."${section}".distributed_arp_table="${distributed_arp_table}"
|
||||
[ -n "${fragmentation}" ] && uci set network."${section}".fragmentation="${fragmentation}"
|
||||
[ -n "${gw_bandwidth}" ] && uci set network."${section}".gw_bandwidth="${gw_bandwidth}"
|
||||
[ -n "${gw_mode}" ] && uci set network."${section}".gw_mode="${gw_mode}"
|
||||
[ -n "${gw_sel_class}" ] && uci set network."${section}".gw_sel_class="${gw_sel_class}"
|
||||
[ -n "${hop_penalty}" ] && uci set network."${section}".hop_penalty="${hop_penalty}"
|
||||
[ -n "${isolation_mark}" ] && uci set network."${section}".isolation_mark="${isolation_mark}"
|
||||
[ -n "${log_level}" ] && uci set network."${section}".log_level="${log_level}"
|
||||
[ -n "${multicast_mode}" ] && uci set network."${section}".multicast_mode="${multicast_mode}"
|
||||
[ -n "${network_coding}" ] && uci set network."${section}".network_coding="${network_coding}"
|
||||
[ -n "${orig_interval}" ] && uci set network."${section}".orig_interval="${orig_interval}"
|
||||
}
|
||||
|
||||
if [ -f /etc/config/batman-adv ]; then
|
||||
config_load network
|
||||
config_foreach proto_batadv_to_batadv_hardif 'interface'
|
||||
uci commit network
|
||||
|
||||
config_load batman-adv
|
||||
config_foreach mv_batadv_config_section 'mesh'
|
||||
uci commit network
|
||||
|
||||
rm -f /etc/config/batman-adv
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -1,51 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
bat_load_module()
|
||||
{
|
||||
[ -d "/sys/module/batman_adv/" ] && return
|
||||
|
||||
. /lib/functions.sh
|
||||
load_modules /etc/modules.d/*-crc16 /etc/modules.d/*-crypto* /etc/modules.d/*-lib-crc* /etc/modules.d/*-batman-adv*
|
||||
}
|
||||
|
||||
bat_config()
|
||||
{
|
||||
local mesh="$1"
|
||||
local aggregated_ogms ap_isolation bonding bridge_loop_avoidance distributed_arp_table fragmentation
|
||||
local gw_bandwidth gw_mode gw_sel_class isolation_mark hop_penalty multicast_mode network_coding log_level
|
||||
local orig_interval
|
||||
|
||||
config_get aggregated_ogms "$mesh" aggregated_ogms
|
||||
config_get ap_isolation "$mesh" ap_isolation
|
||||
config_get bonding "$mesh" bonding
|
||||
config_get bridge_loop_avoidance "$mesh" bridge_loop_avoidance
|
||||
config_get distributed_arp_table "$mesh" distributed_arp_table
|
||||
config_get fragmentation "$mesh" fragmentation
|
||||
config_get gw_bandwidth "$mesh" gw_bandwidth
|
||||
config_get gw_mode "$mesh" gw_mode
|
||||
config_get gw_sel_class "$mesh" gw_sel_class
|
||||
config_get hop_penalty "$mesh" hop_penalty
|
||||
config_get isolation_mark "$mesh" isolation_mark
|
||||
config_get multicast_mode "$mesh" multicast_mode
|
||||
config_get network_coding "$mesh" network_coding
|
||||
config_get log_level "$mesh" log_level
|
||||
config_get orig_interval "$mesh" orig_interval
|
||||
|
||||
[ ! -f "/sys/class/net/$mesh/mesh/orig_interval" ] && echo "batman-adv mesh $mesh does not exist - check your interface configuration" && return 1
|
||||
|
||||
[ -n "$aggregated_ogms" ] && echo $aggregated_ogms > /sys/class/net/$mesh/mesh/aggregated_ogms
|
||||
[ -n "$ap_isolation" ] && echo $ap_isolation > /sys/class/net/$mesh/mesh/ap_isolation
|
||||
[ -n "$bonding" ] && echo $bonding > /sys/class/net/$mesh/mesh/bonding
|
||||
[ -n "$bridge_loop_avoidance" ] && echo $bridge_loop_avoidance > /sys/class/net/$mesh/mesh/bridge_loop_avoidance 2>&-
|
||||
[ -n "$distributed_arp_table" ] && echo $distributed_arp_table > /sys/class/net/$mesh/mesh/distributed_arp_table 2>&-
|
||||
[ -n "$fragmentation" ] && echo $fragmentation > /sys/class/net/$mesh/mesh/fragmentation
|
||||
[ -n "$gw_bandwidth" ] && echo $gw_bandwidth > /sys/class/net/$mesh/mesh/gw_bandwidth
|
||||
[ -n "$gw_mode" ] && echo $gw_mode > /sys/class/net/$mesh/mesh/gw_mode
|
||||
[ -n "$gw_sel_class" ] && echo $gw_sel_class > /sys/class/net/$mesh/mesh/gw_sel_class
|
||||
[ -n "$hop_penalty" ] && echo $hop_penalty > /sys/class/net/$mesh/mesh/hop_penalty
|
||||
[ -n "$isolation_mark" ] && echo $isolation_mark > /sys/class/net/$mesh/mesh/isolation_mark
|
||||
[ -n "$multicast_mode" ] && echo $multicast_mode > /sys/class/net/$mesh/mesh/multicast_mode 2>&-
|
||||
[ -n "$network_coding" ] && echo $network_coding > /sys/class/net/$mesh/mesh/network_coding 2>&-
|
||||
[ -n "$log_level" ] && echo $log_level > /sys/class/net/$mesh/mesh/log_level 2>&-
|
||||
[ -n "$orig_interval" ] && echo $orig_interval > /sys/class/net/$mesh/mesh/orig_interval
|
||||
}
|
109
batman-adv/files/lib/netifd/proto/batadv.sh
Normal file → Executable file
109
batman-adv/files/lib/netifd/proto/batadv.sh
Normal file → Executable file
|
@ -1,34 +1,123 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
}
|
||||
|
||||
proto_batadv_init_config() {
|
||||
proto_config_add_string "mesh"
|
||||
proto_config_add_string "routing_algo"
|
||||
no_device=1
|
||||
available=1
|
||||
|
||||
proto_config_add_boolean 'aggregated_ogms:bool'
|
||||
proto_config_add_boolean 'ap_isolation:bool'
|
||||
proto_config_add_boolean 'bonding:bool'
|
||||
proto_config_add_boolean 'bridge_loop_avoidance:bool'
|
||||
proto_config_add_boolean 'distributed_arp_table:bool'
|
||||
proto_config_add_boolean 'fragmentation:bool'
|
||||
proto_config_add_string 'gw_bandwidth'
|
||||
proto_config_add_string 'gw_mode'
|
||||
proto_config_add_int 'gw_sel_class'
|
||||
proto_config_add_int 'hop_penalty'
|
||||
proto_config_add_string 'isolation_mark'
|
||||
proto_config_add_string 'log_level'
|
||||
proto_config_add_int 'multicast_fanout'
|
||||
proto_config_add_boolean 'multicast_mode:bool'
|
||||
proto_config_add_boolean 'network_coding:bool'
|
||||
proto_config_add_int 'orig_interval'
|
||||
proto_config_add_string 'routing_algo'
|
||||
}
|
||||
|
||||
proto_batadv_setup() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
local iface="$config"
|
||||
|
||||
local mesh routing_algo
|
||||
json_get_vars mesh routing_algo
|
||||
local aggregated_ogms
|
||||
local ap_isolation
|
||||
local bonding
|
||||
local bridge_loop_avoidance
|
||||
local distributed_arp_table
|
||||
local fragmentation
|
||||
local gw_bandwidth
|
||||
local gw_mode
|
||||
local gw_sel_class
|
||||
local hop_penalty
|
||||
local isolation_mark
|
||||
local log_level
|
||||
local multicast_fanout
|
||||
local multicast_mode
|
||||
local network_coding
|
||||
local orig_interval
|
||||
local routing_algo
|
||||
|
||||
[ -n "$routing_algo" ] || routing_algo="BATMAN_IV"
|
||||
echo "$routing_algo" > "/sys/module/batman_adv/parameters/routing_algo"
|
||||
json_get_vars aggregated_ogms
|
||||
json_get_vars ap_isolation
|
||||
json_get_vars bonding
|
||||
json_get_vars bridge_loop_avoidance
|
||||
json_get_vars distributed_arp_table
|
||||
json_get_vars fragmentation
|
||||
json_get_vars gw_bandwidth
|
||||
json_get_vars gw_mode
|
||||
json_get_vars gw_sel_class
|
||||
json_get_vars hop_penalty
|
||||
json_get_vars isolation_mark
|
||||
json_get_vars log_level
|
||||
json_get_vars multicast_fanout
|
||||
json_get_vars multicast_mode
|
||||
json_get_vars network_coding
|
||||
json_get_vars orig_interval
|
||||
json_get_vars routing_algo
|
||||
|
||||
set_default routing_algo 'BATMAN_IV'
|
||||
|
||||
batctl routing_algo "$routing_algo"
|
||||
batctl meshif "$iface" interface create
|
||||
|
||||
[ -n "$aggregated_ogms" ] && batctl meshif "$iface" aggregation "$aggregated_ogms"
|
||||
[ -n "$ap_isolation" ] && batctl meshif "$iface" ap_isolation "$ap_isolation"
|
||||
[ -n "$bonding" ] && batctl meshif "$iface" bonding "$bonding"
|
||||
[ -n "$bridge_loop_avoidance" ] && batctl meshif "$iface" bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
|
||||
[ -n "$distributed_arp_table" ] && batctl meshif "$iface" distributed_arp_table "$distributed_arp_table" 2>&-
|
||||
[ -n "$fragmentation" ] && batctl meshif "$iface" fragmentation "$fragmentation"
|
||||
|
||||
case "$gw_mode" in
|
||||
server)
|
||||
if [ -n "$gw_bandwidth" ]; then
|
||||
batctl meshif "$iface" gw_mode "server" "$gw_bandwidth"
|
||||
else
|
||||
batctl meshif "$iface" gw_mode "server"
|
||||
fi
|
||||
;;
|
||||
client)
|
||||
if [ -n "$gw_sel_class" ]; then
|
||||
batctl meshif "$iface" gw_mode "client" "$gw_sel_class"
|
||||
else
|
||||
batctl meshif "$iface" gw_mode "client"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
batctl meshif "$iface" gw_mode "off"
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -n "$hop_penalty" ] && batctl meshif "$iface" hop_penalty "$hop_penalty"
|
||||
[ -n "$isolation_mark" ] && batctl meshif "$iface" isolation_mark "$isolation_mark"
|
||||
[ -n "$multicast_fanout" ] && batctl meshif "$iface" multicast_fanout "$multicast_fanout"
|
||||
[ -n "$multicast_mode" ] && batctl meshif "$iface" multicast_mode "$multicast_mode" 2>&-
|
||||
[ -n "$network_coding" ] && batctl meshif "$iface" network_coding "$network_coding" 2>&-
|
||||
[ -n "$log_level" ] && batctl meshif "$iface" loglevel "$log_level" 2>&-
|
||||
[ -n "$orig_interval" ] && batctl meshif "$iface" orig_interval "$orig_interval"
|
||||
|
||||
echo "$mesh" > "/sys/class/net/$iface/batman_adv/mesh_iface"
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
proto_batadv_teardown() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
local iface="$config"
|
||||
|
||||
echo "none" > "/sys/class/net/$iface/batman_adv/mesh_iface" || true
|
||||
batctl meshif "$iface" interface destroy
|
||||
}
|
||||
|
||||
add_protocol batadv
|
||||
|
|
53
batman-adv/files/lib/netifd/proto/batadv_hardif.sh
Executable file
53
batman-adv/files/lib/netifd/proto/batadv_hardif.sh
Executable file
|
@ -0,0 +1,53 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
}
|
||||
|
||||
proto_batadv_hardif_init_config() {
|
||||
proto_config_add_int 'elp_interval'
|
||||
proto_config_add_int 'hop_penalty'
|
||||
proto_config_add_string "master"
|
||||
proto_config_add_string 'throughput_override'
|
||||
}
|
||||
|
||||
proto_batadv_hardif_setup() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
local elp_interval
|
||||
local hop_penalty
|
||||
local master
|
||||
local throughput_override
|
||||
|
||||
json_get_vars elp_interval
|
||||
json_get_vars hop_penalty
|
||||
json_get_vars master
|
||||
json_get_vars throughput_override
|
||||
|
||||
( proto_add_host_dependency "$config" '' "$master" )
|
||||
|
||||
batctl meshif "$master" interface -M add "$iface"
|
||||
|
||||
[ -n "$elp_interval" ] && batctl hardif "$iface" elp_interval "$elp_interval"
|
||||
[ -n "$hop_penalty" ] && batctl hardif "$iface" hop_penalty "$hop_penalty"
|
||||
[ -n "$throughput_override" ] && batctl hardif "$iface" throughput_override "$throughput_override"
|
||||
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
proto_batadv_hardif_teardown() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
local master
|
||||
|
||||
json_get_vars master
|
||||
|
||||
batctl meshif "$master" interface -M del "$iface" || true
|
||||
}
|
||||
|
||||
add_protocol batadv_hardif
|
12
batman-adv/files/lib/netifd/proto/batadv_vlan.sh
Normal file → Executable file
12
batman-adv/files/lib/netifd/proto/batadv_vlan.sh
Normal file → Executable file
|
@ -5,25 +5,25 @@
|
|||
init_proto "$@"
|
||||
|
||||
proto_batadv_vlan_init_config() {
|
||||
proto_config_add_string "ap_isolation"
|
||||
proto_config_add_boolean 'ap_isolation:bool'
|
||||
}
|
||||
|
||||
proto_batadv_vlan_setup() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
# VLAN specific variables
|
||||
local device="${iface%.*}"
|
||||
local vid="${iface#*.}"
|
||||
|
||||
# batadv_vlan options
|
||||
local ap_isolation
|
||||
|
||||
json_get_vars ap_isolation
|
||||
|
||||
echo "$ap_isolation" > "/sys/class/net/${device}/mesh/vlan${vid}/ap_isolation"
|
||||
[ -n "$ap_isolation" ] && batctl vlan "$iface" ap_isolation "$ap_isolation"
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
proto_batadv_vlan_teardown() {
|
||||
local cfg="$1"
|
||||
}
|
||||
|
||||
add_protocol batadv_vlan
|
||||
|
|
|
@ -0,0 +1,274 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 6 May 2022 22:03:29 +0200
|
||||
Subject: Revert "batman-adv: Migrate to linux/container_of.h"
|
||||
|
||||
The original patch requires Linux 5.16.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit 043ae5634bdfd4c4dd8b95a22890752495080bb5.
|
||||
|
||||
--- a/compat-include/linux/container_of.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 16, 0)
|
||||
-#include_next <linux/container_of.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_CONTAINER_OF_H_ */
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -13,13 +13,13 @@
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
--- a/net/batman-adv/bat_v_ogm.c
|
||||
+++ b/net/batman-adv/bat_v_ogm.c
|
||||
@@ -9,12 +9,12 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc16.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
--- a/net/batman-adv/distributed-arp-table.c
|
||||
+++ b/net/batman-adv/distributed-arp-table.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
@@ -21,6 +20,7 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netlink.h>
|
||||
--- a/net/batman-adv/gateway_client.c
|
||||
+++ b/net/batman-adv/gateway_client.c
|
||||
@@ -9,7 +9,6 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -10,12 +10,12 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/if_ether.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc32c.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
--- a/net/batman-adv/network-coding.c
|
||||
+++ b/net/batman-adv/network-coding.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/originator.c
|
||||
+++ b/net/batman-adv/originator.c
|
||||
@@ -8,11 +8,11 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/send.c
|
||||
+++ b/net/batman-adv/send.c
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netdevice.h>
|
||||
--- a/net/batman-adv/soft-interface.c
|
||||
+++ b/net/batman-adv/soft-interface.c
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/tp_meter.c
|
||||
+++ b/net/batman-adv/tp_meter.c
|
||||
@@ -12,13 +12,13 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/limits.h>
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/crc32c.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
@@ -22,6 +21,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
--- a/net/batman-adv/tvlv.c
|
||||
+++ b/net/batman-adv/tvlv.c
|
||||
@@ -7,10 +7,10 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/byteorder/generic.h>
|
||||
-#include <linux/container_of.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
|
@ -1,33 +0,0 @@
|
|||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -19,7 +19,7 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
-#include <linux/build_bug.h>
|
||||
+#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/crc32c.h>
|
||||
#include <linux/errno.h>
|
||||
--- a/net/batman-adv/tp_meter.c
|
||||
+++ b/net/batman-adv/tp_meter.c
|
||||
@@ -20,7 +20,7 @@
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
-#include <linux/build_bug.h>
|
||||
+#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
-#include <linux/build_bug.h>
|
||||
+#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/compiler.h>
|
|
@ -1,75 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 9 May 2018 21:07:40 +0200
|
||||
Subject: [PATCH] batman-adv: Avoid race in TT TVLV allocator helper
|
||||
|
||||
The functions batadv_tt_prepare_tvlv_local_data and
|
||||
batadv_tt_prepare_tvlv_global_data are responsible for preparing a buffer
|
||||
which can be used to store the TVLV container for TT and add the VLAN
|
||||
information to it.
|
||||
|
||||
This will be done in three phases:
|
||||
|
||||
1. count the number of VLANs and their entries
|
||||
2. allocate the buffer using the counters from the previous step and limits
|
||||
from the caller (parameter tt_len)
|
||||
3. insert the VLAN information to the buffer
|
||||
|
||||
The step 1 and 3 operate on a list which contains the VLANs. The access to
|
||||
these lists must be protected with an appropriate lock or otherwise they
|
||||
might operate on on different entries. This could for example happen when
|
||||
another context is adding VLAN entries to this list.
|
||||
|
||||
This could lead to a buffer overflow in these functions when enough entries
|
||||
were added between step 1 and 3 to the VLAN lists that the buffer room for
|
||||
the entries (*tt_change) is smaller then the now required extra buffer for
|
||||
new VLAN entries.
|
||||
|
||||
Fixes: 21a57f6e7a3b ("batman-adv: make the TT CRC logic VLAN specific")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Antonio Quartulli <a@unstable.cc>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/286be89a33497ba9000aa5c2960f1f4114953522
|
||||
---
|
||||
net/batman-adv/translation-table.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 0225616d5771d0986127322142fc591780fc25b0..7fa3a0a0524a1da63e92d081b443c302900bf0c3 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -862,7 +862,7 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
|
||||
struct batadv_orig_node_vlan *vlan;
|
||||
u8 *tt_change_ptr;
|
||||
|
||||
- rcu_read_lock();
|
||||
+ spin_lock_bh(&orig_node->vlan_list_lock);
|
||||
hlist_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
|
||||
num_vlan++;
|
||||
num_entries += atomic_read(&vlan->tt.num_entries);
|
||||
@@ -900,7 +900,7 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
|
||||
*tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr;
|
||||
|
||||
out:
|
||||
- rcu_read_unlock();
|
||||
+ spin_unlock_bh(&orig_node->vlan_list_lock);
|
||||
return tvlv_len;
|
||||
}
|
||||
|
||||
@@ -936,7 +936,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
u8 *tt_change_ptr;
|
||||
int change_offset;
|
||||
|
||||
- rcu_read_lock();
|
||||
+ spin_lock_bh(&bat_priv->softif_vlan_list_lock);
|
||||
hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
||||
num_vlan++;
|
||||
num_entries += atomic_read(&vlan->tt.num_entries);
|
||||
@@ -974,7 +974,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
*tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr;
|
||||
|
||||
out:
|
||||
- rcu_read_unlock();
|
||||
+ spin_unlock_bh(&bat_priv->softif_vlan_list_lock);
|
||||
return tvlv_len;
|
||||
}
|
||||
|
19
batman-adv/patches/0002-fix-batadv_is_cfg80211_netdev.patch
Normal file
19
batman-adv/patches/0002-fix-batadv_is_cfg80211_netdev.patch
Normal file
|
@ -0,0 +1,19 @@
|
|||
From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
||||
Date: Thu, 6 Apr 2023 18:05:50 -0500
|
||||
Subject: fix batadv_is_cfg80211_netdev
|
||||
|
||||
Replace CONFIG_CFG80211 with CPTCFG_CFG80211, which is the correct
|
||||
macro to use when building under backports.
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -308,8 +308,7 @@ static bool batadv_is_cfg80211_netdev(st
|
||||
{
|
||||
if (!net_device)
|
||||
return false;
|
||||
-
|
||||
-#if IS_ENABLED(CONFIG_CFG80211)
|
||||
+#if IS_ENABLED(CPTCFG_CFG80211)
|
||||
/* cfg80211 drivers have to set ieee80211_ptr */
|
||||
if (net_device->ieee80211_ptr)
|
||||
return true;
|
|
@ -0,0 +1,97 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 2 Feb 2024 22:49:00 +0100
|
||||
Subject: Revert "batman-adv: Switch to linux/sprintf.h"
|
||||
|
||||
The original patch requires Linux 6.6.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit f0fb49c5ab70dfa064f0aa8d1c5d84f65e8cbc86.
|
||||
|
||||
--- a/compat-include/linux/sprintf.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(6, 6, 0)
|
||||
-#include_next <linux/sprintf.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_SPRINTF_H_ */
|
||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/jhash.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
@@ -29,7 +30,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/workqueue.h>
|
||||
--- a/net/batman-adv/gateway_client.c
|
||||
+++ b/net/batman-adv/gateway_client.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
@@ -27,7 +28,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/udp.h>
|
||||
#include <net/sock.h>
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/workqueue.h>
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/netdevice.h>
|
||||
@@ -34,7 +35,6 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
-#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
|
@ -1,180 +0,0 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Thu, 10 May 2018 19:44:28 +0200
|
||||
Subject: [PATCH] batman-adv: Fix TT sync flags for intermediate TT responses
|
||||
|
||||
The previous TT sync fix so far only fixed TT responses issued by the
|
||||
target node directly. So far, TT responses issued by intermediate nodes
|
||||
still lead to the wrong flags being added, leading to CRC mismatches.
|
||||
|
||||
This behaviour was observed at Freifunk Hannover in a 800 nodes setup
|
||||
where a considerable amount of nodes were still infected with 'WI'
|
||||
TT flags even with (most) nodes having the previous TT sync fix applied.
|
||||
|
||||
I was able to reproduce the issue with intermediate TT responses in a
|
||||
four node test setup and this patch fixes this issue by ensuring to
|
||||
use the per originator instead of the summarized, OR'd ones.
|
||||
|
||||
Fixes: fa614fd04692 ("batman-adv: fix tt_global_entries flags update")
|
||||
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/d65daee8617b29c1ddcc949ce3a5ec24f7a1e1af
|
||||
---
|
||||
net/batman-adv/translation-table.c | 61 +++++++++++++++++++++++++-----
|
||||
1 file changed, 51 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 7fa3a0a0524a1da63e92d081b443c302900bf0c3..23f9c212ab1e27be429645a85f7b5d6a02585de9 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -1538,6 +1538,8 @@ batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
|
||||
* handled by a given originator
|
||||
* @entry: the TT global entry to check
|
||||
* @orig_node: the originator to search in the list
|
||||
+ * @flags: a pointer to store TT flags for the given @entry received
|
||||
+ * from @orig_node
|
||||
*
|
||||
* find out if an orig_node is already in the list of a tt_global_entry.
|
||||
*
|
||||
@@ -1545,7 +1547,8 @@ batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
|
||||
*/
|
||||
static bool
|
||||
batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
|
||||
- const struct batadv_orig_node *orig_node)
|
||||
+ const struct batadv_orig_node *orig_node,
|
||||
+ u8 *flags)
|
||||
{
|
||||
struct batadv_tt_orig_list_entry *orig_entry;
|
||||
bool found = false;
|
||||
@@ -1553,6 +1556,10 @@ batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
|
||||
orig_entry = batadv_tt_global_orig_entry_find(entry, orig_node);
|
||||
if (orig_entry) {
|
||||
found = true;
|
||||
+
|
||||
+ if (flags)
|
||||
+ *flags = orig_entry->flags;
|
||||
+
|
||||
batadv_tt_orig_list_entry_put(orig_entry);
|
||||
}
|
||||
|
||||
@@ -1731,7 +1738,7 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
if (!(common->flags & BATADV_TT_CLIENT_TEMP))
|
||||
goto out;
|
||||
if (batadv_tt_global_entry_has_orig(tt_global_entry,
|
||||
- orig_node))
|
||||
+ orig_node, NULL))
|
||||
goto out_remove;
|
||||
batadv_tt_global_del_orig_list(tt_global_entry);
|
||||
goto add_orig_entry;
|
||||
@@ -2880,23 +2887,46 @@ batadv_tt_req_node_new(struct batadv_priv *bat_priv,
|
||||
}
|
||||
|
||||
/**
|
||||
- * batadv_tt_local_valid() - verify that given tt entry is a valid one
|
||||
+ * batadv_tt_local_valid() - verify local tt entry and get flags
|
||||
* @entry_ptr: to be checked local tt entry
|
||||
* @data_ptr: not used but definition required to satisfy the callback prototype
|
||||
+ * @flags: a pointer to store TT flags for this client to
|
||||
+ *
|
||||
+ * Checks the validity of the given local TT entry. If it is, then the provided
|
||||
+ * flags pointer is updated.
|
||||
*
|
||||
* Return: true if the entry is a valid, false otherwise.
|
||||
*/
|
||||
-static bool batadv_tt_local_valid(const void *entry_ptr, const void *data_ptr)
|
||||
+static bool batadv_tt_local_valid(const void *entry_ptr,
|
||||
+ const void *data_ptr,
|
||||
+ u8 *flags)
|
||||
{
|
||||
const struct batadv_tt_common_entry *tt_common_entry = entry_ptr;
|
||||
|
||||
if (tt_common_entry->flags & BATADV_TT_CLIENT_NEW)
|
||||
return false;
|
||||
+
|
||||
+ if (flags)
|
||||
+ *flags = tt_common_entry->flags;
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_tt_global_valid() - verify global tt entry and get flags
|
||||
+ * @entry_ptr: to be checked global tt entry
|
||||
+ * @data_ptr: an orig_node object (may be NULL)
|
||||
+ * @flags: a pointer to store TT flags for this client to
|
||||
+ *
|
||||
+ * Checks the validity of the given global TT entry. If it is, then the provided
|
||||
+ * flags pointer is updated either with the common (summed) TT flags if data_ptr
|
||||
+ * is NULL or the specific, per originator TT flags otherwise.
|
||||
+ *
|
||||
+ * Return: true if the entry is a valid, false otherwise.
|
||||
+ */
|
||||
static bool batadv_tt_global_valid(const void *entry_ptr,
|
||||
- const void *data_ptr)
|
||||
+ const void *data_ptr,
|
||||
+ u8 *flags)
|
||||
{
|
||||
const struct batadv_tt_common_entry *tt_common_entry = entry_ptr;
|
||||
const struct batadv_tt_global_entry *tt_global_entry;
|
||||
@@ -2910,7 +2940,8 @@ static bool batadv_tt_global_valid(const void *entry_ptr,
|
||||
struct batadv_tt_global_entry,
|
||||
common);
|
||||
|
||||
- return batadv_tt_global_entry_has_orig(tt_global_entry, orig_node);
|
||||
+ return batadv_tt_global_entry_has_orig(tt_global_entry, orig_node,
|
||||
+ flags);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2920,25 +2951,34 @@ static bool batadv_tt_global_valid(const void *entry_ptr,
|
||||
* @hash: hash table containing the tt entries
|
||||
* @tt_len: expected tvlv tt data buffer length in number of bytes
|
||||
* @tvlv_buff: pointer to the buffer to fill with the TT data
|
||||
- * @valid_cb: function to filter tt change entries
|
||||
+ * @valid_cb: function to filter tt change entries and to return TT flags
|
||||
* @cb_data: data passed to the filter function as argument
|
||||
+ *
|
||||
+ * Fills the tvlv buff with the tt entries from the specified hash. If valid_cb
|
||||
+ * is not provided then this becomes a no-op.
|
||||
*/
|
||||
static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
|
||||
struct batadv_hashtable *hash,
|
||||
void *tvlv_buff, u16 tt_len,
|
||||
bool (*valid_cb)(const void *,
|
||||
- const void *),
|
||||
+ const void *,
|
||||
+ u8 *flags),
|
||||
void *cb_data)
|
||||
{
|
||||
struct batadv_tt_common_entry *tt_common_entry;
|
||||
struct batadv_tvlv_tt_change *tt_change;
|
||||
struct hlist_head *head;
|
||||
u16 tt_tot, tt_num_entries = 0;
|
||||
+ u8 flags;
|
||||
+ bool ret;
|
||||
u32 i;
|
||||
|
||||
tt_tot = batadv_tt_entries(tt_len);
|
||||
tt_change = (struct batadv_tvlv_tt_change *)tvlv_buff;
|
||||
|
||||
+ if (!valid_cb)
|
||||
+ return;
|
||||
+
|
||||
rcu_read_lock();
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
@@ -2948,11 +2988,12 @@ static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
|
||||
if (tt_tot == tt_num_entries)
|
||||
break;
|
||||
|
||||
- if ((valid_cb) && (!valid_cb(tt_common_entry, cb_data)))
|
||||
+ ret = valid_cb(tt_common_entry, cb_data, &flags);
|
||||
+ if (!ret)
|
||||
continue;
|
||||
|
||||
ether_addr_copy(tt_change->addr, tt_common_entry->addr);
|
||||
- tt_change->flags = tt_common_entry->flags;
|
||||
+ tt_change->flags = flags;
|
||||
tt_change->vid = htons(tt_common_entry->vid);
|
||||
memset(tt_change->reserved, 0,
|
||||
sizeof(tt_change->reserved));
|
|
@ -0,0 +1,69 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 2 Feb 2024 22:49:48 +0100
|
||||
Subject: Revert "batman-adv: Switch to linux/array_size.h"
|
||||
|
||||
The original patch requires Linux 6.7.0 or a mac80211 compat header with this
|
||||
name. But the mac80211 package is currently not providing this header and
|
||||
OpenWrt main is still using older Linux kernel versions for some targets.
|
||||
|
||||
This reverts commit f33d7f724675544a36b24c77f8d4b95d41252ae2.
|
||||
|
||||
--- a/compat-include/linux/array_size.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(6, 7, 0)
|
||||
-#include_next <linux/array_size.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_ARRAY_SIZE_H_ */
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
-#include <linux/array_size.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
@@ -20,6 +19,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/ipv6.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
--- a/net/batman-adv/netlink.c
|
||||
+++ b/net/batman-adv/netlink.c
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "netlink.h"
|
||||
#include "main.h"
|
||||
|
||||
-#include <linux/array_size.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
@@ -21,6 +20,7 @@
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/init.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/minmax.h>
|
|
@ -1,76 +0,0 @@
|
|||
From: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Date: Sat, 12 May 2018 00:23:07 +0800
|
||||
Subject: [PATCH] batman-adv: prevent TT request storms by not sending inconsistent TT TLVLs
|
||||
|
||||
A translation table TVLV changset sent with an OGM consists
|
||||
of a number of headers (one per VLAN) plus the changeset
|
||||
itself (addition and/or deletion of entries).
|
||||
|
||||
The per-VLAN headers are used by OGM recipients for consistency
|
||||
checks. Said consistency check might determine that a full
|
||||
translation table request is needed to restore consistency. If
|
||||
the TT sender adds per-VLAN headers of empty VLANs into the OGM,
|
||||
recipients are led to believe to have reached an inconsistent
|
||||
state and thus request a full table update. The full table does
|
||||
not contain empty VLANs (due to missing entries) the cycle
|
||||
restarts when the next OGM is issued.
|
||||
|
||||
Consequently, when the translation table TVLV headers are
|
||||
composed, empty VLANs are to be excluded.
|
||||
|
||||
Fixes: 21a57f6e7a3b ("batman-adv: make the TT CRC logic VLAN specific")
|
||||
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/e4687b4be274da6180fc15b327419851fb681ec9
|
||||
---
|
||||
net/batman-adv/translation-table.c | 15 ++++++++++++---
|
||||
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 23f9c212ab1e27be429645a85f7b5d6a02585de9..3986551397caa5ffb6ba7338eeb4769c8b8f99fb 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -931,15 +931,20 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
struct batadv_tvlv_tt_vlan_data *tt_vlan;
|
||||
struct batadv_softif_vlan *vlan;
|
||||
u16 num_vlan = 0;
|
||||
- u16 num_entries = 0;
|
||||
+ u16 vlan_entries = 0;
|
||||
+ u16 total_entries = 0;
|
||||
u16 tvlv_len;
|
||||
u8 *tt_change_ptr;
|
||||
int change_offset;
|
||||
|
||||
spin_lock_bh(&bat_priv->softif_vlan_list_lock);
|
||||
hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
||||
+ vlan_entries = atomic_read(&vlan->tt.num_entries);
|
||||
+ if (vlan_entries < 1)
|
||||
+ continue;
|
||||
+
|
||||
num_vlan++;
|
||||
- num_entries += atomic_read(&vlan->tt.num_entries);
|
||||
+ total_entries += vlan_entries;
|
||||
}
|
||||
|
||||
change_offset = sizeof(**tt_data);
|
||||
@@ -947,7 +952,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
|
||||
/* if tt_len is negative, allocate the space needed by the full table */
|
||||
if (*tt_len < 0)
|
||||
- *tt_len = batadv_tt_len(num_entries);
|
||||
+ *tt_len = batadv_tt_len(total_entries);
|
||||
|
||||
tvlv_len = *tt_len;
|
||||
tvlv_len += change_offset;
|
||||
@@ -964,6 +969,10 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
||||
|
||||
tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1);
|
||||
hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
|
||||
+ vlan_entries = atomic_read(&vlan->tt.num_entries);
|
||||
+ if (vlan_entries < 1)
|
||||
+ continue;
|
||||
+
|
||||
tt_vlan->vid = htons(vlan->vid);
|
||||
tt_vlan->crc = htonl(vlan->tt.crc);
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
From: Antonio Quartulli <a@unstable.cc>
|
||||
Date: Sat, 12 May 2018 03:02:44 +0800
|
||||
Subject: [PATCH] batman-adv: don't implement skb_postpush_rcsum() for linux >=4.4.47
|
||||
|
||||
skb_postpush_rcsum() has been implemented in 4.4.47 therefore
|
||||
our compat code has to be changed to prevent this function to
|
||||
be implemented when using those kernels.
|
||||
|
||||
Signed-off-by: Antonio Quartulli <a@unstable.cc>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/b4693d107e0869bf11956fd2d3be4fd0a8671b46
|
||||
---
|
||||
compat-include/linux/skbuff.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/compat-include/linux/skbuff.h b/compat-include/linux/skbuff.h
|
||||
index 6f73946496ac15f2fdb856357f16e4e2d8a6e6cd..371bb561eecaf605a5c96f9417546f6bb817724d 100644
|
||||
--- a/compat-include/linux/skbuff.h
|
||||
+++ b/compat-include/linux/skbuff.h
|
||||
@@ -77,7 +77,7 @@ struct sk_buff *skb_checksum_trimmed(struct sk_buff *skb,
|
||||
|
||||
#endif /* < KERNEL_VERSION(4, 2, 0) */
|
||||
|
||||
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 47)
|
||||
|
||||
static inline void skb_postpush_rcsum(struct sk_buff *skb,
|
||||
const void *start, unsigned int len)
|
|
@ -1,47 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 2 Jun 2018 17:26:34 +0200
|
||||
Subject: [PATCH] batman-adv: Fix bat_ogm_iv best gw refcnt after netlink dump
|
||||
|
||||
A reference for the best gateway is taken when the list of gateways in the
|
||||
mesh is sent via netlink. This is necessary to check whether the currently
|
||||
dumped entry is the currently selected gateway or not. This information is
|
||||
then transferred as flag BATADV_ATTR_FLAG_BEST.
|
||||
|
||||
After the comparison of the current entry is done,
|
||||
batadv_iv_gw_dump_entry() has to decrease the reference counter again.
|
||||
Otherwise the reference will be held and thus prevents a proper shutdown of
|
||||
the batman-adv interfaces (and some of the interfaces enslaved in it).
|
||||
|
||||
Fixes: fa3228924152 ("batman-adv: add B.A.T.M.A.N. IV bat_gw_dump implementations")
|
||||
Reported-by: Andreas Ziegler <dev@andreas-ziegler.de>
|
||||
Tested-by: Andreas Ziegler <dev@andreas-ziegler.de>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/46360d203c627e71a27d1f8f551c819c7f2353fd
|
||||
---
|
||||
net/batman-adv/bat_iv_ogm.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
||||
index be09a98838252f4f0c23cec0625930cf896cd0ff..73bf6a93a3cf1141a34657bf1284893199e04db9 100644
|
||||
--- a/net/batman-adv/bat_iv_ogm.c
|
||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||
@@ -2732,7 +2732,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
{
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
struct batadv_neigh_node *router;
|
||||
- struct batadv_gw_node *curr_gw;
|
||||
+ struct batadv_gw_node *curr_gw = NULL;
|
||||
int ret = 0;
|
||||
void *hdr;
|
||||
|
||||
@@ -2780,6 +2780,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
+ if (curr_gw)
|
||||
+ batadv_gw_node_put(curr_gw);
|
||||
if (router_ifinfo)
|
||||
batadv_neigh_ifinfo_put(router_ifinfo);
|
||||
if (router)
|
|
@ -1,45 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 2 Jun 2018 17:26:35 +0200
|
||||
Subject: [PATCH] batman-adv: Fix bat_v best gw refcnt after netlink dump
|
||||
|
||||
A reference for the best gateway is taken when the list of gateways in the
|
||||
mesh is sent via netlink. This is necessary to check whether the currently
|
||||
dumped entry is the currently selected gateway or not. This information is
|
||||
then transferred as flag BATADV_ATTR_FLAG_BEST.
|
||||
|
||||
After the comparison of the current entry is done,
|
||||
batadv_v_gw_dump_entry() has to decrease the reference counter again.
|
||||
Otherwise the reference will be held and thus prevents a proper shutdown of
|
||||
the batman-adv interfaces (and some of the interfaces enslaved in it).
|
||||
|
||||
Fixes: 15315a94ad98 ("batman-adv: add B.A.T.M.A.N. V bat_gw_dump implementations")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/2b422b5808183d1084b450b89d9a085a13dd6d2c
|
||||
---
|
||||
net/batman-adv/bat_v.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
|
||||
index ec93337ee2597738e46b87dd72724d5becf3f48e..6baec4e68898c6e992e7522d2ee8c78ce62a1b08 100644
|
||||
--- a/net/batman-adv/bat_v.c
|
||||
+++ b/net/batman-adv/bat_v.c
|
||||
@@ -927,7 +927,7 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
{
|
||||
struct batadv_neigh_ifinfo *router_ifinfo = NULL;
|
||||
struct batadv_neigh_node *router;
|
||||
- struct batadv_gw_node *curr_gw;
|
||||
+ struct batadv_gw_node *curr_gw = NULL;
|
||||
int ret = 0;
|
||||
void *hdr;
|
||||
|
||||
@@ -995,6 +995,8 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
+ if (curr_gw)
|
||||
+ batadv_gw_node_put(curr_gw);
|
||||
if (router_ifinfo)
|
||||
batadv_neigh_ifinfo_put(router_ifinfo);
|
||||
if (router)
|
|
@ -1,111 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 1 Jun 2018 19:24:23 +0200
|
||||
Subject: [PATCH] batman-adv: Fix debugfs path for renamed hardif
|
||||
|
||||
batman-adv is creating special debugfs directories in the init
|
||||
net_namespace for each valid hard-interface (net_device). But it is
|
||||
possible to rename a net_device to a completely different name then the
|
||||
original one.
|
||||
|
||||
It can therefore happen that a user registers a new net_device which gets
|
||||
the name "wlan0" assigned by default. batman-adv is also adding a new
|
||||
directory under $debugfs/batman-adv/ with the name "wlan0".
|
||||
|
||||
The user then decides to rename this device to "wl_pri" and registers a
|
||||
different device. The kernel may now decide to use the name "wlan0" again
|
||||
for this new device. batman-adv will detect it as a valid net_device and
|
||||
tries to create a directory with the name "wlan0" under
|
||||
$debugfs/batman-adv/. But there already exists one with this name under
|
||||
this path and thus this fails. batman-adv will detect a problem and
|
||||
rollback the registering of this device.
|
||||
|
||||
batman-adv must therefore take care of renaming the debugfs directories
|
||||
for hard-interfaces whenever it detects such a net_device rename.
|
||||
|
||||
Fixes: 3c926a01c8e8 ("batman-adv: add debugfs structure for information per interface")
|
||||
Reported-by: John Soros <sorosj@gmail.com>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/127086f503f6495518b95455efebee33d328f335
|
||||
---
|
||||
net/batman-adv/debugfs.c | 20 ++++++++++++++++++++
|
||||
net/batman-adv/debugfs.h | 6 ++++++
|
||||
net/batman-adv/hard-interface.c | 3 +++
|
||||
3 files changed, 29 insertions(+)
|
||||
|
||||
diff --git a/net/batman-adv/debugfs.c b/net/batman-adv/debugfs.c
|
||||
index 4229b01ac7b54008e023df0ed6546a6d541498ba..7e5de7b9f6d53b846cebfa95bf694a20c640b2d6 100644
|
||||
--- a/net/batman-adv/debugfs.c
|
||||
+++ b/net/batman-adv/debugfs.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "debugfs.h"
|
||||
#include "main.h"
|
||||
|
||||
+#include <linux/dcache.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
@@ -343,6 +344,25 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_debugfs_rename_hardif() - Fix debugfs path for renamed hardif
|
||||
+ * @hard_iface: hard interface which was renamed
|
||||
+ */
|
||||
+void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
|
||||
+{
|
||||
+ const char *name = hard_iface->net_dev->name;
|
||||
+ struct dentry *dir;
|
||||
+ struct dentry *d;
|
||||
+
|
||||
+ dir = hard_iface->debug_dir;
|
||||
+ if (!dir)
|
||||
+ return;
|
||||
+
|
||||
+ d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
|
||||
+ if (!d)
|
||||
+ pr_err("Can't rename debugfs dir to %s\n", name);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* batadv_debugfs_del_hardif() - delete the base directory for a hard interface
|
||||
* in debugfs.
|
||||
diff --git a/net/batman-adv/debugfs.h b/net/batman-adv/debugfs.h
|
||||
index 37b069698b04b369e68e4e8a31c3ac01575b0178..8538a7a75e937f50f8efdbf2fe879b4ac8dafadb 100644
|
||||
--- a/net/batman-adv/debugfs.h
|
||||
+++ b/net/batman-adv/debugfs.h
|
||||
@@ -32,6 +32,7 @@ void batadv_debugfs_destroy(void);
|
||||
int batadv_debugfs_add_meshif(struct net_device *dev);
|
||||
void batadv_debugfs_del_meshif(struct net_device *dev);
|
||||
int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface);
|
||||
+void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface);
|
||||
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface);
|
||||
|
||||
#else
|
||||
@@ -59,6 +60,11 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static inline
|
||||
+void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
static inline
|
||||
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
||||
index c405d15befd60bdabf9f50813c3bee446238d539..dc2763b1110727cc5dee62d555dd7c7b50f3b463 100644
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -1051,6 +1051,9 @@ static int batadv_hard_if_event(struct notifier_block *this,
|
||||
if (batadv_is_wifi_hardif(hard_iface))
|
||||
hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
|
||||
break;
|
||||
+ case NETDEV_CHANGENAME:
|
||||
+ batadv_debugfs_rename_hardif(hard_iface);
|
||||
+ break;
|
||||
default:
|
||||
break;
|
||||
}
|
|
@ -1,139 +0,0 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 1 Jun 2018 19:24:24 +0200
|
||||
Subject: [PATCH] batman-adv: Fix debugfs path for renamed softif
|
||||
|
||||
batman-adv is creating special debugfs directories in the init
|
||||
net_namespace for each created soft-interface (batadv net_device). But it
|
||||
is possible to rename a net_device to a completely different name then the
|
||||
original one.
|
||||
|
||||
It can therefore happen that a user registers a new batadv net_device with
|
||||
the name "bat0". batman-adv is then also adding a new directory under
|
||||
$debugfs/batman-adv/ with the name "wlan0".
|
||||
|
||||
The user then decides to rename this device to "bat1" and registers a
|
||||
different batadv device with the name "bat0". batman-adv will then try to
|
||||
create a directory with the name "bat0" under $debugfs/batman-adv/ again.
|
||||
But there already exists one with this name under this path and thus this
|
||||
fails. batman-adv will detect a problem and rollback the registering of
|
||||
this device.
|
||||
|
||||
batman-adv must therefore take care of renaming the debugfs directories for
|
||||
soft-interfaces whenever it detects such a net_device rename.
|
||||
|
||||
Fixes: 230202d4b530 ("batman-adv: Move device for icmp injection to debugfs")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/3f2237bb191cd17654a4d5a5badfd6e7379c4b37
|
||||
---
|
||||
net/batman-adv/debugfs.c | 20 +++++++++++++++++++
|
||||
net/batman-adv/debugfs.h | 5 +++++
|
||||
net/batman-adv/hard-interface.c | 34 +++++++++++++++++++++++++++------
|
||||
3 files changed, 53 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/net/batman-adv/debugfs.c b/net/batman-adv/debugfs.c
|
||||
index 7e5de7b9f6d53b846cebfa95bf694a20c640b2d6..87479c60670ebfbe2ad3df17130f1289d657df7b 100644
|
||||
--- a/net/batman-adv/debugfs.c
|
||||
+++ b/net/batman-adv/debugfs.c
|
||||
@@ -433,6 +433,26 @@ int batadv_debugfs_add_meshif(struct net_device *dev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_debugfs_rename_meshif() - Fix debugfs path for renamed softif
|
||||
+ * @dev: net_device which was renamed
|
||||
+ */
|
||||
+void batadv_debugfs_rename_meshif(struct net_device *dev)
|
||||
+{
|
||||
+ struct batadv_priv *bat_priv = netdev_priv(dev);
|
||||
+ const char *name = dev->name;
|
||||
+ struct dentry *dir;
|
||||
+ struct dentry *d;
|
||||
+
|
||||
+ dir = bat_priv->debug_dir;
|
||||
+ if (!dir)
|
||||
+ return;
|
||||
+
|
||||
+ d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
|
||||
+ if (!d)
|
||||
+ pr_err("Can't rename debugfs dir to %s\n", name);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* batadv_debugfs_del_meshif() - Remove interface dependent debugfs entries
|
||||
* @dev: netdev struct of the soft interface
|
||||
diff --git a/net/batman-adv/debugfs.h b/net/batman-adv/debugfs.h
|
||||
index 8538a7a75e937f50f8efdbf2fe879b4ac8dafadb..08a592ffbee5203ac4994fc49bf9c187c2e66f8e 100644
|
||||
--- a/net/batman-adv/debugfs.h
|
||||
+++ b/net/batman-adv/debugfs.h
|
||||
@@ -30,6 +30,7 @@ struct net_device;
|
||||
void batadv_debugfs_init(void);
|
||||
void batadv_debugfs_destroy(void);
|
||||
int batadv_debugfs_add_meshif(struct net_device *dev);
|
||||
+void batadv_debugfs_rename_meshif(struct net_device *dev);
|
||||
void batadv_debugfs_del_meshif(struct net_device *dev);
|
||||
int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface);
|
||||
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface);
|
||||
@@ -50,6 +51,10 @@ static inline int batadv_debugfs_add_meshif(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static inline void batadv_debugfs_rename_meshif(struct net_device *dev)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
static inline void batadv_debugfs_del_meshif(struct net_device *dev)
|
||||
{
|
||||
}
|
||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
||||
index dc2763b1110727cc5dee62d555dd7c7b50f3b463..2f0d42f2f913e74cf10c0c6ce89320434994cac5 100644
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -989,6 +989,32 @@ void batadv_hardif_remove_interfaces(void)
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * batadv_hard_if_event_softif() - Handle events for soft interfaces
|
||||
+ * @event: NETDEV_* event to handle
|
||||
+ * @net_dev: net_device which generated an event
|
||||
+ *
|
||||
+ * Return: NOTIFY_* result
|
||||
+ */
|
||||
+static int batadv_hard_if_event_softif(unsigned long event,
|
||||
+ struct net_device *net_dev)
|
||||
+{
|
||||
+ struct batadv_priv *bat_priv;
|
||||
+
|
||||
+ switch (event) {
|
||||
+ case NETDEV_REGISTER:
|
||||
+ batadv_sysfs_add_meshif(net_dev);
|
||||
+ bat_priv = netdev_priv(net_dev);
|
||||
+ batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
|
||||
+ break;
|
||||
+ case NETDEV_CHANGENAME:
|
||||
+ batadv_debugfs_rename_meshif(net_dev);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return NOTIFY_DONE;
|
||||
+}
|
||||
+
|
||||
static int batadv_hard_if_event(struct notifier_block *this,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
@@ -997,12 +1023,8 @@ static int batadv_hard_if_event(struct notifier_block *this,
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
struct batadv_priv *bat_priv;
|
||||
|
||||
- if (batadv_softif_is_valid(net_dev) && event == NETDEV_REGISTER) {
|
||||
- batadv_sysfs_add_meshif(net_dev);
|
||||
- bat_priv = netdev_priv(net_dev);
|
||||
- batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
|
||||
- return NOTIFY_DONE;
|
||||
- }
|
||||
+ if (batadv_softif_is_valid(net_dev))
|
||||
+ return batadv_hard_if_event_softif(event, net_dev);
|
||||
|
||||
hard_iface = batadv_hardif_get_by_netdev(net_dev);
|
||||
if (!hard_iface && (event == NETDEV_REGISTER ||
|
|
@ -1,37 +0,0 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Thu, 7 Jun 2018 00:46:23 +0200
|
||||
Subject: [PATCH] batman-adv: Avoid storing non-TT-sync flags on singular entries too
|
||||
|
||||
Since commit 382d020fe3fa ("batman-adv: fix TT sync flag inconsistencies")
|
||||
TT sync flags and TT non-sync'd flags are supposed to be stored
|
||||
separately.
|
||||
|
||||
The previous patch missed to apply this separation on a TT entry with
|
||||
only a single TT orig entry.
|
||||
|
||||
This is a minor fix because with only a single TT orig entry the DDoS
|
||||
issue the former patch solves does not apply.
|
||||
|
||||
Fixes: 382d020fe3fa ("batman-adv: fix TT sync flag inconsistencies")
|
||||
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/beb6246b2339852b6a429ae9259a8eb30a685041
|
||||
---
|
||||
net/batman-adv/translation-table.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 3986551397caa5ffb6ba7338eeb4769c8b8f99fb..61ce300091f328fd78dafa5c4fd09f6cf924b025 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -1705,7 +1705,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
ether_addr_copy(common->addr, tt_addr);
|
||||
common->vid = vid;
|
||||
|
||||
- common->flags = flags;
|
||||
+ common->flags = flags & (~BATADV_TT_SYNC_MASK);
|
||||
+
|
||||
tt_global_entry->roam_at = 0;
|
||||
/* node must store current time in case of roaming. This is
|
||||
* needed to purge this entry out on timeout (if nobody claims
|
|
@ -1,46 +0,0 @@
|
|||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Date: Thu, 7 Jun 2018 00:46:24 +0200
|
||||
Subject: [PATCH] batman-adv: Fix multicast TT issues with bogus ROAM flags
|
||||
|
||||
When a (broken) node wrongly sends multicast TT entries with a ROAM
|
||||
flag then this causes any receiving node to drop all entries for the
|
||||
same multicast MAC address announced by other nodes, leading to
|
||||
packet loss.
|
||||
|
||||
Fix this DoS vector by only storing TT sync flags. For multicast TT
|
||||
non-sync'ing flag bits like ROAM are unused so far anyway.
|
||||
|
||||
Fixes: 405cc1e5a81e ("batman-adv: Modified forwarding behaviour for multicast packets")
|
||||
Reported-by: Leonardo Mörlein <me@irrelefant.net>
|
||||
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/c7054ffae0c3b08bb4bef3cffee1e0a543e14096
|
||||
---
|
||||
net/batman-adv/translation-table.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
||||
index 61ce300091f328fd78dafa5c4fd09f6cf924b025..12a2b7d21376721d15c6a31f3e794e4270d74b5c 100644
|
||||
--- a/net/batman-adv/translation-table.c
|
||||
+++ b/net/batman-adv/translation-table.c
|
||||
@@ -1705,7 +1705,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
ether_addr_copy(common->addr, tt_addr);
|
||||
common->vid = vid;
|
||||
|
||||
- common->flags = flags & (~BATADV_TT_SYNC_MASK);
|
||||
+ if (!is_multicast_ether_addr(common->addr))
|
||||
+ common->flags = flags & (~BATADV_TT_SYNC_MASK);
|
||||
|
||||
tt_global_entry->roam_at = 0;
|
||||
/* node must store current time in case of roaming. This is
|
||||
@@ -1769,7 +1770,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
||||
* TT_CLIENT_TEMP, therefore they have to be copied in the
|
||||
* client entry
|
||||
*/
|
||||
- common->flags |= flags & (~BATADV_TT_SYNC_MASK);
|
||||
+ if (!is_multicast_ether_addr(common->addr))
|
||||
+ common->flags |= flags & (~BATADV_TT_SYNC_MASK);
|
||||
|
||||
/* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
|
||||
* one originator left in the list and we previously received a
|
121
batman-adv/src/compat-hacks.h
Normal file
121
batman-adv/src/compat-hacks.h
Normal file
|
@ -0,0 +1,121 @@
|
|||
/* Please avoid adding hacks here - instead add it to mac80211/backports.git */
|
||||
|
||||
#undef CONFIG_MODULE_STRIPPED
|
||||
|
||||
#include <linux/version.h> /* LINUX_VERSION_CODE */
|
||||
#include <linux/types.h>
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(6, 0, 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)
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(6, 0, 0) */
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(6, 2, 0)
|
||||
|
||||
#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()
|
||||
*/
|
||||
static inline struct vlan_ethhdr *skb_vlan_eth_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct vlan_ethhdr *)skb->data;
|
||||
}
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(6, 4, 0) */
|
||||
|
||||
/* <DECLARE_EWMA> */
|
||||
|
||||
#include <linux/version.h>
|
||||
#include_next <linux/average.h>
|
||||
|
||||
#include <linux/bug.h>
|
||||
|
||||
#ifdef DECLARE_EWMA
|
||||
#undef DECLARE_EWMA
|
||||
#endif /* DECLARE_EWMA */
|
||||
|
||||
/*
|
||||
* Exponentially weighted moving average (EWMA)
|
||||
*
|
||||
* This implements a fixed-precision EWMA algorithm, with both the
|
||||
* precision and fall-off coefficient determined at compile-time
|
||||
* and built into the generated helper funtions.
|
||||
*
|
||||
* The first argument to the macro is the name that will be used
|
||||
* for the struct and helper functions.
|
||||
*
|
||||
* The second argument, the precision, expresses how many bits are
|
||||
* used for the fractional part of the fixed-precision values.
|
||||
*
|
||||
* The third argument, the weight reciprocal, determines how the
|
||||
* new values will be weighed vs. the old state, new values will
|
||||
* get weight 1/weight_rcp and old values 1-1/weight_rcp. Note
|
||||
* that this parameter must be a power of two for efficiency.
|
||||
*/
|
||||
|
||||
#define DECLARE_EWMA(name, _precision, _weight_rcp) \
|
||||
struct ewma_##name { \
|
||||
unsigned long internal; \
|
||||
}; \
|
||||
static inline void ewma_##name##_init(struct ewma_##name *e) \
|
||||
{ \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
/* \
|
||||
* Even if you want to feed it just 0/1 you should have \
|
||||
* some bits for the non-fractional part... \
|
||||
*/ \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
e->internal = 0; \
|
||||
} \
|
||||
static inline unsigned long \
|
||||
ewma_##name##_read(struct ewma_##name *e) \
|
||||
{ \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
return e->internal >> (_precision); \
|
||||
} \
|
||||
static inline void ewma_##name##_add(struct ewma_##name *e, \
|
||||
unsigned long val) \
|
||||
{ \
|
||||
unsigned long internal = READ_ONCE(e->internal); \
|
||||
unsigned long weight_rcp = ilog2(_weight_rcp); \
|
||||
unsigned long precision = _precision; \
|
||||
\
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
\
|
||||
WRITE_ONCE(e->internal, internal ? \
|
||||
(((internal << weight_rcp) - internal) + \
|
||||
(val << precision)) >> weight_rcp : \
|
||||
(val << precision)); \
|
||||
}
|
||||
|
||||
/* </DECLARE_EWMA> */
|
|
@ -6,15 +6,14 @@
|
|||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=batmand
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=git://git.open-mesh.org/batmand.git
|
||||
PKG_SOURCE_URL:=https://git.open-mesh.org/batmand.git
|
||||
PKG_REV:=b67a7087b51d7a5e90d27ac39116d1f57257c86e
|
||||
PKG_VERSION:=1440
|
||||
PKG_RELEASE:=0
|
||||
PKG_RELEASE:=1
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
PKG_SOURCE_VERSION:=$(PKG_REV)
|
||||
|
@ -23,19 +22,13 @@ PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
|
|||
PKG_MIRROR_HASH:=ceb8e0e399f79b1b663594fcf9642e1efc40e696a7604daf709c77da9b6ec52f
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
|
||||
|
||||
PKG_EXTRA_CFLAGS=-DDEBUG_MALLOC -DMEMORY_USAGE -DPROFILE_DATA -DREVISION_VERSION=\"\ rv$(PKG_REV)\" -D_GNU_SOURCE
|
||||
|
||||
PKG_KMOD_BUILD_DIR:=$(PKG_BUILD_DIR)/linux/modules
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/batmand/Default
|
||||
define Package/batmand
|
||||
URL:=https://www.open-mesh.org/
|
||||
MAINTAINER:=Corinna "Elektra" Aichele <onelektra@gmx.net>
|
||||
endef
|
||||
|
||||
define Package/batmand
|
||||
$(call Package/batmand/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
|
@ -47,61 +40,16 @@ define Package/batmand/description
|
|||
B.A.T.M.A.N. layer 3 routing daemon
|
||||
endef
|
||||
|
||||
define KernelPackage/batgat
|
||||
$(call Package/batmand/Default)
|
||||
SUBMENU:=Network Support
|
||||
DEPENDS:=+batmand @BROKEN
|
||||
TITLE:=B.A.T.M.A.N. gateway module
|
||||
FILES:=$(PKG_KMOD_BUILD_DIR)/batgat.$(LINUX_KMOD_SUFFIX)
|
||||
AUTOLOAD:=$(call AutoLoad,50,batgat)
|
||||
endef
|
||||
|
||||
|
||||
define KernelPackage/batgat/description
|
||||
Kernel gateway module for B.A.T.M.A.N. for better tunnel performance
|
||||
endef
|
||||
|
||||
MAKE_BATMAND_ARGS += \
|
||||
EXTRA_CFLAGS='$(TARGET_CFLAGS) $(PKG_EXTRA_CFLAGS)' \
|
||||
CCFLAGS="$(TARGET_CFLAGS)" \
|
||||
OFLAGS="$(TARGET_CFLAGS)" \
|
||||
MAKE_FLAGS += \
|
||||
EXTRA_CFLAGS='-DDEBUG_MALLOC -DMEMORY_USAGE -DPROFILE_DATA -DREVISION_VERSION=\"\ rv$(PKG_REV)\" -D_GNU_SOURCE' \
|
||||
REVISION="$(PKG_REV)" \
|
||||
CC="$(TARGET_CC)" \
|
||||
NODEBUG=1 \
|
||||
UNAME="Linux" \
|
||||
INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
|
||||
STRIP="/bin/true" \
|
||||
batmand install
|
||||
|
||||
MAKE_BATGAT_ARGS += \
|
||||
CROSS_COMPILE="$(TARGET_CROSS)" \
|
||||
ARCH="$(LINUX_KARCH)" \
|
||||
PATH="$(TARGET_PATH)" \
|
||||
SUBDIRS="$(PKG_KMOD_BUILD_DIR)" \
|
||||
LINUX_VERSION="$(LINUX_VERSION)" \
|
||||
REVISION="$(PKG_REV)" modules
|
||||
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
ifneq ($(DEVELOPER)$(CONFIG_PACKAGE_batmand),)
|
||||
BUILD_BATMAND := $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_BATMAND_ARGS)
|
||||
endif
|
||||
|
||||
ifneq ($(DEVELOPER)$(CONFIG_PACKAGE_kmod-batgat),)
|
||||
BUILD_BATGAT := $(MAKE) -C "$(LINUX_DIR)" $(MAKE_BATGAT_ARGS)
|
||||
endif
|
||||
|
||||
define Build/Compile
|
||||
$(BUILD_BATMAND)
|
||||
cp $(PKG_KMOD_BUILD_DIR)/Makefile.kbuild $(PKG_KMOD_BUILD_DIR)/Makefile
|
||||
$(BUILD_BATGAT)
|
||||
endef
|
||||
batmand
|
||||
|
||||
define Package/batmand/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/batmand $(1)/usr/sbin/
|
||||
$(INSTALL_BIN) ./files/etc/init.d/batmand $(1)/etc/init.d
|
||||
$(INSTALL_DATA) ./files/etc/config/batmand $(1)/etc/config
|
||||
endef
|
||||
|
@ -111,4 +59,3 @@ define Package/batmand/conffiles
|
|||
endef
|
||||
|
||||
$(eval $(call BuildPackage,batmand))
|
||||
$(eval $(call KernelPackage,batgat))
|
||||
|
|
|
@ -9,4 +9,3 @@ config batmand general
|
|||
option policy_routing_script
|
||||
option disable_client_nat
|
||||
option disable_aggregation
|
||||
|
||||
|
|
|
@ -1,25 +1,42 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
START=90
|
||||
USE_PROCD=1
|
||||
|
||||
start () {
|
||||
interface=$(uci get batmand.general.interface)
|
||||
batmand_start() {
|
||||
local config="$1"
|
||||
local batman_args
|
||||
local interface
|
||||
local hnas
|
||||
local gateway_class
|
||||
local originator_interval
|
||||
local preferred_gateway
|
||||
local routing_class
|
||||
local visualisation_srv
|
||||
local local policy_routing_script
|
||||
local disable_client_nat
|
||||
local disable_aggregation
|
||||
|
||||
[ "$config" = "general" ] || return 1
|
||||
|
||||
config_get interface "$config" interface
|
||||
if [ "$interface" = "" ]; then
|
||||
echo $1 Error, you must specify at least a network interface
|
||||
exit
|
||||
return 1
|
||||
fi
|
||||
hnas=$(uci get batmand.general.hna)
|
||||
gateway_class=$(uci get batmand.general.gateway_class)
|
||||
originator_interval=$(uci get batmand.general.originator_interval)
|
||||
preferred_gateway=$(uci get batmand.general.preferred_gateway)
|
||||
routing_class=$(uci get batmand.general.routing_class)
|
||||
visualisation_srv=$(uci get batmand.general.visualisation_srv)
|
||||
policy_routing_script=$(uci get batmand.general.policy_routing_script)
|
||||
disable_client_nat=$(uci get batmand.general.disable_client_nat)
|
||||
disable_aggregation=$(uci get batmand.general.disable_aggregation)
|
||||
|
||||
config_get hnas "$config" hna
|
||||
config_get gateway_class "$config" gateway_class
|
||||
config_get originator_interval "$config" originator_interval
|
||||
config_get preferred_gateway "$config" preferred_gateway
|
||||
config_get routing_class "$config" routing_class
|
||||
config_get visualisation_srv "$config" visualisation_srv
|
||||
config_get policy_routing_script "$config" policy_routing_script
|
||||
config_get disable_client_nat "$config" disable_client_nat
|
||||
config_get disable_aggregation "$config" disable_aggregation
|
||||
|
||||
batman_args=""
|
||||
|
||||
for hna in $hnas
|
||||
do
|
||||
for hna in $hnas; do
|
||||
batman_args=${batman_args}'-a '$hna' '
|
||||
done
|
||||
|
||||
|
@ -55,12 +72,20 @@ start () {
|
|||
batman_args=${batman_args}'--disable-aggregation '
|
||||
fi
|
||||
|
||||
batman_args=${batman_args}$interface
|
||||
batmand $batman_args >/dev/null 2>&1
|
||||
procd_open_instance "${config}"
|
||||
procd_set_param command /usr/sbin/batmand
|
||||
procd_append_param command --no-detach
|
||||
procd_append_param command ${batman_args}
|
||||
procd_append_param command ${interface}
|
||||
procd_set_param netdev ${interface}
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
stop () {
|
||||
killall batmand
|
||||
start_service() {
|
||||
config_load "batmand"
|
||||
config_foreach batmand_start batmand
|
||||
}
|
||||
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "batmand"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sun, 1 Dec 2013 14:39:00 +0100
|
||||
Subject: Allow one to disable forking to background in debug_mode 0
|
||||
|
||||
---
|
||||
posix/init.c | 19 ++++++++++++++-----
|
||||
1 file changed, 14 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/posix/init.c
|
||||
+++ b/posix/init.c
|
||||
@@ -44,6 +44,7 @@
|
||||
#define IOCSETDEV 1
|
||||
|
||||
int8_t stop;
|
||||
+int no_detach = 0;
|
||||
|
||||
|
||||
|
||||
@@ -159,6 +160,7 @@ void apply_init_args( int argc, char *ar
|
||||
{"purge-timeout", required_argument, 0, 'q'},
|
||||
{"disable-aggregation", no_argument, 0, 'x'},
|
||||
{"disable-client-nat", no_argument, 0, 'z'},
|
||||
+ {"no-detach", no_argument, 0, 'D'},
|
||||
{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" );
|
||||
|
||||
- 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
|
||||
found_args++;
|
||||
break;
|
||||
|
||||
+ case 'D':
|
||||
+ no_detach = 1;
|
||||
+ found_args++;
|
||||
+ break;
|
||||
+
|
||||
case 'h':
|
||||
default:
|
||||
usage();
|
||||
@@ -539,12 +546,14 @@ void apply_init_args( int argc, char *ar
|
||||
/* daemonize */
|
||||
if (debug_level == 0) {
|
||||
|
||||
- if (my_daemon() < 0) {
|
||||
+ if (!no_detach) {
|
||||
+ if (my_daemon() < 0) {
|
||||
|
||||
- printf("Error - can't fork to background: %s\n", strerror(errno));
|
||||
- restore_defaults();
|
||||
- exit(EXIT_FAILURE);
|
||||
+ printf("Error - can't fork to background: %s\n", strerror(errno));
|
||||
+ restore_defaults();
|
||||
+ exit(EXIT_FAILURE);
|
||||
|
||||
+ }
|
||||
}
|
||||
|
||||
openlog("batmand", LOG_PID, LOG_DAEMON);
|
|
@ -1,47 +0,0 @@
|
|||
---
|
||||
batman/linux/modules/gateway.c | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
--- batmand-r1439.orig/linux/modules/gateway.c
|
||||
+++ batmand-r1439/linux/modules/gateway.c
|
||||
@@ -29,6 +29,7 @@ static struct class *batman_class;
|
||||
static int batgat_open(struct inode *inode, struct file *filp);
|
||||
static int batgat_release(struct inode *inode, struct file *file);
|
||||
static int batgat_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg );
|
||||
+static long batgat_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned long arg );
|
||||
|
||||
|
||||
static void udp_data_ready(struct sock *sk, int len);
|
||||
@@ -53,7 +54,11 @@ static int proc_clients_read(char *buf,
|
||||
static struct file_operations fops = {
|
||||
.open = batgat_open,
|
||||
.release = batgat_release,
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
|
||||
+ .unlocked_ioctl = batgat_ioctl_unlocked,
|
||||
+#else
|
||||
.ioctl = batgat_ioctl,
|
||||
+#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -166,6 +171,20 @@ static int batgat_release(struct inode *
|
||||
}
|
||||
|
||||
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
|
||||
+#include <linux/smp_lock.h>
|
||||
+static long batgat_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned long arg )
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ lock_kernel();
|
||||
+ ret = batgat_ioctl(file->f_path.dentry->d_inode, file, cmd, arg);
|
||||
+ unlock_kernel();
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static int batgat_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg )
|
||||
{
|
||||
uint8_t tmp_ip[4];
|
|
@ -1,342 +0,0 @@
|
|||
<!--
|
||||
---------------------------------------------------------------------
|
||||
(C) 2014 - 2017 Eloi Carbo <eloicaso@openmailbox.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
---------------------------------------------------------------------
|
||||
-->
|
||||
|
||||
# LUCI Bird{4|6} v0.3 Packages Documentation
|
||||
* BIRD Daemon's official documentation: http://bird.network.cz/?get_doc
|
||||
* Extra documentation in English & Catalan: https://github.com/eloicaso/bgp-bmx6-bird-docn
|
||||
* If you want to add new options to bird*-openwrt packages add a pull request or issue in: https://github.com/eloicaso/bird-openwrt
|
||||
|
||||
> *Clarification*: This documentation covers luci-app-bird{4|6} as both are completely aligned and only those IPv4/6-specific options will be covered separately.
|
||||
>
|
||||
> Bird v1.6.3 has been used to test luci-app-bird{4|6}. Using newer versions of the Daemon might change the behaviour or messages documented here. Create an issue or pull request if you spot any mismatch in this document to address it.
|
||||
|
||||
# Table of contents
|
||||
1. [Status Page](#status)
|
||||
2. [Log Page](#log)
|
||||
3. [Overview Page](#overview)
|
||||
4. [General Protocols Page](#general)
|
||||
5. [BGP Portocol](#bgp)
|
||||
6. [Filters and Functions](#fnf)
|
||||
|
||||
|
||||
## Status Page <a name="status"></a>
|
||||
The Status Page allows you to Start, Stop and restart the service as well as to check the result of these operations.
|
||||
|
||||
#### Components
|
||||
- *Button* **Start**: Execute a Bird Daemon Service Start call. Operation's result is shown in the *Service Status* Text Box.
|
||||
- *Button* **Stop**: Execute a Bird Daemon Service Stop call. Operation's result is shown in the *Service Status* Text Box.
|
||||
- *Button* **Restart**: Execute a Bird Daemon Service Restart call. Operation's result is shown in the *Service Status* Text Box.
|
||||
- *Text Box* **Service Status**: Executes a Bird Daemon Service Status call. Operation's result is shown as plain text.
|
||||
|
||||
#### Service Status common messages
|
||||
* *Running*: Service is running with no issues
|
||||
* *Already started*: You have clicked *Start* when the service was already running. No action taken.
|
||||
* *Stopped*: You have clicked *Stop* when the service was running. Service has been stopped.
|
||||
* *Already stopped*: You have clicked *Stop* when the service was already stopped. No action taken.
|
||||
* *Stopped ... Started*: You have pressed *Restart* when the service was running. The service has been restarted.
|
||||
* *Already stopped .. Started*: You have pressed *Restart* when the service was already stopped. The service has been started.
|
||||
* *Failed - ERROR MESSAGE*: There is a configuration or validation issue that prevents Bird to start. Check the *Error Message* and the Log Page to debug it and fix it.
|
||||
|
||||
#### Error Examples
|
||||
1. Validation issues:
|
||||
`bird4: Failed - bird: /tmp/bird4.conf, line 65: syntax error`
|
||||
|
||||
If we check the file shown: `/tmp/bird4.conf` :
|
||||
```
|
||||
protocol bgp BGPExample {
|
||||
import Filter NonExistingFilter;
|
||||
}
|
||||
```
|
||||
We have entered an invalid (non-existent in this case) filter name. In order to fix this, write the correct Filter Name or remove its reference from the BGP Protocol Configuration Page and start the service again.
|
||||
|
||||
2. Configuration issues:
|
||||
` bird4: Failed - bird: /tmp/bird4.conf, line 76: Only internal neighbor can be RR client`
|
||||
|
||||
In this case, it is easy to spot that we have incorrectly selected the *Route Reflector Server* option incorrectly and we only need to untick it and start the service to solve it.
|
||||
|
||||
Usuarlly, any configuration issue will be flagged appropiately through Bird service messages. However, in the event where you do not have enough information, please look for advice in either Bird's documentation or in the affected Protocol's documentation.
|
||||
|
||||
## Log Page <a name="log"></a>
|
||||
The Log Page shows the last 30 lines of the configured Bird Daemon Log file. This information is automatically refreshed each second.
|
||||
|
||||
#### Components
|
||||
- *Text Area* **Log File**: 30 lines text area that shows the Log file information
|
||||
- *Text* **Using Log File** and **File Size**: The first line of the Text Area is fixed and shows the file being used and its current size. **Please**, check this size information regularly to avoid letting the Log information overflow your Storage as it will make your service stop and prevent it to start until you fix it.
|
||||
- *Text* **File Contents**: The next 30 lines show information about the events and debug information happening live. Main information are state changes and *info, warning, fatal or trace*. If you hit any issue starting the service, you can investigate the issue from this page.
|
||||
|
||||
|
||||
## Overview Page <a name="overview"></a>
|
||||
The Overview Page includes the configuration of basic Bird Daemon settings such as UCI usage, Routing Tables definition and Global Options.
|
||||
|
||||
### Bird File Settings (UCI Usage)
|
||||
This section enables/disables the use of this package's capabilities.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Use UCI configuration**:
|
||||
- If enabled, the package will use the UCI configuration generated by this web settings and translate it into a Bird Daemon configuration file.
|
||||
- If disabled, the package will do nothing and you will have to manually edit a Bird Daemon configuration file.
|
||||
- *Text Box* **UCI File**: This file specifies the selected location for the translated Bird Daemon configuration file. Do not leave blank.
|
||||
|
||||
### Tables Configuration
|
||||
This section allows you to set the Routing tables that will be used later in the different protocols. You can *Add* as many instances as required.
|
||||
|
||||
#### Components
|
||||
- *Text Box* **Table Name**: Set an unique (meaningful) routing table name.
|
||||
> In some instances or protocols, you may want or be required to set a specific ID to a Table. In order to do this, please, follow this -right now- [manual procedure](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md).
|
||||
|
||||
|
||||
### Global Options
|
||||
This section allows you to configure basic Bird Daemon settings.
|
||||
|
||||
#### Components
|
||||
- *Text Box* **Router ID**: Set the Identificator to be used in this Bird Daemon instance. This option must be:
|
||||
> IPv4, this option will be set by default to the lowest IP Address configured. Otherwise, the identificator must be an IPv4 address.
|
||||
|
||||
> IPv6, this option is **mandatory** and must be a HEX value (Hexadecimal). This package (bird6-uci), provides the HEX value *0xCAFEBABE* as a default value to avoid initial crashes.
|
||||
|
||||
- *Text Box* **Log File**: Set the Name and Location of the Log file. By default, its location will be /tmp/bird{4|6}.log as the non-persistent partition.
|
||||
- *Mutiple Value* **Log**: Set which elements you want Bird Daemon to log in the configured file.
|
||||
> *Caution I*: if you select *All*, the other selected options will have no validity as, by definition, they are already included.
|
||||
> *Caution II*: Take into consideration that the more elements Bird has to log, the more space you will require to store this log file. If your storage is full, Bird will fail to start until you free some space to store its Log data.
|
||||
|
||||
- *Multi Value* **Debug**: Set which Debug information elements you want Bird Daemon to log in the configured file.
|
||||
> *Caution I*: if you select *All*, the other selected options will have no validity as, by definition, they are already included.
|
||||
> *Caution II*: Take into consideration that the more elements Bird has to log, the more space you will require to store this log file (this is particularly critical in Debug as it can log MegaBytes of data quickly). If your storage is full, Bird will fail to start until you free some space to store its Log data.
|
||||
|
||||
## General Protocols <a name="general"></a>
|
||||
The General Protocols Page includes the configuration of key OS Protocols or Network Basic Settings such as Kernel, Device or Static Routes.
|
||||
|
||||
### Kernel Options
|
||||
This section allows you to set all the Kernel Protocols required to do Networking.
|
||||
> The first Kernel instance is the Primary one and must be left by default for OS usage. Do not set its "Table" or "Kernel Table" options.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *List Value* **Table**: Select the Routing Table to be used in the Kernel Protocol instance.
|
||||
> The Primary Kernel Protocol cannot be empty.
|
||||
|
||||
- *Text Box* **Import**: Set if the protocol must import routes and which ones.
|
||||
- **all**: Accept all the incoming routes.
|
||||
- **none**: Reject all the incoming routes.
|
||||
- **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
|
||||
- *Text Box* **Export**: Set if the protocol must export routes and which ones.
|
||||
- **all**: Accept all the outgoing routes.
|
||||
- **none**: Reject all the outgoing routes.
|
||||
- **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
|
||||
- *Text Box* **Scan time**: Set the time between Kernel Routing Table scans. This value must be the same for all the Kernel Protocols.
|
||||
- *Check Box* **Learn**: Set this option to allow the Kernel Protocol to learn Routes form other routing daemons or manually added by an admin.
|
||||
- *Check Box* **Persist**: Set this option to store the routes learnt in the table until it is removed. Unset this option if you want to clean the routes on the fly.
|
||||
- *Text Box* **Kernel Table**: Select the specific exitisting Routing Table for this Protocol instance.
|
||||
> The Kernel Table ID must be previously set by the administrator during the Routing Table configuration. Currently (v0.3), this process is done manually. Please, follow this [manual procedure](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md).
|
||||
|
||||
### Device Options
|
||||
This section allows you to set all the Device *Protocol*. The Device *Protocol* is just a mechanism to bound the interfaces and Kernel tables in order to get its information.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *Text Box* **Scan Time**: Set the time between Kernel Routing Table scans. This value must be the same for all the Kernel Protocols.
|
||||
|
||||
### Static Options
|
||||
This section allows you to create the container for Routes definition. Static protocol instances allows you to manually create Routes that Bird will use and which Routing Table should hold this information. It also helps to manage routes by marking them (i.e. *Unreachable*, *Blocked*, ...).
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *List Value* **Table**: Select the Routing Table to be used in the Static Protocol instance.
|
||||
|
||||
### Routes
|
||||
This section allows to set which Routes will be set in a specific Static Protocol and how these should be handled.
|
||||
|
||||
#### Components
|
||||
- *List Value* **Route Instance**: Set which Static Protocol instance will contain this route infromation.
|
||||
> Routes require an existing Static Protocol as parent.
|
||||
|
||||
- *Text Box* **Route Prefix**: Set the Route instance to be defined.
|
||||
> Examples of routes are:. 10.0.0.0/8 (IPv4) or 2001:DB8:3000:0/16 (IPv6)
|
||||
|
||||
- *List Value* **Type Of Route**: This value will set the conditional settings. Options are:
|
||||
- **Router**: Classic routes going through specific IP Addresses.
|
||||
- *Text Box* **Via**: Set the target IP Address to be used for Routing
|
||||
> I.e. 10.0.0.0/8 via 10.1.1.1
|
||||
|
||||
- **MultiPath**: Multiple paths Route.
|
||||
- *List of Text Box* **Via**: Set the target Route to be used for Routing. This option allows several instances of **Via** elements.
|
||||
> I.e. 10.0.0.0/8 via 10.1.1.1
|
||||
> via 10.1.1.100
|
||||
> via 10.1.1.200
|
||||
|
||||
- **Special**: Special treated Route.
|
||||
- *Text Box* **Attribute**: Block special consideration of routes.
|
||||
> **unreachable**: Return route cannot be reached.
|
||||
> **prohibit**: Return route has been administratively blocked.
|
||||
> **blackhole**: Silently drop the route.
|
||||
|
||||
- **Iface**: Classic routes going through specific interfaces.
|
||||
- *List Value* **Interface**: Select the target interface to route.
|
||||
|
||||
- **Recursive**: Set a static recursive route. Its next hope will depen on the table's lookup for each target IP Address.
|
||||
|
||||
### Direct Protocol
|
||||
This section allows to set pools of *directly* connected interfaces. Direct Protocol instances will make use of the *Device* Protocol in order to generate routes between the selected interfaces.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *Text Box* **Interfaces**: This is the key option allowing to *tie* the interfaces and create direct routes between different sides. Enter each interface's name you want to couple.
|
||||
- If you leave this option empty, it will tie all the interfaces together.
|
||||
- Each interface must be quoted: i.e. `"eth0"`
|
||||
- Several interfaces must be entered comma-separated: i.e. `"eth0", "wlan0"`
|
||||
- If you want to restrict this to specific interfaces, you have to enter them using its name or a pattern: i.e. All the ethernet interfaces `"eth*"`
|
||||
- You are allowed to **exclude** specific interfaces by adding `-` before the interface name: i.e. Exclude all the Wireless interfaces `"-wlan*"`
|
||||
> Example: All the wired interfaces (eth and em) but exclude all the wireless and point-to-point interfaces: `"eth*", "em*", "-wlan*", "-ptp_*"`
|
||||
|
||||
> Current version 0.3 requires you to enter each interface you want to **include** or **exclude** manually. This will be enhanced in future versions.
|
||||
|
||||
### Pipe Protocol
|
||||
This section allows to set instances of *linked* routing tables. Each instance will allow you to share the routes from a primary table to a secondary one.
|
||||
|
||||
#### Components
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *List Value* **Table**: Select the **Primary** Routing Table to be used.
|
||||
- *List Value* **Peer Table**: Select the **Secondary** Routing Table to be used.
|
||||
- *List Value* **Mode**: Set if you want to work in *transparent* or *opaque* mode.
|
||||
- **Transparent**: Retransmits all the routes and its attributes. Therefore, you get two identical routing tables. This is the default behaviour.
|
||||
- **Opaque**: This mode is not recommended for new configurations and it is not recommended. Tables will only share the optimal routes and overwrite route's attributes with new ones (Pipe).
|
||||
- *Text Box* **Import**: Set if the protocol must import routes and which ones.
|
||||
- **all**: Accept all the incoming routes.
|
||||
- **none**: Reject all the incoming routes.
|
||||
- **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
|
||||
- *Text Box* **Export**: Set if the protocol must export routes and which ones.
|
||||
- **all**: Accept all the outgoing routes.
|
||||
- **none**: Reject all the outgoing routes.
|
||||
- **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
|
||||
|
||||
|
||||
## BGP Protocol<a name="bgp"></a>
|
||||
The BGP Protocol Page includes all the settings to configure BGP Templates and BGP instances.
|
||||
BGP Templates and Instances share most of the options as Templates are meant to diminish the requirements on Instances.
|
||||
> An extreme example case could be the Template holding all the options and the Instance only referencing to the Template as the only option..
|
||||
|
||||
### BGP Templates
|
||||
This section allows you to set BGP Templates, which are commonly used BGP configuration*themes* to reduce the number of repeated settings while adding BGP Instances.
|
||||
|
||||
### BGP Instances
|
||||
This section allows you to set BGP Instances. The Instances are the ones starting the BGP Protocol and can, or not, use a BGP Template to re-use the common properties.
|
||||
> **Caution**: Any duplicated option between an Instance and a Template will resolve by using the Instance option and dismissing the Template one. **Instance** > *Template*.
|
||||
|
||||
#### BGP Instance Specific Option
|
||||
- *List Value* **Templates**: Set the BGP Template that will feed the instance. Any option in the Template will be inherited.
|
||||
|
||||
#### Common Options
|
||||
- *Check Box* **Disabled**: Set this Check Box if you do not want to configure and use this Protocol.
|
||||
- *Text Area* **Description**: Set a descriptive text to identify this protocol and what it does.
|
||||
- *Text Box* **Import**: Set if the protocol must import routes and which ones.
|
||||
- **all**: Accept all the incoming routes.
|
||||
- **none**: Reject all the incoming routes.
|
||||
- **filter filterName**: Call an existing filter to define which incoming routes will be accepted or rejected.
|
||||
- *Text Box* **Export**: Set if the protocol must export routes and which ones.
|
||||
- **all**: Accept all the outgoing routes.
|
||||
- **none**: Reject all the outgoing routes.
|
||||
- **filter filterName**: Call an existing filter to define which outgoing routes will be accepted or rejected.
|
||||
- *List Value* **Table**: Select the Routing Table to be used.
|
||||
- *List Value* **IGP Table**: Set the IGP Routing Table (Internal BGP). Bird uses the same Routing Table for both External BGP and Internal BGP by default.
|
||||
- *Text Area* **Source Address**: Set the local IP Address. By default the Router ID will be used.
|
||||
- *Text Area* **Local AS**: Set the local BGP Autonomous System ID.
|
||||
- *Text Area* **Local BGP Address**: Set the local BGP Autonomous System IP Address.
|
||||
- *Text Area* **Neighbor IP Address**: Set BGP neighbour's IP Address.
|
||||
- *Text Area* **Neighbor AS**: Set BGP neighbour's Autonomous System ID.
|
||||
- *Check Box* **Next Hop Self**: Overwrite Next Hop cost attributes with its own source address as next hop. Disabled by default as it is only used in some specific instances.
|
||||
- *Check Box* **Next Hop Keep**: Forward the same Next Hop information even in situations where the system would use its own source address instead. Disabled by default.
|
||||
- *Check Box* **Route Reflector Server**: Set if BGP instance must act as a Route Reflector Server and expect neighbours AS to act as clients
|
||||
- *Text Value* **Route Reflector Cluster ID**: Route Reflector service ID to avoid loops. This options is only allowed in the Server (not clients) and it is Router's ID by default.
|
||||
- *Text Box* **Routes Import Limit**: Set the maximum number of routes the protocol will import.
|
||||
- *List Value* **Routes Import Limit Action**: Set the action to apply if the *Routes Import Limit* is exceeded. Options are:
|
||||
- **block**: Block any route exceeding the limit.
|
||||
- **disable**: Stop the protocol.
|
||||
- **warn**: Print Log warnings.
|
||||
- **restart**: Restart the protocol.
|
||||
- *Text Box* **Routes Export Limit**: Set the maximum number of routes the protocol will export.
|
||||
- *List Value* **Routes Export Limit Action**: Set the action to apply if the *Routes Export Limit* is exceeded. Options are:
|
||||
- **block**: Block any route exceeding the limit.
|
||||
- **disable**: Stop BGP protocol.
|
||||
- **warn**: Print Log warnings.
|
||||
- **restart**: Restart BGP protocol.
|
||||
- *Text Box* **Routes Received Limit**: Set the maximum number of shared routes the Protocol must accept and remember (the **number** of imported routes is not affected by this option).
|
||||
- *List Value* **Routes Received Limit Action**: Set the action to apply if the *Routes Received Limit* is exceeded. Options are:
|
||||
- **block**: Block any route exceeding the limit.
|
||||
- **disable**: Stop BGP protocol.
|
||||
- **warn**: Print Log warnings.
|
||||
- **restart**: Restart BGP protocol.
|
||||
|
||||
|
||||
## Filters and Functions<a name="fnf"></a>
|
||||
The Filters and the Functions Page allows you to edit Bird Daemon Filter and Functions files without requiring you to go to command line. Both Pages share the same code base and the only main change is where they are getting the files from. Therefore, and for documentation simplicity sake, both pages will be covered in this section.
|
||||
> From version 0.3 onwards:
|
||||
> The default and supported place to store filter files is under `/etc/bird{4|6}/filters`.
|
||||
> The default and supported place to store function files is under `/etc/bird{4|6}/functions`.
|
||||
|
||||
> Current version 0.3 does not allow changing file names. You will have to change the default filenames through SSH. This will be enhanced in future versions.
|
||||
|
||||
#### Components
|
||||
- *List Value* **Filter Files** / **Function Files**: Set the Filter or Function file to edit from the ones under `/etc/bird{4|6}/filters` / `/etc/bird{4|6}/functions`.
|
||||
> If you want to create a new Filter or Function file, use the **New File** element in the list.
|
||||
|
||||
> The default behaviour is to allow administrators to create new files using this scheme:
|
||||
> */etc/bird{4|6}/filters/filter*-**TIMESTAMP**. *Timestamp* is: YYYYMMDD-HHMM. I.e. */etc/bird4/filters/filter-20170705-2030*
|
||||
> */etc/bird{4|6}/functions/function*-**TIMESTAMP**. *Timestamp* is: YYYYMMDD-HHMM. I.e. */etc/bird4/functions/function-20170705-2030*
|
||||
|
||||
- *Button* **Load File**: Click this button to Load the file selected in the *{filter|function} Files* list. This button **must** be pressed in order to edit the target file.
|
||||
- *Read Only Text Box* **Editing File**: This Read-Only field is empty by default. It will get populated with the target file to edit.
|
||||
> **Caution**: Only if this field shows a file path, the contents of the target file can be edited and saved.
|
||||
|
||||
- *Text Area* **File Contents**: This text area will show the contents of the file shown in the *Editting File*. Save the contents of this text area by pressing the Button **Submit**
|
||||
> Use **spaces** instead of **tabs** for indentation.
|
||||
|
||||
> **Caveat**: If you save your filter or function using the *New File* option, until you refresh the page, the **saved** file will still appear as *New File*. However, the file will be created and correctly stored and you will be able to edit it with no problems.
|
||||
> After refreshing the page, your file will appear normally together with a new *New File* option.
|
||||
> This behaviour will be enhanced in future versions.
|
||||
|
||||
#### Common Errors
|
||||
Most common errors produced by Filters and Functions are:
|
||||
|
||||
- Syntax errors: `bird: /etc/bird4/filters/filter-20170507-0951, line 4: syntax error`
|
||||
> This instances require you to check where your errors is following Bird's hints.
|
||||
|
||||
- Non-existing filter: `bird: /tmp/bird4.conf, line 71: No such filter.`
|
||||
> Check your Filter name or define it in the **Filters Page**
|
||||
|
||||
- Calls to functions not defined in the Functions files or not part of the Bird filter/function definition *language*: `, line 4: You can't call something which is not a function. Really.`
|
||||
> Check you Function definition, your call name or Bird's official documentation to get the right reference.
|
||||
|
||||
#### Critical Errors
|
||||
There are some critical errors that could escape from first sight as Bird Daemon will start working *correctly*.
|
||||
|
||||
If you set your Filter **without** *accept* or *reject* calls, your filter will fail to work and let all the routes pass by as accepted. This will be shown in the **Log Page**:
|
||||
|
||||
Example: **Filter "doNothing"**
|
||||
```
|
||||
filter doNothing
|
||||
{
|
||||
print "HelloWorld";
|
||||
}
|
||||
```
|
||||
This *wrong* filter has been used in our BGP instance and Bird Daemon runs correctly. However, if we check the **Log Page** we find:
|
||||
```
|
||||
2017-05-07 10:18:49 <ERR> Filter doNothing did not return accept nor reject. Make up your mind
|
||||
2017-05-07 10:18:49 <INFO> HelloWorld
|
||||
```
|
||||
> Do not leave any filter without *accept* or *reject* calls to avoid this wrong behaviour that will incurr in a waste of resources.
|
|
@ -1,80 +0,0 @@
|
|||
# bird-openwrt
|
||||
|
||||
Package for OpenWRT to bring integration with UCI and LUCI to Bird4 and Bird6 daemon.
|
||||
|
||||
This repository contains an UCI module adding support for an user-friendly configuration of the BIRD daemon in OpenWRT systems and a LuCI application to control this UCI configuration using the web-based OpenWRT configuration system.
|
||||
|
||||
**Package Names**: luci-app-bird{4|6} and bird{4|6}-uci
|
||||
|
||||
**Dependences**: +bird{4|6} +libuci +luci-base +uci +libuci-lua
|
||||
|
||||
**Last Version**: 0.3
|
||||
|
||||
**Terminal (UCI) Documentation**: [Link](https://github.com/eloicaso/bird-openwrt/blob/master/UCI-DOCUMENTATION.md)
|
||||
|
||||
**Web (LUCI) Documentation**: [Link](https://github.com/eloicaso/bird-openwrt/blob/master/LUCI-DOCUMENTATION.md)
|
||||
|
||||
|
||||
## Known issues (v0.3):
|
||||
* There is an issue with pre-built images. It seems that the UCI-Default Scripts are not applied for some reason. If you face this situation, just copy both packages in your /tmp and and execute "opkg install PackageName.ipk --force-reinstall". It will overwrite your /etc/config/bird{4|6}, create a backup of this configuration.
|
||||
|
||||
* LUCI Material Design Theme shows a "Loading page" in **Logs Page** preventing it to load. Moreover, the OpenWRT Theme crashes loading the **Log Page**.
|
||||
Please, go to `System -> Language and Style -> Design` and change it to any other avaiable Theme (*Bootstrap* or *Freifunk_Generic* are recommended).
|
||||
|
||||
* There is a manual procedure to designate custom Routing Table IDs created through this package's UI. Please, visit [this page](https://github.com/eloicaso/bgp-bmx6-bird-docn/blob/master/EN/manual_procedures.md) for more details.
|
||||
|
||||
## How to compile:
|
||||
Due to the existence of Routing's bird-openwrt packages, if you want to build your system using this repo's bird packages, you need to proceed as follows:
|
||||
|
||||
|
||||
* Add this github as a repository in feeds.conf. Alternatively, you could use a local git clone)
|
||||
```
|
||||
src-git birdwrt https://github.com/eloicaso/bird-openwrt.git
|
||||
|
||||
```
|
||||
OR
|
||||
```
|
||||
src-link birdwrt /path/to/your/git/clone/bird-openwrt
|
||||
```
|
||||
|
||||
* Disable OpenWRT-Routing repository to avoid getting the outdated package
|
||||
```
|
||||
# src-git routing https://github.com/openwrt-routing/packages.git
|
||||
```
|
||||
|
||||
* Update and install all packages in feeds
|
||||
```
|
||||
./scripts/feeds update -a; ./scripts/feeds install -a
|
||||
```
|
||||
|
||||
* Enable OpenWRT-Routing repository to fulfill bird{4/6} dependencies
|
||||
```
|
||||
src-git routing https://github.com/openwrt-routing/packages.git
|
||||
./scripts/feeds update routing; ./scripts/feeds install bird4 bird6
|
||||
```
|
||||
|
||||
* Compile (Option 1) the whole OpenWRT image with the package included
|
||||
```
|
||||
make menuconfig -> Network -> Routing and Redirection -> Select bird*-uci
|
||||
-> LuCI -> 3. Applications -> Select luci-app-bird*
|
||||
make V=99
|
||||
```
|
||||
|
||||
* Compile (Option 2) the packet ( ! this method requires to compile its dependeces before using Option 1)
|
||||
```
|
||||
make package/feeds/birdwrt/bird{4/6}-openwrt/compile V=99
|
||||
```
|
||||
|
||||
* Find your package in
|
||||
```
|
||||
[OpenWRT_folder]/bin/packages/{Architecture}/routing/bird{4/6}-uci_{Version}_{Architecture}.ipk
|
||||
[OpenWRT_folder]/bin/packages/{Architecture}/routing/luci-app-bird{4/6}_{Version}_{Architecture}.ipk
|
||||
```
|
||||
|
||||
* Install your .ipk in your dev-environment (avoid CheckSum Missmatch issues)
|
||||
```
|
||||
scp bird{4/6}-uci_{Version}_{Architecture}.ipk user@IPAddres:/tmp
|
||||
|
||||
On your Dev-Environment:
|
||||
opkg install bird{4/6}-uci_{Version}_{Architecture}.ipk --force-checksum
|
||||
```
|
|
@ -1,345 +0,0 @@
|
|||
<!--
|
||||
---------------------------------------------------------------------
|
||||
(C) 2014 - 2017 Eloi Carbo <eloicaso@openmailbox.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
---------------------------------------------------------------------
|
||||
-->
|
||||
|
||||
# Bird{4|6} UCI Packages Documentation
|
||||
* BIRD Daemon's original documentation: http://bird.network.cz/?get_doc
|
||||
* Usage examples (Gitlab): https://gitlab.labs.nic.cz/labs/bird/wikis/home
|
||||
* Extra documentation in English & Catalan: https://github.com/eloicaso/bgp-bmx6-bird-docn
|
||||
* If you want to add new options to bird*-openwrt packages add a pull request or issue in: https://github.com/eloicaso/bird-openwrt
|
||||
|
||||
### Options used in /etc/config/bird{4|6}
|
||||
> *Clarification*: Any reference to **{4|6}** in this document means that it applies to both Bird4 and Bird6 packages and configurations. Otherwise, the text will clarify which specific package is affected by it.
|
||||
|
||||
#### CONFIGURATION SECTION 1: 'bird'
|
||||
Usage example :
|
||||
``` Bash
|
||||
config bird 'bird'
|
||||
option use_UCI_config '1'
|
||||
option UCI_config_file '/tmp/bird4.conf'
|
||||
```
|
||||
|
||||
* **use_UCI_config**: *Boolean*
|
||||
This option allows you to use package's UCI configuration translation instead of using the original Bird config file (hand-edited). If true/1, birdX init.d script will use the translation placed in "UCI_config_file". Otherwise, it will use the default "/etc/birdX.conf" configuration.
|
||||
**\[HINT**\] This could be used to allow multiple configurations and swap them easily.
|
||||
*Default: 0*
|
||||
|
||||
* **UCI_config_file**: *String* File_path
|
||||
This option sets where will be placed the translation of the UCI configuration file.
|
||||
*Default: /tmp/birdX.conf*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 2: 'global NAME'
|
||||
Usage example:
|
||||
```Bash
|
||||
config global 'global'
|
||||
option log_file '/tmp/bird4.log'
|
||||
option log 'all'
|
||||
option debug 'off'
|
||||
option router_id '172.16.1.6'
|
||||
```
|
||||
|
||||
* **log_file**: *String* File_path
|
||||
This option sets the path of the file used to save Bird Log and Debug's information.
|
||||
*Default: /tmp/bird{4|6}.log*
|
||||
|
||||
* **log**: *String/Enumeration* (all/off, info, warning, error, fatal, debug, trace, remote, auth, bug)
|
||||
This option allows you to set which information you want to save in the Log file.
|
||||
**\[HINT\]** Use the enumeration like: { info, waning, error }. Do not enter any extra option if you select "all" (Bird will fail to start).
|
||||
*Default: all*
|
||||
|
||||
* **debug**: *String/Enumeration* ( all/off, states, routes, filters, interfaces, events, packets)
|
||||
This option allows you to set which **extra** debug information will be saved in the "log_file" file.
|
||||
**\[HINT\]** Use the enumeration like: { info, waning, error }. Do not enter any extra option if you select "all" (Bird will fail to start).
|
||||
*Default: off*
|
||||
|
||||
* **router_id**: IP Address
|
||||
This option sets which will be the Router ID.
|
||||
**\[HINT\]** In **Bird4** this field is the lowest IP address (not loopback) among the existing interfaces by default (Optional property).
|
||||
In **Bird6** there is no default value and it is mandatory.
|
||||
|
||||
* **listen_bgp_addr**: IP Address
|
||||
This option sets the IP address that Bird BGP instances will listen by default.
|
||||
*Default: 0.0.0.0*
|
||||
|
||||
* **listen_bgp_port**: *Integer* Port
|
||||
This option sets the port that Bird BGP instances will listen by default.
|
||||
*Default: IP 0.0.0.0 and Port 179*
|
||||
|
||||
* **listen_bgp_dual**: *Boolean*
|
||||
**\[Bird6\]** This option configures Bird6 BGP instances to listen only IPv6 or IPv4/6 BGP routes.
|
||||
|
||||
|
||||
#### <a name="table"></a>CONFIGURATION SECTION 3: 'table'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config table
|
||||
option name 'aux'
|
||||
```
|
||||
|
||||
* **name**: *String*
|
||||
This option allows you to set the name of the auxiliar kernel tables used for Bird. This option is mandatory for most of the protocols.
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 4: 'kernel NAME'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config kernel kernel1
|
||||
option table 'aux'
|
||||
option import 'all'
|
||||
option export 'all'
|
||||
option kernel_table '100'
|
||||
option scan_time '10'
|
||||
option learn '1'
|
||||
option persist '0'
|
||||
option disabled '0'
|
||||
```
|
||||
|
||||
* **table**: *String*
|
||||
Set an auxiliary table for the current kernel routing instance. This table **MUST** exist as a [table](#table) instance.
|
||||
**\[HINT\]** If there is an Kernel protocol instance that uses the "main" kernel table, not using table/kernel_table options, this should be included before the rest of Kernel instances (which will use auxiliary tables).
|
||||
|
||||
* **import**: *String/Filter* function
|
||||
This option delimits which routes coming from other protocols will be accepted.
|
||||
Options are:
|
||||
**All/none**: allows to import all the routes or none of them.
|
||||
**Filter name**: \[import 'bgp_filter_in'\] the protocol will use the filter with the given name (Specified filter **must** exists in any file under /etc/bird{4|6}/filters/ folder).
|
||||
|
||||
* export: String/Filter function
|
||||
This option delimits which routes going out from the protocol. This option allows filters in different manners:
|
||||
**All/none**: allows to export all the routes or none of them.
|
||||
**Filter name**: \[export 'bgp_filter_out'\] the protocol will use the filter with the given name(Specified filter **must** exists in any file under /etc/bird{4|6}/filters/ folder).
|
||||
|
||||
* **kernel_table**: *Integer*
|
||||
This option sets the identification number of the Kernel table that will be used instead of the main one.
|
||||
*Default: main table (254)*
|
||||
|
||||
* **scan_time**: *Integer*
|
||||
This option sets the time between checks to target kernel table.
|
||||
|
||||
* **learn**: *Boolean*
|
||||
Set if kernel table will add the routes from other routing protocols or the system administrator.
|
||||
|
||||
* **persist**: *Boolean*
|
||||
Set if Bird Daemon will save the known routes when exiting or if it will clean the routing table.
|
||||
|
||||
* **disable**: *Boolean*
|
||||
This option sets if the protocol will be used or dismissed.
|
||||
*Default: 0*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 5: 'device NAME'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config device device1
|
||||
option scan_time '10'
|
||||
option disabled '0'
|
||||
```
|
||||
|
||||
* **scan_time***: *Integer*
|
||||
This option sets the time between checks to the selected kernel table.
|
||||
|
||||
* **disable**: *Boolean*
|
||||
This option sets if the protocol will be used or dismissed.
|
||||
*Default: 0*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 6: 'static NAME'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config static static1
|
||||
option table 'aux'
|
||||
option disabled '0'
|
||||
```
|
||||
|
||||
* **table**: *String*
|
||||
Set an auxiliary table for the current static instance. This table **MUST** exist as a [table](#table) instance.
|
||||
**\[HINT\]** If there is an static instance that uses the "main" kernel table (not using table/kernel_table options), this should be included before the rest of static instances (which will use auxiliary tables).
|
||||
|
||||
* **disable**: *Boolean*
|
||||
This option sets if the protocol will be used or dismissed.
|
||||
*Default: 0*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 7 & 8: 'bgp NAME' & 'bgp_template NAME'
|
||||
This section merges two different configuration sections: BGP *instances* and *templates*. The first one is the basic BGP configuration part and the second one is the template used to minimize the number of options written in the configuration file for each unique instance. Both configuration sections have the same options but, when Bird finds duplicities, the instance will overwrite the template options.
|
||||
|
||||
Usage examples:
|
||||
``` Bash
|
||||
# instance
|
||||
config bgp bgp1
|
||||
option template 'bgp_common'
|
||||
option description 'Description of the BGP instance'
|
||||
option neighbor_address '172.16.1.5'
|
||||
option neighbor_as '65530'
|
||||
option source_address '172.16.1.6'
|
||||
option next_hop_self '0'
|
||||
option next_hop_keep '0'
|
||||
option rr_client '1'
|
||||
option rr_cluster_id '172.16.1.6'
|
||||
```
|
||||
|
||||
``` Bash
|
||||
# template
|
||||
config bgp_template bgp_common
|
||||
option table 'aux'
|
||||
option import 'all'
|
||||
option export 'all'
|
||||
option local_address '172.16.1.6'
|
||||
option local_as '65001'
|
||||
option import_limit '100'
|
||||
option import_limit_action 'warn'
|
||||
option export_limit '100'
|
||||
option export_limit_action 'warn'
|
||||
option receive_limit '100'
|
||||
option receive_limit_action 'warn'
|
||||
option disabled '0'
|
||||
```
|
||||
|
||||
* **template**: *String*
|
||||
This option states the template used for current BGP instance. This template MUST exist.
|
||||
|
||||
* **description**: *String*
|
||||
This option allows to add a description of the bgp instance and its function.
|
||||
|
||||
* **local_addr**: IP address
|
||||
This option allows to set the IP source of our Autonomous System (AS).
|
||||
|
||||
* **local_as**: *Integer*
|
||||
This option allows to set the identification number of our AS number. This option is mandatory for each BGP instance.
|
||||
|
||||
* **neighbor_addr**: IP address
|
||||
Each BGP instance has a neighbor connected to. This option allows to set its IP address.
|
||||
|
||||
* **neighbor_as**: *Integer*
|
||||
Each BGP instance has a neighbor connected to. This option allows to set its AS ID.
|
||||
|
||||
* **next_hop_self**: *Boolean*
|
||||
If this option is true, BGP protocol will avoid to calculate the next hop and always advertise own "Router id" IP.
|
||||
*Default: 0*
|
||||
|
||||
* **next_hop_keep**: *Boolean*
|
||||
If this option is true, BGP will always use the received next_hop information to redirect the route.
|
||||
*Default: 0*
|
||||
|
||||
* **rr_client**: *Boolean*
|
||||
IF this option is true, the router will be set as Route Reflector and will treat the rest of the routers as RR clients.
|
||||
*Default: 0*
|
||||
|
||||
* **rr_cluster_id**: *Integer*
|
||||
This option sets the identification number of the RR cluster. All the nodes in a cluster needs this option and share the same number.
|
||||
*Default: Router id*
|
||||
|
||||
* **import_limit**: *Integer*
|
||||
This option sets the limit of routes that a protocol can import until take the action indicated in the import_limit_action.
|
||||
import_limit also counts filtered routes (even dropped ones).
|
||||
*Default: 0 (no limit)*
|
||||
|
||||
* **import_limit_action**: *String*
|
||||
This option allows to decide the action to take when reached the limit of imported routes.
|
||||
Actions are: warn, block, restart, disable
|
||||
|
||||
* **export_limit**: *Integer*
|
||||
This option sets the limit of routes that a protocol can export until take the action indicated in the export_limit_action.
|
||||
*Default: 0 (no limit)*
|
||||
|
||||
* **export_limit_action**: *String*
|
||||
This option allows to decide the action to take when reached the limit of exported routes.
|
||||
Actions are: warn, block, restart, disable
|
||||
|
||||
* **receive_limit**: *Integer*
|
||||
This option sets the limit of routes that a protocol can receive until take the action indicated in the receive_limit_action. receive_limit only counts accepted routes from the protocol.
|
||||
*Default: 0 (no limit)*
|
||||
|
||||
* **receive_limit_action**: *String*
|
||||
This option allows to decide the action to take when reached the limit of received routes.
|
||||
Actions are: warn, block, restart, disable
|
||||
|
||||
* **disable**: *Boolean*
|
||||
This option sets if the protocol will be used or dismissed.
|
||||
*Default: 0*
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 9: 'route'
|
||||
Usage example:
|
||||
``` Bash
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'router'
|
||||
option prefix '192.168.9.0/24'
|
||||
option via '10.99.105.159'
|
||||
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'special'
|
||||
option prefix '192.168.2.0/24'
|
||||
option attribute 'unreachable'
|
||||
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'iface'
|
||||
option prefix '192.168.3.0/24'
|
||||
option iface 'mgmt0'
|
||||
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'recursive'
|
||||
option prefix '192.168.4.0/24'
|
||||
option ip '192.168.1.1'
|
||||
|
||||
config route
|
||||
option instance 'static1'
|
||||
option type 'multipath'
|
||||
option prefix '192.168.30.0/24'
|
||||
list l_via '172.16.1.5'
|
||||
list l_via '172.16.1.6'
|
||||
```
|
||||
|
||||
* **instance**: *String*
|
||||
This option indicates the route that the static protocol instance will apply.
|
||||
|
||||
* **type**: *String*
|
||||
This option states the type of route that will be applied. Also defines the options available for it.
|
||||
Types are: 'router', 'special', 'iface', 'recursive' or 'multipath'.
|
||||
|
||||
* **prefix**: IP address/network
|
||||
This option allows to define the network that you want to define.
|
||||
**\[router only\]**
|
||||
**via**: IP Address
|
||||
This option indicates the IP address of the neighbor router where the routes will pass through.
|
||||
**\[special only\]**
|
||||
**attribute**: *String*
|
||||
This option will mark the behaviour of the route.
|
||||
Attribures are: 'blackhole', 'unreachable' or 'prohibit'.
|
||||
**\[iface only\]**
|
||||
**iface**: *String*
|
||||
This option indicates the interface used to redirect the BGP routes. Careful, the interface MUST exist, or Bird will fail to start.
|
||||
**\[recursive only\]**
|
||||
**ip**: IP address
|
||||
This option states the IP address which the next hop will depend on.
|
||||
**\[multipath only\]**
|
||||
This is a list, not an option. Use it as in the example, or check the UCI configuration documentation.
|
||||
**l_via**: IP address
|
||||
This list of IPs specifies the list (following the sequence) of routers that the route will follow as next hops.
|
||||
|
||||
|
||||
#### CONFIGURATION SECTION 10 & 11: 'filter NAME' & 'function Name'
|
||||
Filters are written in separated files under **/etc/bird{4|6}/filters/** and **/etc/bird{4|6}/functions/**. Their syntax can be found [here.](http://bird.network.cz/?get_doc&f=bird-5.html)
|
||||
The content of each filter and file file will be included in the resulting bird{4|6}.conf file without checking its syntax, so you could find errors during start time.
|
||||
|
||||
* Clarification for any existing **v0.2** user: an automated upgrade path has been added to switch your old "filter" or "function" sections. It is safe to upgrade, but doing regular backups of your key files is always a good practise to avoid frustration.
|
|
@ -1,102 +0,0 @@
|
|||
# Copyright (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/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
BIRD := bird4
|
||||
PKG_NAME := $(BIRD)-openwrt
|
||||
PKG_VERSION := 0.3
|
||||
PKG_RELEASE := 1
|
||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||
PKG_LICENSE := GPL-3.0+
|
||||
uci := $(BIRD)-uci
|
||||
luci := luci-app-$(BIRD)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Build/Prepare
|
||||
endef
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/$(uci)
|
||||
TITLE:=The BIRD UCI module
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
|
||||
URL:=https://github.com/eloicaso/bird-openwrt/
|
||||
DEPENDS:=+$(BIRD) +libuci +uci
|
||||
endef
|
||||
|
||||
define Package/$(uci)/description
|
||||
$(BIRD) UCI integration module
|
||||
endef
|
||||
|
||||
define Package/$(uci)/conffiles
|
||||
/etc/config/$(BIRD)
|
||||
endef
|
||||
|
||||
define Package/$(uci)/install
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD)/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD)/filters
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD)/functions
|
||||
$(INSTALL_BIN) ./src/init.d/$(BIRD)* $(1)/etc/$(BIRD)/init.d/
|
||||
$(CP) ./src/uci-defaults/* $(1)/etc/$(BIRD)/init.d/
|
||||
$(INSTALL_CONF) ./src/config/$(BIRD) $(1)/etc/config/
|
||||
endef
|
||||
|
||||
define Package/$(uci)/postinst
|
||||
#!/bin/sh
|
||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||
( . /etc/$(BIRD)/init.d/bird-uci-install-init.d $(BIRD) ) && rm -f /etc/$(BIRD)/init.d/bird-uci-install-init.d
|
||||
( . /etc/$(BIRD)/init.d/99-relocate-filters $(BIRD) ) && rm -f /etc/$(BIRD)/init.d/99-relocate-filters
|
||||
if [ -f /etc/sysupgrade.conf ] && ! grep $(BIRD) /etc/sysupgrade.conf; then
|
||||
echo /etc/config/$(BIRD) >> /etc/sysupgrade.conf
|
||||
echo /etc/$(BIRD)/filters/ >> /etc/sysupgrade.conf
|
||||
echo /etc/$(BIRD)/functions/ >> /etc/sysupgrade.conf
|
||||
fi
|
||||
fi
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(uci)))
|
||||
|
||||
define Package/$(luci)
|
||||
TITLE:=LuCI support for $(BIRD)
|
||||
SECTION:=luci
|
||||
CATEGORY:=LuCI
|
||||
SUBMENU:=3. Applications
|
||||
MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
|
||||
URL:=https://github.com/eloicaso/bird-openwrt/
|
||||
DEPENDS:=+$(BIRD)-uci +luci-base
|
||||
endef
|
||||
|
||||
define Package/$(luci)/description
|
||||
$(BIRD) application for LuCI
|
||||
endef
|
||||
|
||||
define Package/$(luci)/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/$(BIRD)/
|
||||
$(CP) ./src/model/* $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
|
||||
$(CP) ./src/controller/* $(1)/usr/lib/lua/luci/controller/
|
||||
$(CP) ./src/view/* $(1)/usr/lib/lua/luci/view/$(BIRD)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(luci)))
|
|
@ -1,33 +0,0 @@
|
|||
config bird 'bird'
|
||||
option use_UCI_config '1'
|
||||
#Caution! Enabling this option, Bird will translate this
|
||||
#UCI file and use it instead of /etc/bird4.conf
|
||||
option UCI_config_file '/tmp/bird4.conf'
|
||||
#If you enable useUCIconfig, UCIconfigFile will be Bird's
|
||||
#configuration file location.
|
||||
|
||||
config global 'global'
|
||||
option log_file '/tmp/bird4.log'
|
||||
option log 'all'
|
||||
option debug 'off'
|
||||
|
||||
config table
|
||||
option name 'aux'
|
||||
|
||||
config kernel kernel1
|
||||
option table 'aux'
|
||||
option import 'all'
|
||||
option export 'all'
|
||||
option kernel_table '100'
|
||||
option scan_time '10'
|
||||
option learn '1'
|
||||
option persist '0'
|
||||
option disabled '0'
|
||||
|
||||
config device device1
|
||||
option scan_time '10'
|
||||
option disabled '0'
|
||||
|
||||
config static static1
|
||||
option table 'aux'
|
||||
option disabled '0'
|
|
@ -1,52 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
module("luci.controller.bird4", package.seeall)
|
||||
|
||||
function index()
|
||||
entry({"admin", "network", "bird4",},
|
||||
alias("admin", "network", "bird4", "status"),
|
||||
_("Bird4"), 0)
|
||||
|
||||
entry({"admin", "network", "bird4", "status"},
|
||||
cbi("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"},
|
||||
cbi("bird4/filters"),
|
||||
_("Filters"), 5).leaf = true
|
||||
|
||||
entry({"admin","network","bird4","functions"},
|
||||
cbi("bird4/functions"),
|
||||
_("Functions"), 6).leaf = true
|
||||
end
|
|
@ -1,233 +0,0 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
|
||||
# Copyright (C) 2014-2017 - Eloi Carbo
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# Extra Service Function to get the Status of the Service
|
||||
# This complements /etc/rc.common functions
|
||||
# Commands ending with *_quiet are meant to be ran in Luci. These
|
||||
# scripts' return minimal output.
|
||||
EXTRA_COMMANDS="status start_quiet stop_quiet restart_quiet status_quiet"
|
||||
EXTRA_HELP=" status Returns service status"
|
||||
|
||||
BIRD="bird4"
|
||||
BIRD_CONFIG="/etc/${BIRD}.conf"
|
||||
BIRD_LOG="/var/log/${BIRD}.log"
|
||||
BIRD_ERR="/tmp/${BIRD}.err"
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_USE_PID=1
|
||||
SERVICE_PID_FILE="/var/run/${BIRD}.pid"
|
||||
|
||||
BIRD_BIN="/usr/sbin/${BIRD}"
|
||||
# Special non-terminal-rich output for Luci calls
|
||||
LUCI="false"
|
||||
|
||||
. /etc/${BIRD}/init.d/${BIRD}-lib.sh
|
||||
|
||||
start() {
|
||||
config_load ${BIRD}
|
||||
local use_UCI_config
|
||||
get use_UCI_config 'bird'
|
||||
|
||||
#Start the service
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo "Starting ${BIRD} Service [ ... ]"
|
||||
fi
|
||||
if [ -f ${BIRD_ERR} ]; then
|
||||
echo -n "" > ${BIRD_ERR}
|
||||
else
|
||||
touch ${BIRD_ERR}
|
||||
fi
|
||||
|
||||
if [ -z "${use_UCI_config}" -o "${use_UCI_config}" = "0" ]; then
|
||||
# Disable Custom bird-openwrt settings.
|
||||
# Use default behaviour and files
|
||||
${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &> ${BIRD_ERR} &
|
||||
else
|
||||
#Set Bird4 configuration location:
|
||||
local UCI_config_file
|
||||
local log_file
|
||||
get UCI_config_file 'bird'
|
||||
get log_file 'global'
|
||||
BIRD_CONFIG="${UCI_config_file:-$BIRD_CONFIG}"
|
||||
BIRD_LOG="${log_file:-$BIRD_LOG}"
|
||||
#Backup previous configuration
|
||||
[ -f ${BIRD_CONFIG} ] && cp ${BIRD_CONFIG} ${BIRD_CONFIG}.bak
|
||||
#Setup the basic configuration
|
||||
prepare_global 'global'
|
||||
|
||||
# Gather and set all Functions
|
||||
gather_functions
|
||||
# Gather and set all Filters
|
||||
gather_filters
|
||||
|
||||
# Setup Main Protocols
|
||||
config_foreach prepare_kernel 'kernel'
|
||||
config_foreach prepare_static 'static'
|
||||
config_foreach prepare_device 'device'
|
||||
config_foreach prepare_direct 'direct'
|
||||
config_foreach prepare_pipe 'pipe'
|
||||
|
||||
#Setup protocol's configuration: BGP
|
||||
config_foreach prepare_bgp_template 'bgp_template'
|
||||
config_foreach prepare_bgp 'bgp'
|
||||
|
||||
#Setup protocol's configuration: OSPF
|
||||
config_foreach prepare_ospf_instance 'ospf'
|
||||
|
||||
#Start the service
|
||||
${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &>${BIRD_ERR} &
|
||||
fi
|
||||
while [ ! -s ${SERVICE_PID_FILE} ]; do
|
||||
sleep 1
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Start Status: \033[0;31m[ FAILED ]\e[m"
|
||||
cat ${BIRD_ERR}
|
||||
cat ${BIRD_ERR} >> ${BIRD_LOG}
|
||||
else
|
||||
echo "${BIRD} - Failed: $(cat ${BIRD_ERR})"
|
||||
cat ${BIRD_ERR} >> ${BIRD_LOG}
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# PID & ERROR contents are read from their files to avoid an issue
|
||||
# where if [ -s ${SERVICE_PID_FILE} ] and if [ -s ${BIRD_ERR} ]
|
||||
# fails unless a previous command reads its contents making its
|
||||
# behaviour unreliable.
|
||||
SVC_PID="$(cat ${SERVICE_PID_FILE})"
|
||||
BRDERR_TXT="$(cat ${BIRD_ERR})"
|
||||
if [ -n "${SVC_PID}" ]; then
|
||||
if [ -n "${BRDERR_TXT}" ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon already started. Status \033[0;32m[ RUNNING ]\e[m"
|
||||
else
|
||||
echo "${BIRD} already started"
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Start Status: \033[0;32m[ STARTED ]\e[m"
|
||||
else
|
||||
echo "${BIRD} - Started"
|
||||
fi
|
||||
fi
|
||||
# PID File found (service started correctly)
|
||||
return 0
|
||||
fi
|
||||
|
||||
# PID File not found (error while starting service)
|
||||
return 1
|
||||
}
|
||||
|
||||
stop() {
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
config_load ${BIRD}
|
||||
local log_file
|
||||
get log_file 'global'
|
||||
BIRD_LOG="${log_file:-$BIRD_LOG}"
|
||||
start-stop-daemon -p ${SERVICE_PID_FILE} -K 2>&1 >> ${BIRD_LOG}
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Stop Status: \033[0;32m[ OK ]\e[m"
|
||||
else
|
||||
echo "${BIRD} - Stopped"
|
||||
fi
|
||||
echo -n "" > ${BIRD_ERR}
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Stop Status: \033[0;31m[ FAILED ]\e[m"
|
||||
echo "Check ${BIRD_LOG} file for more information."
|
||||
else
|
||||
echo "${BIRD} Failed to Stop. See Log file: ${BIRD_LOG}"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Service already stopped. \033[0;31m[ FAILED ]\e[m"
|
||||
else
|
||||
echo "${BIRD} already stopped"
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
restart() {
|
||||
stop
|
||||
sleep 1
|
||||
if [ "${LUCI}" == "true" ]; then
|
||||
echo " ... "
|
||||
fi
|
||||
start
|
||||
}
|
||||
|
||||
reload() {
|
||||
service_reload ${BIRD_BIN}
|
||||
}
|
||||
|
||||
status() {
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} start status: \033[0;32m[ RUNNING ]\e[m"
|
||||
else
|
||||
echo "${BIRD}: Running"
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
|
||||
cat ${BIRD_ERR}
|
||||
else
|
||||
echo "${BIRD}: Failed - $(cat ${BIRD_ERR})"
|
||||
fi
|
||||
return 2
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
|
||||
else
|
||||
echo "${BIRD}: Stopped"
|
||||
fi
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Luci-specific calls (stripped output).
|
||||
# The following scripts are not meant to be ran using Ash Terminal
|
||||
# Used in: LUCI/model/cbi/bird4/status.lua
|
||||
start_quiet() {
|
||||
LUCI="true"
|
||||
start
|
||||
}
|
||||
stop_quiet() {
|
||||
LUCI="true"
|
||||
stop
|
||||
}
|
||||
restart_quiet() {
|
||||
LUCI="true"
|
||||
restart
|
||||
}
|
||||
status_quiet() {
|
||||
LUCI="true"
|
||||
status
|
||||
}
|
|
@ -1,587 +0,0 @@
|
|||
# Bird4-OpenWRT Library - Functions used in /etc/init.d/bird4 script.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2014-2017 - Eloi Carbo
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
# Function: writeToConfig $1
|
||||
# $1 string.
|
||||
# Allows to write in the $BIRD_CONFIG file, the string $1. This function does not check the $1 string.
|
||||
# Example: writeToConfig "value: $N"
|
||||
writeToConfig() {
|
||||
echo "$1" >> ${BIRD_CONFIG}
|
||||
}
|
||||
|
||||
|
||||
# Function: write $1 $2
|
||||
# $1 string. $2 string.
|
||||
# This function checks if $2 is empty. If not, it writes the string $1 in the $BIRD_CONFIG file.
|
||||
# Use write function to check if $1, value found inside $2, is not empty and can be written in the configuration file.
|
||||
# Example: N=""; write "value: $N" $N;
|
||||
write() {
|
||||
[ -n "$2" ] && writeToConfig "$1"
|
||||
}
|
||||
|
||||
|
||||
#Function: write_bool $1 $2
|
||||
# $1 string; $2 boolean
|
||||
# This function checks if $2 is true and write the $1 string into $BIRD_CONFIG file.
|
||||
# Example: local N=0; write_bool $N
|
||||
write_bool() {
|
||||
[ "$2" == 1 ] && writeToConfig " $1;"
|
||||
}
|
||||
|
||||
|
||||
# Function: get $1 $2
|
||||
# $1 string. $2 string
|
||||
# This function uses the external UCI function "config_get $result $section $option" to obtain a string value from UCI config file.
|
||||
# To use this function, use the same name of the UCI option for the variable.
|
||||
# Example: UCI (option id 'abcd'); local id; get id $section
|
||||
get() {
|
||||
config_get $1 $2 $1
|
||||
}
|
||||
|
||||
|
||||
# Function: get_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
|
||||
get_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_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_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_bool next_hop_self ${section}
|
||||
get_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_bool next_hop_self ${section}
|
||||
get_bool next_hop_keep ${section}
|
||||
get rr_client ${section}
|
||||
get rr_cluster_id ${section}
|
||||
|
||||
writeToConfig "#${section} configuration:"
|
||||
[ -n "${template}" ] && writeToConfig "protocol bgp ${section} from ${template} {" \
|
||||
|| writeToConfig "protocol bgp ${section} {"
|
||||
[ -n "${disabled}" ] && write_bool disabled ${disabled}
|
||||
[ -n "${table}" ] && writeToConfig " table ${table};"
|
||||
[ -n "${igp_table}" ] && writeToConfig " igp table ${igp_table};"
|
||||
[ -n "${passive}" ] && writeToConfig " passive;" ${passive}
|
||||
[ -n "${local_as}" ] && writeToConfig " local as ${local_as};"
|
||||
[ -n "${source_address}" ] && writeToConfig " source address ${source_address};"
|
||||
[ -n "${import}" ] && writeToConfig " import ${import};"
|
||||
[ -n "${export}" ] && writeToConfig " export ${export};"
|
||||
[ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig " neighbor ${neighbor_address} as ${neighbor_as};"
|
||||
if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
|
||||
[ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
|
||||
writeToConfig " import limit ${import_limit} action ${import_limit_action};"
|
||||
fi
|
||||
if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
|
||||
[ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
|
||||
writeToConfig " export limit ${export_limit} action ${export_limit_action};"
|
||||
fi
|
||||
if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
|
||||
[ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
|
||||
writeToConfig " receive limit ${receive_limit} action ${receive_limit_action};"
|
||||
fi
|
||||
[ -n "${next_hop_self}" ] && write_bool " next hop self;" ${next_hop_self}
|
||||
[ -n "${next_hop_keep}" ] && write_bool " next hop keep;" ${next_hop_keep}
|
||||
[ -n "${rr_client}" ] && write_bool " rr client;" ${rr_client}
|
||||
[ -n "${rr_cluster_id}" ] && writeToConfig " rr cluster id ${rr_cluster_id};"
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
#Function: prepare_ospf_network $1
|
||||
# $1 string $2 string
|
||||
# This function gets each "ospf_network" protocol section in the UCI configuration, checks if its Area ID is the same as the one
|
||||
# being configurated and finally sets the list of network ranges to be propagated, or not, by the OSPF protocol
|
||||
# $1 is set as the ID of the action area of the internal networks.
|
||||
# $2 is set as the ID of the current area being configurated.
|
||||
prepare_ospf_networks() {
|
||||
local section="$1"
|
||||
local current_area="$2"
|
||||
|
||||
if [ "${section}" = "${current_area}" ]; then
|
||||
writeToConfig " networks {"
|
||||
config_list_foreach ${section} range range_list
|
||||
config_list_foreach ${section} hidden_range hidden_range_list
|
||||
writeToConfig " };"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_ospf_password $1 $2
|
||||
prepare_ospf_passwords() {
|
||||
local section="$1"
|
||||
local current_interface="$2"
|
||||
local interface; local passphrase
|
||||
|
||||
get interface $section
|
||||
get passphrase $section
|
||||
|
||||
[ "current_interface" = "${interface}" ] && write ' password "$passphrase";' ${passphrase}
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_ospf_neighbors $1 $2
|
||||
#prepare_ospf_neighbors() {
|
||||
#}
|
||||
|
||||
|
||||
# Function: prepare_ospf_interface $1 $2
|
||||
prepare_ospf_interface() {
|
||||
local section="$1"
|
||||
local current_area="$2"
|
||||
local area; local cost; local type; local hello; local priority; local retransmit; local authentication
|
||||
|
||||
get area ${section}
|
||||
get cost ${section}
|
||||
get type ${section}
|
||||
get hello ${section}
|
||||
get priority ${section}
|
||||
get retransmit ${section}
|
||||
|
||||
if [ "${current_area}" = "${area}" ]; then
|
||||
writeToConfig ' interface "$section" {'
|
||||
write " cost ${cost};" ${cost}
|
||||
write " hello ${hello};" ${hello}
|
||||
write " type ${type};" ${type}
|
||||
write " retransmit ${retransmit};" ${retransmit}
|
||||
write " authentication ${authentication};" ${authentication}
|
||||
config_foreach prepare_ospf_passwords "ospf_password" ${section}
|
||||
# config_foreach prepare_ospf_neighbors "ospf_neighbor" $section
|
||||
writeToConfig " };"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_ospf_area $1
|
||||
prepare_ospf_area() {
|
||||
local section="$1"
|
||||
local instance; local stub; local default_cost
|
||||
|
||||
get instance ${section}
|
||||
get stub ${section}
|
||||
get default_cost ${section}
|
||||
|
||||
writeToConfig " area ${section} {"
|
||||
if [ -n "${instance}" -a "${instance}" = "${section}" ]; then
|
||||
[ -n "${stub}" -a "${stub}" = "1" ] && writeToConfig " stub yes;"
|
||||
[ -n "${default_cost}" ] && writeToConfig " default cost ${default_cost};"
|
||||
config_foreach prepare_ospf_networks "ospf_networks" ${section}
|
||||
config_foreach prepare_ospf_interface "ospf_interface" ${section}
|
||||
writeToConfig " };"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_ospf_instance $1
|
||||
# $1 string
|
||||
# This function gets each "ospf_area" protocol section in the UCI configuration and sets each option in the bird4.conf file.
|
||||
# $1 is set as the ID of the current UCI ospf_area section.
|
||||
prepare_ospf_instance() {
|
||||
local section="$1"
|
||||
local cfg1583compat; local tick
|
||||
|
||||
get cfg1583compat ${section}
|
||||
get tick ${section}
|
||||
|
||||
writeToConfig "protocol ospf ${section} {"
|
||||
[ -n "${cfg1583compat}" ] && cfg1583State="yes" || cfg1583State="no"
|
||||
writeToConfig " rfc1583compat ${cfg1583State};"
|
||||
[ -n "${tick}" ] && writeToConfig " tick ${tick};"
|
||||
config_foreach prepare_ospf_area 'ospf_area'
|
||||
writeToConfig "}"
|
||||
}
|
||||
|
||||
|
||||
# Function: gather_filters
|
||||
# This function gets all the FILES under /filters folder and adds
|
||||
# them into the config as %include elements on top of the file
|
||||
# If there are no filters, the section will remain empty.
|
||||
gather_filters() {
|
||||
writeToConfig "#Filters Section:"
|
||||
for filter in $(find /etc/${BIRD}/filters -type f); do
|
||||
writeToConfig "include \"${filter}\";"
|
||||
done
|
||||
writeToConfig "#End of Filters --"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: gather_functions
|
||||
# This function gets all the FILES under /functions folder and adds
|
||||
# them into the config as %include elements on top of the file
|
||||
# If there are no filters, the section will remain empty.
|
||||
gather_functions() {
|
||||
writeToConfig "#Functions Section:"
|
||||
for func in $(find /etc/${BIRD}/functions -type f); do
|
||||
writeToConfig "include \"${func}\";"
|
||||
done
|
||||
writeToConfig "#End of Functions --"
|
||||
writeToConfig " "
|
||||
}
|
|
@ -1,282 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
-- Repeated Strings
|
||||
local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
|
||||
local imp_string = "Set if the protocol must import routes.<br />" .. common_string
|
||||
local exp_string = "Set if the protocol must export routes.<br />" .. common_string
|
||||
|
||||
m=Map("bird4", "Bird4 BGP protocol's configuration")
|
||||
|
||||
tab_templates = {}
|
||||
uci:foreach('bird4', 'bgp_template', function (s)
|
||||
local name = s[".name"]
|
||||
if (name ~= nil) then
|
||||
table.insert(tab_templates, name)
|
||||
end
|
||||
end)
|
||||
|
||||
--
|
||||
-- BGP TEMPLATES
|
||||
--
|
||||
sect_templates = m:section(TypedSection, "bgp_template", "BGP Templates", "Configuration of the templates used in BGP instances.")
|
||||
sect_templates.addremove = true
|
||||
sect_templates.anonymous = false
|
||||
|
||||
disabled = sect_templates:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
|
||||
disabled.optional=true
|
||||
|
||||
table = sect_templates:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
|
||||
table.optional=true
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
igp_table = sect_templates:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
|
||||
igp_table.optional = true
|
||||
uci:foreach("bird4", "table",
|
||||
function(s)
|
||||
igp_table:value(s.name)
|
||||
end)
|
||||
igp_table:value("")
|
||||
igp_table.default = ""
|
||||
|
||||
import = sect_templates:option(Value, "import", "Import", imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_templates:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
source_addr = sect_templates:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
|
||||
source_addr.optional = true
|
||||
|
||||
local_as = sect_templates:option(Value, "local_as", "Local AS", "")
|
||||
local_as.optional = false
|
||||
|
||||
next_hop_self = sect_templates:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
|
||||
next_hop_self.default = nil
|
||||
next_hop_self.optional = true
|
||||
|
||||
next_hop_keep = sect_templates:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
|
||||
next_hop_keep.default = nil
|
||||
next_hop_keep.optional = true
|
||||
|
||||
rr_client = sect_templates:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
|
||||
rr_client.default = nil
|
||||
rr_client.optional = true
|
||||
|
||||
rr_cluster_id = sect_templates:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
|
||||
rr_cluster_id.optional = true
|
||||
|
||||
import_trigger = sect_templates:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
|
||||
import_trigger.default = 0
|
||||
import_trigger.rmempty = false
|
||||
import_trigger.optional = false
|
||||
|
||||
import_limit = sect_templates:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
|
||||
import_limit:depends({import_trigger = "1"})
|
||||
import_limit.rmempty = true
|
||||
|
||||
import_limit_action = sect_templates:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
|
||||
import_limit_action:depends({import_trigger = "1"})
|
||||
import_limit_action:value("warn")
|
||||
import_limit_action:value("block")
|
||||
import_limit_action:value("disable")
|
||||
import_limit_action:value("restart")
|
||||
import_limit_action.default = "warn"
|
||||
import_limit_action.rmempty = true
|
||||
|
||||
export_trigger = sect_templates:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
|
||||
export_trigger.default = 0
|
||||
export_trigger.rmempty = false
|
||||
export_trigger.optional = false
|
||||
|
||||
export_limit = sect_templates:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
|
||||
export_limit:depends({export_trigger = "1"})
|
||||
export_limit.rmempty = true
|
||||
|
||||
export_limit_action = sect_templates:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
|
||||
export_limit_action:depends({export_trigger = "1"})
|
||||
export_limit_action.rmempty = true
|
||||
export_limit_action:value("warn")
|
||||
export_limit_action:value("block")
|
||||
export_limit_action:value("disable")
|
||||
export_limit_action:value("restart")
|
||||
export_limit_action.default = "warn"
|
||||
|
||||
receive_trigger = sect_templates:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
|
||||
receive_trigger.default = 0
|
||||
receive_trigger.rmempty = false
|
||||
receive_trigger.optional = false
|
||||
|
||||
receive_limit = sect_templates:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
|
||||
receive_limit:depends({receive_trigger = "1"})
|
||||
receive_limit.rmempty = true
|
||||
|
||||
receive_limit_action = sect_templates:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
|
||||
receive_limit_action:depends({receive_trigger = "1"})
|
||||
receive_limit_action:value("warn")
|
||||
receive_limit_action:value("block")
|
||||
receive_limit_action:value("disable")
|
||||
receive_limit_action:value("restart")
|
||||
receive_limit_action.default = "warn"
|
||||
receive_limit_action.rmempty= true
|
||||
|
||||
--
|
||||
-- BGP INSTANCES
|
||||
--
|
||||
sect_instances = m:section(TypedSection, "bgp", "BGP Instances", "Configuration of the BGP protocol instances")
|
||||
sect_instances.addremove = true
|
||||
sect_instances.anonymous = false
|
||||
|
||||
disabled = sect_instances:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
|
||||
disabled.optional = false
|
||||
disabled.rmempty = false
|
||||
disabled.default = nil
|
||||
|
||||
templates = sect_instances:option(ListValue, "template", "Templates", "Available BGP templates")
|
||||
uci:foreach("bird4", "bgp_template",
|
||||
function(s)
|
||||
templates:value(s[".name"])
|
||||
end)
|
||||
templates:value("")
|
||||
|
||||
description = sect_instances:option(TextValue, "description", "Description", "Description of the current BGP instance")
|
||||
description.optional = true
|
||||
|
||||
table = sect_instances:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
|
||||
table.optional=true
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
igp_table = sect_instances:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
|
||||
igp_table.optional = true
|
||||
uci:foreach("bird4", "table",
|
||||
function(s)
|
||||
igp_table:value(s.name)
|
||||
end)
|
||||
igp_table:value("")
|
||||
igp_table.default = ""
|
||||
|
||||
passive = sect_instances:option(Flag, "passive", "Passive", "Disable automatic initialization of outgoing connections.")
|
||||
passive.optional=true
|
||||
passive.rmempty = false
|
||||
passive.default = nil
|
||||
|
||||
import = sect_instances:option(Value, "import", "Import", imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_instances:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
source_address = sect_instances:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
|
||||
source_address.optional = true
|
||||
|
||||
local_as = sect_instances:option(Value, "local_as", "Local AS", "")
|
||||
local_as.optional=true
|
||||
|
||||
neighbor_address = sect_instances:option(Value, "neighbor_address", "Neighbor IP Address", "")
|
||||
neighbor_address.optional = false
|
||||
|
||||
neighbor_as = sect_instances:option(Value, "neighbor_as", "Neighbor AS", "")
|
||||
neighbor_as.optional = false
|
||||
|
||||
next_hop_self = sect_instances:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
|
||||
next_hop_self.default = nil
|
||||
next_hop_self.optional = true
|
||||
|
||||
next_hop_keep = sect_instances:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
|
||||
next_hop_keep.default = nil
|
||||
next_hop_keep.optional = true
|
||||
|
||||
rr_client = sect_instances:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
|
||||
rr_client.default = nil
|
||||
rr_client.optional = true
|
||||
|
||||
rr_cluster_id = sect_instances:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
|
||||
rr_cluster_id.optional = true
|
||||
|
||||
import_trigger = sect_instances:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
|
||||
import_trigger.default = 0
|
||||
import_trigger.rmempty = false
|
||||
import_trigger.optional = false
|
||||
|
||||
import_limit = sect_instances:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
|
||||
import_limit:depends({import_trigger = "1"})
|
||||
import_limit.rmempty = true
|
||||
|
||||
import_limit_action = sect_instances:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
|
||||
import_limit_action:depends({import_trigger = "1"})
|
||||
import_limit_action:value("warn")
|
||||
import_limit_action:value("block")
|
||||
import_limit_action:value("disable")
|
||||
import_limit_action:value("restart")
|
||||
import_limit_action.default = "warn"
|
||||
import_limit_action.rmempty = true
|
||||
|
||||
export_trigger = sect_instances:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
|
||||
export_trigger.default = 0
|
||||
export_trigger.rmempty = false
|
||||
export_trigger.optional = false
|
||||
|
||||
export_limit = sect_instances:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
|
||||
export_limit:depends({export_trigger = "1"})
|
||||
export_limit.rmempty = true
|
||||
|
||||
export_limit_action = sect_instances:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
|
||||
export_limit_action:depends({export_trigger = "1"})
|
||||
export_limit_action:value("warn")
|
||||
export_limit_action:value("block")
|
||||
export_limit_action:value("disable")
|
||||
export_limit_action:value("restart")
|
||||
export_limit_action.default = "warn"
|
||||
export_limit_action.rmempty= true
|
||||
|
||||
receive_trigger = sect_instances:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
|
||||
receive_trigger.default = 0
|
||||
receive_trigger.rmempty = false
|
||||
receive_trigger.optional = false
|
||||
|
||||
receive_limit = sect_instances:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
|
||||
receive_limit:depends({receive_trigger = "1"})
|
||||
receive_limit.rmempty = true
|
||||
|
||||
receive_limit_action = sect_instances:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
|
||||
receive_limit_action:depends({receive_trigger = "1"})
|
||||
receive_limit_action:value("warn")
|
||||
receive_limit_action:value("block")
|
||||
receive_limit_action:value("disable")
|
||||
receive_limit_action:value("restart")
|
||||
receive_limit_action.default = "warn"
|
||||
receive_limit_action.rmempty= true
|
||||
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird4 restart')
|
||||
end
|
||||
return m
|
|
@ -1,77 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local filters_dir = "/etc/bird4/filters/"
|
||||
local lock_file = "/etc/bird4/filter_lock"
|
||||
|
||||
m = SimpleForm("bird4", "Bird4 Filters", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
files = s:option(ListValue, "Files", "Filter Files:")
|
||||
local new_filter = filters_dir .. os.date("filter-%Y%m%d-%H%M")
|
||||
|
||||
-- New File Entry
|
||||
files:value(new_filter, "New File (".. new_filter .. ")")
|
||||
files.default = new_filter
|
||||
|
||||
local i, file_list = 0, { }
|
||||
for filename in io.popen("find " .. filters_dir .. " -type f"):lines() do
|
||||
i = i + 1
|
||||
files:value(filename, filename)
|
||||
end
|
||||
|
||||
ld = s:option(Button, "_load", "Load File")
|
||||
ld.inputstyle = "reload"
|
||||
|
||||
st_file = s:option(DummyValue, "_stfile", "Editing file:")
|
||||
function st_file.cfgvalue(self, section)
|
||||
if ld:formvalue(section) then
|
||||
fs.writefile(lock_file, files:formvalue(section))
|
||||
return files:formvalue(section)
|
||||
else
|
||||
fs.writefile(lock_file, "")
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
area = s:option(Value, "_filters")
|
||||
area.template = "bird4/tvalue"
|
||||
area.rows = 30
|
||||
function area.cfgvalue(self,section)
|
||||
if ld:formvalue(section) then
|
||||
local contents = fs.readfile(files:formvalue(section))
|
||||
if contents then
|
||||
return contents
|
||||
else
|
||||
return ""
|
||||
end
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function area.write(self, section)
|
||||
local locked_file = fs.readfile(lock_file)
|
||||
if locked_file and not ld:formvalue(section) then
|
||||
local text = self:formvalue(section):gsub("\r\n?", "\n")
|
||||
fs.writefile(locked_file, text)
|
||||
fs.writefile(lock_file, "")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,77 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local functions_dir = "/etc/bird4/functions/"
|
||||
local lock_file = "/etc/bird4/function_lock"
|
||||
|
||||
m = SimpleForm("bird4", "Bird4 Functions", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
files = s:option(ListValue, "Files", "Function Files:")
|
||||
local new_function = functions_dir .. os.date("function-%Y%m%d-%H%M")
|
||||
|
||||
-- New File Entry
|
||||
files:value(new_function, "New File (".. new_function .. ")")
|
||||
files.default = new_function
|
||||
|
||||
local i, file_list = 0, { }
|
||||
for filename in io.popen("find " .. functions_dir .. " -type f"):lines() do
|
||||
i = i + 1
|
||||
files:value(filename, filename)
|
||||
end
|
||||
|
||||
ld = s:option(Button, "_load", "Load File")
|
||||
ld.inputstyle = "reload"
|
||||
|
||||
st_file = s:option(DummyValue, "_stfile", "Editing file:")
|
||||
function st_file.cfgvalue(self, section)
|
||||
if ld:formvalue(section) then
|
||||
fs.writefile(lock_file, files:formvalue(section))
|
||||
return files:formvalue(section)
|
||||
else
|
||||
fs.writefile(lock_file, "")
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
area = s:option(Value, "_functions")
|
||||
area.template = "bird4/tvalue"
|
||||
area.rows = 30
|
||||
function area.cfgvalue(self,section)
|
||||
if ld:formvalue(section) then
|
||||
local contents = fs.readfile(files:formvalue(section))
|
||||
if contents then
|
||||
return contents
|
||||
else
|
||||
return ""
|
||||
end
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function area.write(self, section)
|
||||
local locked_file = fs.readfile(lock_file)
|
||||
if locked_file and not ld:formvalue(section) then
|
||||
local text = self:formvalue(section):gsub("\r\n?", "\n")
|
||||
fs.writefile(locked_file, text)
|
||||
fs.writefile(lock_file, "")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,263 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
-- Repeated Strings
|
||||
local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
|
||||
local imp_string = "Set if the protocol must import routes.<br />" .. common_string
|
||||
local exp_string = "Set if the protocol must export routes.<br />" .. common_string
|
||||
|
||||
m=Map("bird4", "Bird4 general protocol's configuration.")
|
||||
|
||||
-- Optional parameters lists
|
||||
local protoptions = {
|
||||
{["name"]="table", ["help"]="Auxiliar table for routing", ["depends"]={"static","kernel"}},
|
||||
{["name"]="import", ["help"]=imp_string, ["depends"]={"kernel"}},
|
||||
{["name"]="export", ["help"]=exp_string, ["depends"]={"kernel"}},
|
||||
{["name"]="scan_time", ["help"]="Time between scans", ["depends"]={"kernel","device"}},
|
||||
{["name"]="kernel_table", ["help"]="Set which table must be used as auxiliar kernel table", ["depends"]={"kernel"}},
|
||||
{["name"]="learn", ["help"]="Learn routes", ["depends"]={"kernel"}},
|
||||
{["name"]="persist", ["help"]="Store routes. After a restart, routes willstill be configured", ["depends"]={"kernel"}}
|
||||
}
|
||||
|
||||
local routeroptions = {
|
||||
{["name"]="prefix",["help"]="",["depends"]={"router","special","iface","multipath","recursive"}},
|
||||
{["name"]="via",["help"]="",["depends"]={"router","multipath"}},
|
||||
{["name"]="attribute",["help"]="",["depends"]={"special"}},
|
||||
{["name"]="iface",["help"]="",["depends"]={"iface"}},
|
||||
{["name"]="ip",["help"]="",["depends"]={"recursive"}}
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
-- KERNEL PROTOCOL
|
||||
--
|
||||
sect_kernel_protos = m:section(TypedSection, "kernel", "Kernel options", "Configuration of the kernel protocols. First Instance MUST be Primary table (no table or kernel_table fields).")
|
||||
sect_kernel_protos.addremove = true
|
||||
sect_kernel_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
disabled = sect_kernel_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "kernel" then
|
||||
if o.name == "learn" or o.name == "persist" then
|
||||
value = sect_kernel_protos:option(Flag, o.name, translate(o.name), translate(o.help))
|
||||
elseif o.name == "table" then
|
||||
value = sect_kernel_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
value:value(s.name)
|
||||
end)
|
||||
value:value("")
|
||||
value.default = ""
|
||||
else
|
||||
value = sect_kernel_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
end
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- DEVICE PROTOCOL
|
||||
--
|
||||
sect_device_protos = m:section(TypedSection, "device", "Device options", "Configuration of the device protocols.")
|
||||
sect_device_protos.addremove = true
|
||||
sect_device_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
|
||||
disabled = sect_device_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "device" then
|
||||
value = sect_device_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- PIPE PROTOCOL
|
||||
--
|
||||
sect_pipe_protos = m:section(TypedSection, "pipe", "Pipe options", "Configuration of the Pipe protocols.")
|
||||
sect_pipe_protos.addremove = true
|
||||
sect_pipe_protos.anonymous = false
|
||||
|
||||
-- Default Pipe parameters
|
||||
disabled = sect_pipe_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
|
||||
disabled.default=0
|
||||
|
||||
table = sect_pipe_protos:option(ListValue, "table", "Table", "Select the Primary Table to connect.")
|
||||
table.optional = false
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
peer_table = sect_pipe_protos:option(ListValue, "peer_table", "Peer Table", "Select the Secondary Table to connect.")
|
||||
table.optional = false
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
peer_table:value(s.name)
|
||||
end)
|
||||
peer_table:value("")
|
||||
peer_table.default = ""
|
||||
|
||||
mode = sect_pipe_protos:option(ListValue, "mode", "Mode", "Select <b>transparent</b> to retransmit all routes and their attributes<br />Select <b>opaque</b> to retransmit optimal routes (similar to what other protocols do)")
|
||||
mode.optional = false
|
||||
mode:value("transparent")
|
||||
mode:value("opaque")
|
||||
mode.default = "transparent"
|
||||
|
||||
import = sect_pipe_protos:option(Value, "import", "Import",imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_pipe_protos:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
|
||||
--
|
||||
-- DIRECT PROTOCOL
|
||||
--
|
||||
sect_direct_protos = m:section(TypedSection, "direct", "Direct options", "Configuration of the Direct protocols.")
|
||||
sect_direct_protos.addremove = true
|
||||
sect_direct_protos.anonymous = false
|
||||
|
||||
-- Default Direct parameters
|
||||
disabled = sect_direct_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
|
||||
disabled.optional = false
|
||||
disabled.default = 0
|
||||
|
||||
interface = sect_direct_protos:option(Value, "interface", "Interfaces", "By default Direct will generate device routes for all the interfaces. To restrict this behaviour, select a number of patterns to match your desired interfaces:" .. "<br />" .. "1. All the strings <b>MUST</b> be quoted: \"pattern\"" .. "<br />" .. "2. Use * (star) to match patterns: \"eth*\" (<b>include</b> all eth... interfaces)" .. "<br />" .. "3. You can add \"-\" (minus) to exclude patterns: \"-em*\" (<b>exclude</b> all em... interfaces)." .. "<br />" .. "4. Separate several patterns using , (coma): \"-em*\", \"eth*\" (<b>exclude</b> em... and <b>include</b> all eth... interfaces).")
|
||||
interface.optional = false
|
||||
interface.default = "\"*\""
|
||||
|
||||
|
||||
--
|
||||
-- STATIC PROTOCOL
|
||||
--
|
||||
sect_static_protos = m:section(TypedSection, "static", "Static options", "Configuration of the static protocols.")
|
||||
sect_static_protos.addremove = true
|
||||
sect_static_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
disabled = sect_static_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "static" then
|
||||
if o.name == "table" then
|
||||
value = sect_static_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
|
||||
uci:foreach("bird4", "table",
|
||||
function (s)
|
||||
value:value(s.name)
|
||||
end)
|
||||
value:value("")
|
||||
value.default = ""
|
||||
else
|
||||
value = sect_static_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
end
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- ROUTES FOR STATIC PROTOCOL
|
||||
--
|
||||
sect_routes = m:section(TypedSection, "route", "Routes configuration", "Configuration of the routes used in static protocols.")
|
||||
sect_routes.addremove = true
|
||||
sect_routes.anonymous = true
|
||||
|
||||
instance = sect_routes:option(ListValue, "instance", "Route instance", "")
|
||||
i = 0
|
||||
uci:foreach("bird4", "static",
|
||||
function (s)
|
||||
instance:value(s[".name"])
|
||||
end)
|
||||
|
||||
prefix = sect_routes:option(Value, "prefix", "Route prefix", "")
|
||||
|
||||
type = sect_routes:option(ListValue, "type", "Type of route", "")
|
||||
type:value("router")
|
||||
type:value("special")
|
||||
type:value("iface")
|
||||
type:value("recursive")
|
||||
type:value("multipath")
|
||||
|
||||
valueVia = sect_routes:option(Value, "via", "Via", "")
|
||||
valueVia.optional = false
|
||||
valueVia:depends("type", "router")
|
||||
valueVia.datatype = "ip4addr"
|
||||
|
||||
listVia = sect_routes:option(DynamicList, "l_via", "Via", "")
|
||||
listVia:depends("type", "multipath")
|
||||
listVia.optional=false
|
||||
listVia.datatype = "ip4addr"
|
||||
|
||||
attribute = sect_routes:option(ListValue, "attribute", "Attribute", "")
|
||||
attribute:depends("type", "special")
|
||||
attribute:value("unreachable")
|
||||
attribute:value("prohibit")
|
||||
attribute:value("blackhole")
|
||||
|
||||
iface = sect_routes:option(ListValue, "iface", "Interface", "")
|
||||
iface:depends("type", "iface")
|
||||
uci:foreach("network", "interface",
|
||||
function(section)
|
||||
if section[".name"] ~= "loopback" then
|
||||
iface:value(section[".name"])
|
||||
end
|
||||
end)
|
||||
|
||||
ip = sect_routes:option(Value, "ip", "IP address", "")
|
||||
ip:depends("type", "ip")
|
||||
ip.datatype = [[ or"ip4addr", "ip6addr" ]]
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird4 restart')
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,76 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = require "luci.model.uci"
|
||||
local uciout = uci.cursor()
|
||||
|
||||
m=Map("bird4", "Bird4 UCI configuration helper", "")
|
||||
|
||||
-- Named section: "bird"
|
||||
|
||||
s_bird_uci = m:section(NamedSection, "bird", "bird", "Bird4 file settings", "")
|
||||
s_bird_uci.addremove = False
|
||||
|
||||
uuc = s_bird_uci:option(Flag, "use_UCI_config", "Use UCI configuration", "Use UCI configuration instead of the /etc/bird4.conf file")
|
||||
|
||||
ucf = s_bird_uci:option(Value, "UCI_config_file", "UCI File", "Specify the file to place the UCI-translated configuration")
|
||||
ucf.default = "/tmp/bird4.conf"
|
||||
|
||||
-- Named Section: "table"
|
||||
|
||||
s_bird_table = m:section(TypedSection, "table", "Tables configuration", "Configuration of the tables used in the protocols")
|
||||
s_bird_table.addremove = true
|
||||
s_bird_table.anonymous = true
|
||||
|
||||
name = s_bird_table:option(Value, "name", "Table name", "Descriptor ID of the table")
|
||||
|
||||
-- Named section: "global"
|
||||
|
||||
s_bird_global = m:section(NamedSection, "global", "global", "Global options", "Basic Bird4 settings")
|
||||
s_bird_global.addremove = False
|
||||
|
||||
id = s_bird_global:option(Value, "router_id", "Router ID", "Identification number of the router. By default, is the router's IP.")
|
||||
|
||||
lf = s_bird_global:option(Value, "log_file", "Log File", "File used to store log related data.")
|
||||
|
||||
l = s_bird_global:option(MultiValue, "log", "Log", "Set which elements do you want to log.")
|
||||
l:value("all", "All")
|
||||
l:value("info", "Info")
|
||||
l:value("warning","Warning")
|
||||
l:value("error","Error")
|
||||
l:value("fatal","Fatal")
|
||||
l:value("debug","Debug")
|
||||
l:value("trace","Trace")
|
||||
l:value("remote","Remote")
|
||||
l:value("auth","Auth")
|
||||
|
||||
d = s_bird_global:option(MultiValue, "debug", "Debug", "Set which elements do you want to debug.")
|
||||
d:value("all", "All")
|
||||
d:value("states","States")
|
||||
d:value("routes","Routes")
|
||||
d:value("filters","Filters")
|
||||
d:value("interfaces","Interfaces")
|
||||
d:value("events","Events")
|
||||
d:value("packets","Packets")
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird4 restart')
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,53 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local sys = require "luci.sys"
|
||||
|
||||
m = SimpleForm("bird4", "Bird4 Daemon Status Page", "This page let you Start, Stop, Restart and check Bird4 Service Status.")
|
||||
m.reset = false
|
||||
m.submit = false
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
|
||||
start = s:option(Button, "_start", "Start Bird4 Daemon:")
|
||||
start.inputtitle = " Start "
|
||||
start.inputstyle = "apply"
|
||||
|
||||
stop = s:option(Button, "_stop", "Stop Bird4 Daemon:")
|
||||
stop.inputtitle = " Stop "
|
||||
stop.inputstyle = "remove"
|
||||
|
||||
restart = s:option(Button, "_restart", "Restart Bird4 Daemon:")
|
||||
restart.inputtitle = "Restart"
|
||||
restart.inputstyle = "reload"
|
||||
|
||||
output = s:option(DummyValue, "_value", "Service Status")
|
||||
function output.cfgvalue(self, section)
|
||||
local ret = ""
|
||||
if start:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird4 start_quiet")
|
||||
elseif stop:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird4 stop_quiet")
|
||||
elseif restart:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird4 restart_quiet")
|
||||
else
|
||||
ret = sys.exec("/etc/init.d/bird4 status_quiet")
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,33 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# This UCI-Defaults script will MOVE any pre-existing filter
|
||||
# stored in a file and configured as an UCI item (deprecated)
|
||||
# The script will try to match any "filter" Section, get its
|
||||
# "file_path" property and move the file (if exists) to the
|
||||
# new (v0.3+) default location: /etc/bird{4|6}/filters
|
||||
|
||||
[ $# -ne 1 ] && exit 1
|
||||
BIRD="$1"
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
# This function will move an existing folder configured on
|
||||
# Bird as a "filter" to filters' folder.
|
||||
mv_filter() {
|
||||
local section="$1"
|
||||
local file_path
|
||||
config_get file_path ${section} file_path
|
||||
|
||||
if [ -f ${file_path} ]; then
|
||||
mv ${file_path} /etc/${BIRD}/filters/
|
||||
fi
|
||||
uci delete ${BIRD}.${section}
|
||||
}
|
||||
|
||||
if [ -f /etc/config/${BIRD} ]; then
|
||||
config_load ${BIRD}
|
||||
config_foreach mv_filter 'filter'
|
||||
uci commit ${BIRD}
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -1,13 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ $# -ne 1 ] && exit 1
|
||||
|
||||
BIRD=$1
|
||||
|
||||
EXC=`mount -t overlayfs | grep overlayfs -c`
|
||||
|
||||
[ $EXC > 0 ] && rm -r /etc/init.d/${BIRD} || mv /etc/init.d/${BIRD} /etc/${BIRD}/init.d/${BIRD}.orig
|
||||
|
||||
ln -s /etc/${BIRD}/init.d/${BIRD} /etc/init.d/${BIRD}
|
||||
|
||||
exit 0
|
|
@ -1,41 +0,0 @@
|
|||
<%-
|
||||
-- Only populate textarea through XHR.poll
|
||||
-- "refresh" is present in the URL (.../log?refresh=1)
|
||||
if luci.http.formvalue("refresh") then
|
||||
|
||||
-- Force HTTP Contents to be "text/plain"
|
||||
luci.http.prepare_content("text/plain")
|
||||
|
||||
local sys = require("luci.sys")
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
|
||||
-- Get Log File from Bird's configuration or leave it empty.
|
||||
local log_file = uci:get("bird4", "global", "log_file") or ""
|
||||
local log_size = ""
|
||||
if log_file then
|
||||
log_size = sys.exec("du -h " .. log_file .. " | awk '{print $1}'")
|
||||
-- Gathering last 30 lines of the Log File.
|
||||
lf = sys.exec("tail -n30 " .. log_file):gsub("\r\n?", "\n")
|
||||
end
|
||||
|
||||
-- Write File used and its contents.
|
||||
luci.http.write("Using Log File: " .. log_file .. " - File Size: " .. log_size .. "\n" .. lf)
|
||||
|
||||
-- Avoid printing the rest of the page (return only text log data)
|
||||
return
|
||||
end
|
||||
-%>
|
||||
|
||||
<%+header%>
|
||||
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
// Refresh page each second. Use "refresh=1" as trigger.
|
||||
XHR.poll(1, '<%=url('admin/network/bird4/log')%>', { refresh: 1 }, function(xhrInstance) {
|
||||
var area = document.getElementById('log')
|
||||
area.value = xhrInstance.responseText;
|
||||
});
|
||||
//]]></script>
|
||||
|
||||
|
||||
<textarea readonly="readonly" style="width: 100%" wrap="on" rows="32" id="log"><%=lf:pcdata()%></textarea>
|
||||
<%+footer%>
|
|
@ -1,5 +0,0 @@
|
|||
<%+cbi/valueheader%>
|
||||
<textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 100%; font: normal 11pt 'Courier New'"<% else %> cols="<%=self.size%>"<% end %> data-update="change"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap") .. ifattr(self.readonly, "readonly") %>>
|
||||
<%-=pcdata(self:cfgvalue(section))-%>
|
||||
</textarea>
|
||||
<%+cbi/valuefooter%>
|
|
@ -1,102 +0,0 @@
|
|||
# Copyright (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/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
BIRD := bird6
|
||||
PKG_NAME := $(BIRD)-openwrt
|
||||
PKG_VERSION := 0.3
|
||||
PKG_RELEASE := 1
|
||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||
PKG_LICENSE := GPL-3.0+
|
||||
uci := $(BIRD)-uci
|
||||
luci := luci-app-$(BIRD)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Build/Prepare
|
||||
endef
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/$(uci)
|
||||
TITLE:=The BIRD UCI module
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
|
||||
URL:=https://github.com/eloicaso/bird-openwrt/
|
||||
DEPENDS:=+$(BIRD) +libuci +uci
|
||||
endef
|
||||
|
||||
define Package/$(uci)/description
|
||||
$(BIRD) UCI integration module
|
||||
endef
|
||||
|
||||
define Package/$(uci)/conffiles
|
||||
/etc/config/$(BIRD)
|
||||
endef
|
||||
|
||||
define Package/$(uci)/install
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD)/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD)/filters
|
||||
$(INSTALL_DIR) $(1)/etc/$(BIRD)/functions
|
||||
$(INSTALL_BIN) ./src/init.d/$(BIRD)* $(1)/etc/$(BIRD)/init.d/
|
||||
$(CP) ./src/uci-defaults/* $(1)/etc/$(BIRD)/init.d/
|
||||
$(INSTALL_CONF) ./src/config/$(BIRD) $(1)/etc/config/
|
||||
endef
|
||||
|
||||
define Package/$(uci)/postinst
|
||||
#!/bin/sh
|
||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||
( . /etc/$(BIRD)/init.d/bird-uci-install-init.d $(BIRD) ) && rm -f /etc/$(BIRD)/init.d/bird-uci-install-init.d
|
||||
( . /etc/$(BIRD)/init.d/99-relocate-filters $(BIRD) ) && rm -f /etc/$(BIRD)/init.d/99-relocate-filters
|
||||
if [ -f /etc/sysupgrade.conf ] && ! grep $(BIRD) /etc/sysupgrade.conf; then
|
||||
echo /etc/config/$(BIRD) >> /etc/sysupgrade.conf
|
||||
echo /etc/$(BIRD)/filters/ >> /etc/sysupgrade.conf
|
||||
echo /etc/$(BIRD)/functions/ >> /etc/sysupgrade.conf
|
||||
fi
|
||||
fi
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(uci)))
|
||||
|
||||
define Package/$(luci)
|
||||
TITLE:=LuCI support for $(BIRD)
|
||||
SECTION:=luci
|
||||
CATEGORY:=LuCI
|
||||
SUBMENU:=3. Applications
|
||||
MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
|
||||
URL:=https://github.com/eloicaso/bird-openwrt/
|
||||
DEPENDS:=+$(BIRD)-uci +luci-base
|
||||
endef
|
||||
|
||||
define Package/$(luci)/description
|
||||
$(BIRD) application for LuCI
|
||||
endef
|
||||
|
||||
define Package/$(luci)/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/$(BIRD)/
|
||||
$(CP) ./src/model/* $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
|
||||
$(CP) ./src/controller/* $(1)/usr/lib/lua/luci/controller/
|
||||
$(CP) ./src/view/* $(1)/usr/lib/lua/luci/view/$(BIRD)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(luci)))
|
|
@ -1,36 +0,0 @@
|
|||
config bird 'bird'
|
||||
option use_UCI_config '1'
|
||||
#Caution! Enabling this option, Bird will translate this
|
||||
#UCI file and use it instead of /etc/bird6.conf
|
||||
option UCI_config_file '/tmp/bird6.conf'
|
||||
#If you enable useUCIconfig, UCIconfigFile will be Bird's
|
||||
#configuration file location.
|
||||
|
||||
config global 'global'
|
||||
option log_file '/tmp/bird6.log'
|
||||
option log 'all'
|
||||
option debug 'off'
|
||||
# This option is set up because is mandatory for Bird6.
|
||||
# Change it to your IPv4 Address or a HEX value.
|
||||
option router_id '0xCAFEBABE'
|
||||
|
||||
config table
|
||||
option name 'aux'
|
||||
|
||||
config kernel kernel1
|
||||
option table 'aux'
|
||||
option import 'all'
|
||||
option export 'all'
|
||||
option kernel_table '100'
|
||||
option scan_time '10'
|
||||
option learn '1'
|
||||
option persist '0'
|
||||
option disabled '0'
|
||||
|
||||
config device device1
|
||||
option scan_time '10'
|
||||
option disabled '0'
|
||||
|
||||
config static static1
|
||||
option table 'aux'
|
||||
option disabled '0'
|
|
@ -1,52 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
module("luci.controller.bird6", package.seeall)
|
||||
|
||||
function index()
|
||||
entry({"admin","network","bird6"},
|
||||
alias("admin","network","bird6","status"),
|
||||
_("Bird6"), 0)
|
||||
|
||||
entry({"admin", "network", "bird6", "status"},
|
||||
cbi("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"},
|
||||
cbi("bird6/filters"),
|
||||
_("Filters"), 5).leaf = true
|
||||
|
||||
entry({"admin","network","bird6","functions"},
|
||||
cbi("bird6/functions"),
|
||||
_("Functions"), 6).leaf = true
|
||||
end
|
|
@ -1,225 +0,0 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
|
||||
# Copyright (C) 2014-2017 - Eloi Carbo
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# Extra Service Function to get the Status of the Service
|
||||
# This complements /etc/rc.common functions
|
||||
# Commands ending with *_quiet are meant to be ran in Luci. These
|
||||
# scripts' return minimal output.
|
||||
EXTRA_COMMANDS="status start_quiet stop_quiet restart_quiet status_quiet"
|
||||
EXTRA_HELP=" status Returns service status"
|
||||
|
||||
BIRD="bird6"
|
||||
BIRD_CONFIG="/etc/${BIRD}.conf"
|
||||
BIRD_LOG="/var/log/${BIRD}.log"
|
||||
BIRD_ERR="/tmp/${BIRD}.err"
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_USE_PID=1
|
||||
SERVICE_PID_FILE="/var/run/${BIRD}.pid"
|
||||
|
||||
BIRD_BIN="/usr/sbin/${BIRD}"
|
||||
# Special non-terminal-rich output for Luci calls
|
||||
LUCI="false"
|
||||
|
||||
. /etc/${BIRD}/init.d/${BIRD}-lib.sh
|
||||
|
||||
start() {
|
||||
config_load ${BIRD}
|
||||
local use_UCI_config
|
||||
get use_UCI_config 'bird'
|
||||
|
||||
#Start the service
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo "Starting ${BIRD} Service [ ... ]"
|
||||
fi
|
||||
if [ -f ${BIRD_ERR} ]; then
|
||||
echo "" > ${BIRD_ERR}
|
||||
else
|
||||
touch ${BIRD_ERR}
|
||||
fi
|
||||
|
||||
if [ -z "${use_UCI_config}" -o "${use_UCI_config}" = "0" ]; then
|
||||
# Disable Custom bird-openwrt settings.
|
||||
# Use default behaviour and files
|
||||
${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &> ${BIRD_ERR} &
|
||||
else
|
||||
#Set Bird6 configuration location:
|
||||
local UCI_config_file
|
||||
local log_file
|
||||
get UCI_config_file 'bird'
|
||||
get log_file 'global'
|
||||
BIRD_CONFIG="${UCI_config_file:-$BIRD_CONFIG}"
|
||||
BIRD_LOG="${log_file:-$BIRD_LOG}"
|
||||
#Backup previous configuration
|
||||
[ -f ${BIRD_CONFIG} ] && cp ${BIRD_CONFIG} ${BIRD_CONFIG}.bak
|
||||
#Setup the basic configuration
|
||||
prepare_global 'global'
|
||||
|
||||
# Gather and set all Functions
|
||||
gather_functions
|
||||
# Gather and set all Filters
|
||||
gather_filters
|
||||
|
||||
# Setup Main Protocols
|
||||
config_foreach prepare_kernel 'kernel'
|
||||
config_foreach prepare_static 'static'
|
||||
config_foreach prepare_device 'device'
|
||||
config_foreach prepare_direct 'direct'
|
||||
config_foreach prepare_pipe 'pipe'
|
||||
|
||||
#Setup protocol's configuration: BGP
|
||||
config_foreach prepare_bgp_template 'bgp_template'
|
||||
config_foreach prepare_bgp 'bgp'
|
||||
|
||||
#Setup protocol's configuration: OSPF
|
||||
#config_foreach prepare_ospf_instance 'ospf'
|
||||
|
||||
#Start the service
|
||||
${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &>${BIRD_ERR} &
|
||||
fi
|
||||
while [ ! -s ${SERVICE_PID_FILE} ]; do
|
||||
sleep 1
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Start Status: \033[0;31m[ FAILED ]\e[m"
|
||||
cat ${BIRD_ERR}
|
||||
cat ${BIRD_ERR} >> ${BIRD_LOG}
|
||||
else
|
||||
echo "${BIRD} - Failed: $(cat ${BIRD_ERR})"
|
||||
cat ${BIRD_ERR} >> ${BIRD_LOG}
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon already started. Status \033[0;32m[ RUNNING ]\e[m"
|
||||
else
|
||||
echo "${BIRD} already started"
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Start Status: \033[0;32m[ STARTED ]\e[m"
|
||||
else
|
||||
echo "${BIRD} - Started"
|
||||
fi
|
||||
fi
|
||||
# PID File found (service started correctly)
|
||||
return 0
|
||||
fi
|
||||
|
||||
# PID File not found (error while starting service)
|
||||
return 1
|
||||
}
|
||||
|
||||
stop() {
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
config_load ${BIRD}
|
||||
local log_file
|
||||
get log_file 'global'
|
||||
BIRD_LOG="${log_file:-$BIRD_LOG}"
|
||||
start-stop-daemon -p ${SERVICE_PID_FILE} -K 2>&1 >> ${BIRD_LOG}
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Stop Status: \033[0;32m[ OK ]\e[m"
|
||||
else
|
||||
echo "${BIRD} - Stopped"
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Stop Status: \033[0;31m[ FAILED ]\e[m"
|
||||
echo "Check ${BIRD_LOG} file for more information."
|
||||
else
|
||||
echo "${BIRD} Failed to Stop. See Log file: ${BIRD_LOG}"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} Daemon Service already stopped. \033[0;31m[ FAILED ]\e[m"
|
||||
else
|
||||
echo "${BIRD} already stopped"
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
restart() {
|
||||
stop
|
||||
sleep 1
|
||||
if [ "${LUCI}" == "true" ]; then
|
||||
echo " ... "
|
||||
fi
|
||||
start
|
||||
}
|
||||
|
||||
reload() {
|
||||
service_reload ${BIRD_BIN}
|
||||
}
|
||||
|
||||
status() {
|
||||
if [ -s ${SERVICE_PID_FILE} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} start status: \033[0;32m[ RUNNING ]\e[m"
|
||||
else
|
||||
echo "${BIRD}: Running"
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
if [ -s ${BIRD_ERR} ]; then
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
|
||||
cat ${BIRD_ERR}
|
||||
else
|
||||
echo "${BIRD}: Failed - $(cat ${BIRD_ERR})"
|
||||
fi
|
||||
return 2
|
||||
else
|
||||
if [ "${LUCI}" == "false" ]; then
|
||||
echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m"
|
||||
else
|
||||
echo "${BIRD}: Stopped"
|
||||
fi
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Luci-specific calls (stripped output).
|
||||
# The following scripts are not meant to be ran using Ash Terminal
|
||||
# Used in: LUCI/model/cbi/bird6/status.lua
|
||||
start_quiet() {
|
||||
LUCI="true"
|
||||
start
|
||||
}
|
||||
stop_quiet() {
|
||||
LUCI="true"
|
||||
stop
|
||||
}
|
||||
restart_quiet() {
|
||||
LUCI="true"
|
||||
restart
|
||||
}
|
||||
status_quiet() {
|
||||
LUCI="true"
|
||||
status
|
||||
}
|
|
@ -1,473 +0,0 @@
|
|||
# Bird6-OpenWRT Library - Functions used in /etc/init.d/bird6 script.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2014-2017 - Eloi Carbo
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
# Function: writeToConfig $1
|
||||
# $1 string.
|
||||
# Allows to write in the $BIRD_CONFIG file, the string $1. This function does not check the $1 string.
|
||||
# Example: writeToConfig "value: $N"
|
||||
writeToConfig() {
|
||||
echo "$1" >> ${BIRD_CONFIG}
|
||||
}
|
||||
|
||||
|
||||
# Function: write $1 $2
|
||||
# $1 string. $2 string.
|
||||
# This function checks if $2 is empty. If not, it writes the string $1 in the $BIRD_CONFIG file.
|
||||
# Use write function to check if $1, value found inside $2, is not empty and can be written in the configuration file.
|
||||
# Example: N=""; write "value: $N" $N;
|
||||
write() {
|
||||
[ -n "$2" ] && writeToConfig "$1"
|
||||
}
|
||||
|
||||
|
||||
#Function: write_bool $1 $2
|
||||
# $1 string; $2 boolean
|
||||
# This function checks if $2 is true or false and write the $1 string into $BIRD_CONFIG file.
|
||||
# The function writes a # before the $2 string if its false.
|
||||
# Example: local N=0; write_bool $N
|
||||
write_bool() {
|
||||
[ "$2" == 0 ] && writeToConfig "# $1;" || writeToConfig " $1;"
|
||||
}
|
||||
|
||||
|
||||
# Function: get $1 $2
|
||||
# $1 string. $2 string
|
||||
# This function uses the external UCI function "config_get $result $section $option" to obtain a string value from UCI config file.
|
||||
# To use this function, use the same name of the UCI option for the variable.
|
||||
# Example: UCI (option id 'abcd'); local id; get id $section
|
||||
get() {
|
||||
config_get $1 $2 $1
|
||||
}
|
||||
|
||||
|
||||
# Function: get_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
|
||||
get_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_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_bool disabled ${section}
|
||||
get_bool next_hop_self ${section}
|
||||
get_bool next_hop_keep ${section}
|
||||
get table ${section}
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
get local_address ${section}
|
||||
get local_as ${section}
|
||||
get igp_table ${section}
|
||||
get rr_client ${section}
|
||||
get rr_cluster_id ${section}
|
||||
get import_limit ${section}
|
||||
get import_limit_action ${section}
|
||||
get export_limit ${section}
|
||||
get export_limit_action ${section}
|
||||
get receive_limit ${section}
|
||||
get receive_limit_action ${section}
|
||||
get neighbor_address ${section}
|
||||
get neighbor_as ${section}
|
||||
|
||||
writeToConfig "#${section} template:"
|
||||
writeToConfig "template bgp ${section} {"
|
||||
[ -n "${disabled}" ] && write_bool disabled ${disabled}
|
||||
write " table ${table};" ${table}
|
||||
write " local as ${local_as};" ${local_as}
|
||||
write " source address ${local_address};" ${local_address}
|
||||
write " import ${import};" ${import}
|
||||
write " export ${export};" ${export}
|
||||
if [ -n "${next_hop_self}" ]; then
|
||||
[ "${next_hop_self}" = "1" ] && writeToConfig " next hop self;" || writeToConfig "# next hop self;"
|
||||
fi
|
||||
if [ -n "${next_hop_keep}" ]; then
|
||||
[ "${next_hop_keep}" = "1" ] && writeToConfig " next hop keep;" || writeToConfig "# next hop keep;"
|
||||
fi
|
||||
[ -n "${igp_table}" ] && writeToConfig " igp table ${igp_table};"
|
||||
[ "${rr_client}" = "1" ] && writeToConfig " rr client;" || writeToConfig "# rr client;"
|
||||
write " rr cluster id ${rr_cluster_id};" ${rr_cluster_id}
|
||||
if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
|
||||
[ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
|
||||
writeToConfig " import limit ${import_limit} action ${import_limit_action};"
|
||||
fi
|
||||
if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
|
||||
[ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
|
||||
writeToConfig " export limit ${export_limit} action ${export_limit_action};"
|
||||
fi
|
||||
if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
|
||||
[ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
|
||||
writeToConfig " receive limit ${receive_limit} action ${receive_limit_action};"
|
||||
fi
|
||||
[ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig " neighbor ${neighbor_address} as ${neighbor_as};"
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: prepare_bgp $1
|
||||
# $1 string
|
||||
# This function gets each "bgp" protocol section in the UCI configuration and sets each option in the bird6.conf file.
|
||||
# $1 is set as the ID of the current UCI bgp section.
|
||||
# Careful! The options set in bgp instances overlap bgp_template ones.
|
||||
prepare_bgp() {
|
||||
local section="$1"
|
||||
local disabled; local table; local template; local description; local import
|
||||
local export; local local_address; local local_as; local neighbor_address
|
||||
local neighbor_as; local rr_client; local rr_cluster_id; local import_limit
|
||||
local import_limit_action; local export_limit; local export_limit_action
|
||||
local receive_limit; local receive_limit_action; local igp_table
|
||||
|
||||
get disabled ${section}
|
||||
get table ${section}
|
||||
get template ${section}
|
||||
get description ${section}
|
||||
get import ${section}
|
||||
get export ${section}
|
||||
get local_address ${section}
|
||||
get local_as ${section}
|
||||
get igp_table ${section}
|
||||
get rr_client ${section}
|
||||
get rr_cluster_id ${section}
|
||||
get import_limit ${section}
|
||||
get import_limit_action ${section}
|
||||
get export_limit ${section}
|
||||
get export_limit_action ${section}
|
||||
get receive_limit ${section}
|
||||
get receive_limit_action ${section}
|
||||
get neighbor_address ${section}
|
||||
get neighbor_as ${section}
|
||||
|
||||
writeToConfig "#${section} configuration:"
|
||||
[ -n "${template}" ] && writeToConfig "protocol bgp ${section} from ${template} {" || writeToConfig "protocol bgp ${section} {"
|
||||
[ -n "${disabled}" ] && write_bool disabled ${disabled}
|
||||
write " table ${table};" ${table}
|
||||
write " local as ${local_as};" ${local_as}
|
||||
write " source address ${local_address};" ${local_address}
|
||||
write " import ${import};" ${import}
|
||||
write " export ${export};" ${export}
|
||||
if [ -n "${next_hop_self}" ]; then
|
||||
[ "${next_hop_self}" = "1" ] && writeToConfig " next hop self;" || writeToConfig "# next hop self;"
|
||||
fi
|
||||
if [ -n "${next_hop_keep}" ]; then
|
||||
[ "${next_hop_keep}" = "1" ] && writeToConfig " next hop keep;" || writeToConfig "# next hop keep;"
|
||||
fi
|
||||
[ -n "${igp_table}" ] && writeToConfig " igp table ${igp_table};"
|
||||
[ "${rr_client}" = "1" ] && writeToConfig " rr client;" || writeToConfig "# rr client;"
|
||||
write " rr cluster id ${rr_cluster_id};" ${rr_cluster_id}
|
||||
if [ -n "${import_limit}" -a "${import_limit}" > "0" ]; then
|
||||
[ -z "${import_limit_action}" ] && ${import_limit_action} = "warn"
|
||||
writeToConfig " import limit ${import_limit} action ${import_limit_action};"
|
||||
fi
|
||||
if [ -n "${export_limit}" -a "${export_limit}" > "0" ]; then
|
||||
[ -z "${export_limit_action}" ] && ${export_limit_action} = "warn"
|
||||
writeToConfig " export limit ${export_limit} action ${export_limit_action};"
|
||||
fi
|
||||
if [ -n "${receive_limit}" -a "${receive_limit}" > "0" ]; then
|
||||
[ -z "${receive_limit_action}" ] && ${receive_limit_action} = "warn"
|
||||
writeToConfig " receive limit ${receive_limit} action ${receive_limit_action};"
|
||||
fi
|
||||
[ -n "${neighbor_address}" -a -n "${neighbor_as}" ] && writeToConfig " neighbor ${neighbor_address} as ${neighbor_as};"
|
||||
writeToConfig "}"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: gather_filters
|
||||
# This function gets all the FILES under /filters folder and adds
|
||||
# them into the config as %include elements on top of the file
|
||||
# If there are no filters, the section will remain empty.
|
||||
gather_filters() {
|
||||
writeToConfig "#Filters Section:"
|
||||
for filter in $(find /etc/${BIRD}/filters -type f); do
|
||||
writeToConfig "include \"${filter}\";"
|
||||
done
|
||||
writeToConfig "#End of Filters --"
|
||||
writeToConfig " "
|
||||
}
|
||||
|
||||
|
||||
# Function: gather_functions
|
||||
# This function gets all the FILES under /functions folder and adds
|
||||
# them into the config as %include elements on top of the file
|
||||
# If there are no filters, the section will remain empty.
|
||||
gather_functions() {
|
||||
writeToConfig "#Functions Section:"
|
||||
for func in $(find /etc/${BIRD}/functions -type f); do
|
||||
writeToConfig "include \"${func}\";"
|
||||
done
|
||||
writeToConfig "#End of Functions --"
|
||||
writeToConfig " "
|
||||
}
|
|
@ -1,286 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
-- Repeated Strings
|
||||
local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
|
||||
local imp_string = "Set if the protocol must import routes.<br />" .. common_string
|
||||
local exp_string = "Set if the protocol must export routes.<br />" .. common_string
|
||||
|
||||
m=Map("bird6", "Bird6 BGP protocol's configuration")
|
||||
|
||||
tab_templates = {}
|
||||
uci:foreach('bird6', 'bgp_template', function (s)
|
||||
local name = s[".name"]
|
||||
if (name ~= nil) then
|
||||
table.insert(tab_templates, name)
|
||||
end
|
||||
end)
|
||||
|
||||
--
|
||||
-- BGP TEMPLATES
|
||||
--
|
||||
sect_templates = m:section(TypedSection, "bgp_template", "BGP Templates", "Configuration of the templates used in BGP instances.")
|
||||
sect_templates.addremove = true
|
||||
sect_templates.anonymous = false
|
||||
|
||||
disabled = sect_templates:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
|
||||
disabled.optional=true
|
||||
|
||||
description = sect_templates:option(TextValue, "description", "Description", "Description of the current BGP instance")
|
||||
description.optional = true
|
||||
|
||||
table = sect_templates:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
|
||||
table.optional=true
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
igp_table = sect_templates:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
|
||||
igp_table.optional = true
|
||||
uci:foreach("bird6", "table",
|
||||
function(s)
|
||||
igp_table:value(s.name)
|
||||
end)
|
||||
igp_table:value("")
|
||||
igp_table.default = ""
|
||||
|
||||
import = sect_templates:option(Value, "import", "Import", imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_templates:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
source_addr = sect_templates:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
|
||||
source_addr.optional = true
|
||||
|
||||
local_address = sect_templates:option(Value, "local_address", "Local BGP address", "")
|
||||
local_address.optional = false
|
||||
|
||||
local_as = sect_templates:option(Value, "local_as", "Local AS", "")
|
||||
local_as.optional = false
|
||||
|
||||
next_hop_self = sect_templates:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
|
||||
next_hop_self.default = nil
|
||||
next_hop_self.optional = true
|
||||
|
||||
next_hop_keep = sect_templates:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
|
||||
next_hop_keep.default = nil
|
||||
next_hop_keep.optional = true
|
||||
|
||||
rr_client = sect_templates:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
|
||||
rr_client.default = nil
|
||||
rr_client.optional = true
|
||||
|
||||
rr_cluster_id = sect_templates:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
|
||||
rr_cluster_id.optional = true
|
||||
|
||||
import_trigger = sect_templates:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
|
||||
import_trigger.default = 0
|
||||
import_trigger.rmempty = false
|
||||
import_trigger.optional = false
|
||||
|
||||
import_limit = sect_templates:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
|
||||
import_limit:depends({import_trigger = "1"})
|
||||
import_limit.rmempty = true
|
||||
|
||||
import_limit_action = sect_templates:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
|
||||
import_limit_action:depends({import_trigger = "1"})
|
||||
import_limit_action:value("warn")
|
||||
import_limit_action:value("block")
|
||||
import_limit_action:value("disable")
|
||||
import_limit_action:value("restart")
|
||||
import_limit_action.default = "warn"
|
||||
import_limit_action.rmempty = true
|
||||
|
||||
export_trigger = sect_templates:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
|
||||
export_trigger.default = 0
|
||||
export_trigger.rmempty = false
|
||||
export_trigger.optional = false
|
||||
|
||||
export_limit = sect_templates:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
|
||||
export_limit:depends({export_trigger = "1"})
|
||||
export_limit.rmempty = true
|
||||
|
||||
export_limit_action = sect_templates:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
|
||||
export_limit_action:depends({export_trigger = "1"})
|
||||
export_limit_action.rmempty = true
|
||||
export_limit_action:value("warn")
|
||||
export_limit_action:value("block")
|
||||
export_limit_action:value("disable")
|
||||
export_limit_action:value("restart")
|
||||
export_limit_action.default = "warn"
|
||||
|
||||
receive_trigger = sect_templates:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
|
||||
receive_trigger.default = 0
|
||||
receive_trigger.rmempty = false
|
||||
receive_trigger.optional = false
|
||||
|
||||
receive_limit = sect_templates:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
|
||||
receive_limit:depends({receive_trigger = "1"})
|
||||
receive_limit.rmempty = true
|
||||
|
||||
receive_limit_action = sect_templates:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
|
||||
receive_limit_action:depends({receive_trigger = "1"})
|
||||
receive_limit_action:value("warn")
|
||||
receive_limit_action:value("block")
|
||||
receive_limit_action:value("disable")
|
||||
receive_limit_action:value("restart")
|
||||
receive_limit_action.default = "warn"
|
||||
receive_limit_action.rmempty= true
|
||||
|
||||
--
|
||||
-- BGP INSTANCES
|
||||
--
|
||||
sect_instances = m:section(TypedSection, "bgp", "BGP Instances", "Configuration of the BGP protocol instances")
|
||||
sect_instances.addremove = true
|
||||
sect_instances.anonymous = false
|
||||
|
||||
templates = sect_instances:option(ListValue, "template", "Templates", "Available BGP templates")
|
||||
uci:foreach("bird6", "bgp_template",
|
||||
function(s)
|
||||
templates:value(s[".name"])
|
||||
end)
|
||||
templates:value("")
|
||||
|
||||
disabled = sect_instances:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
|
||||
disabled.optional = false
|
||||
disabled.rmempty = false
|
||||
disabled.default = nil
|
||||
|
||||
description = sect_instances:option(TextValue, "description", "Description", "Description of the current BGP instance")
|
||||
description.optional = true
|
||||
|
||||
table = sect_instances:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
|
||||
table.optional=true
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
igp_table = sect_instances:option(ListValue, "igp_table", "IGP Table", "Select the IGP Routing Table to use. Hint: usually the same table as BGP.")
|
||||
igp_table.optional = true
|
||||
uci:foreach("bird6", "table",
|
||||
function(s)
|
||||
igp_table:value(s.name)
|
||||
end)
|
||||
igp_table:value("")
|
||||
igp_table.default = ""
|
||||
|
||||
import = sect_instances:option(Value, "import", "Import", imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_instances:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
source_address = sect_instances:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
|
||||
source_address.optional = true
|
||||
|
||||
local_address = sect_instances:option(Value, "local_address", "Local BGP address", "")
|
||||
local_address.optional=true
|
||||
|
||||
local_as = sect_instances:option(Value, "local_as", "Local AS", "")
|
||||
local_as.optional=true
|
||||
|
||||
neighbor_address = sect_instances:option(Value, "neighbor_address", "Neighbor IP Address", "")
|
||||
neighbor_address.optional = false
|
||||
|
||||
neighbor_as = sect_instances:option(Value, "neighbor_as", "Neighbor AS", "")
|
||||
neighbor_as.optional = false
|
||||
|
||||
next_hop_self = sect_instances:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
|
||||
next_hop_self.default = nil
|
||||
next_hop_self.optional = true
|
||||
|
||||
next_hop_keep = sect_instances:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
|
||||
next_hop_keep.default = nil
|
||||
next_hop_keep.optional = true
|
||||
|
||||
rr_client = sect_instances:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
|
||||
rr_client.default = nil
|
||||
rr_client.optional = true
|
||||
|
||||
rr_cluster_id = sect_instances:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
|
||||
rr_cluster_id.optional = true
|
||||
|
||||
import_trigger = sect_instances:option(Flag, "import_trigger", "Import Limit", "Enable Routes Import limit settings")
|
||||
import_trigger.default = 0
|
||||
import_trigger.rmempty = false
|
||||
import_trigger.optional = false
|
||||
|
||||
import_limit = sect_instances:option(Value, "import_limit", "Routes import limit", "Specify an import route limit.")
|
||||
import_limit:depends({import_trigger = "1"})
|
||||
import_limit.rmempty = true
|
||||
|
||||
import_limit_action = sect_instances:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
|
||||
import_limit_action:depends({import_trigger = "1"})
|
||||
import_limit_action:value("warn")
|
||||
import_limit_action:value("block")
|
||||
import_limit_action:value("disable")
|
||||
import_limit_action:value("restart")
|
||||
import_limit_action.default = "warn"
|
||||
import_limit_action.rmempty = true
|
||||
|
||||
export_trigger = sect_instances:option(Flag, "export_trigger", "Export Limit", "Enable Routes Export limit settings")
|
||||
export_trigger.default = 0
|
||||
export_trigger.rmempty = false
|
||||
export_trigger.optional = false
|
||||
|
||||
export_limit = sect_instances:option(Value, "export_limit", "Routes export limit", "Specify an export route limit.")
|
||||
export_limit:depends({export_trigger = "1"})
|
||||
export_limit.rmempty = true
|
||||
|
||||
export_limit_action = sect_instances:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
|
||||
export_limit_action:depends({export_trigger = "1"})
|
||||
export_limit_action.rmempty = true
|
||||
export_limit_action:value("warn")
|
||||
export_limit_action:value("block")
|
||||
export_limit_action:value("disable")
|
||||
export_limit_action:value("restart")
|
||||
export_limit_action.default = "warn"
|
||||
|
||||
receive_trigger = sect_instances:option(Flag, "receive_trigger", "Received Limit", "Enable Routes Received Limit settings")
|
||||
receive_trigger.default = 0
|
||||
receive_trigger.rmempty = false
|
||||
receive_trigger.optional = false
|
||||
|
||||
receive_limit = sect_instances:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit.")
|
||||
receive_limit:depends({receive_trigger = "1"})
|
||||
receive_limit.rmempty = true
|
||||
|
||||
receive_limit_action = sect_instances:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
|
||||
receive_limit_action:depends({receive_trigger = "1"})
|
||||
receive_limit_action:value("warn")
|
||||
receive_limit_action:value("block")
|
||||
receive_limit_action:value("disable")
|
||||
receive_limit_action:value("restart")
|
||||
receive_limit_action.default = "warn"
|
||||
receive_limit_action.rmempty= true
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird6 restart')
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,77 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local filters_dir = "/etc/bird6/filters/"
|
||||
local lock_file = "/etc/bird6/filter_lock"
|
||||
|
||||
m = SimpleForm("bird6", "Bird6 Filters", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
files = s:option(ListValue, "Files", "Filter Files:")
|
||||
local new_filter = filters_dir .. os.date("filter-%Y%m%d-%H%M")
|
||||
|
||||
-- New File Entry
|
||||
files:value(new_filter, "New File (".. new_filter .. ")")
|
||||
files.default = new_filter
|
||||
|
||||
local i, file_list = 0, { }
|
||||
for filename in io.popen("find " .. filters_dir .. " -type f"):lines() do
|
||||
i = i + 1
|
||||
files:value(filename, filename)
|
||||
end
|
||||
|
||||
ld = s:option(Button, "_load", "Load File")
|
||||
ld.inputstyle = "reload"
|
||||
|
||||
st_file = s:option(DummyValue, "_stfile", "Editing file:")
|
||||
function st_file.cfgvalue(self, section)
|
||||
if ld:formvalue(section) then
|
||||
fs.writefile(lock_file, files:formvalue(section))
|
||||
return files:formvalue(section)
|
||||
else
|
||||
fs.writefile(lock_file, "")
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
area = s:option(Value, "_filters")
|
||||
area.template = "bird6/tvalue"
|
||||
area.rows = 30
|
||||
function area.cfgvalue(self,section)
|
||||
if ld:formvalue(section) then
|
||||
local contents = fs.readfile(files:formvalue(section))
|
||||
if contents then
|
||||
return contents
|
||||
else
|
||||
return ""
|
||||
end
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function area.write(self, section)
|
||||
local locked_file = fs.readfile(lock_file)
|
||||
if locked_file and not ld:formvalue(section) then
|
||||
local text = self:formvalue(section):gsub("\r\n?", "\n")
|
||||
fs.writefile(locked_file, text)
|
||||
fs.writefile(lock_file, "")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,77 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local fs = require "nixio.fs"
|
||||
local functions_dir = "/etc/bird6/functions/"
|
||||
local lock_file = "/etc/bird6/function_lock"
|
||||
|
||||
m = SimpleForm("bird6", "Bird6 Functions", "<b>INFO:</b> New files are created using Timestamps.<br />In order to make it easier to handle, use SSH to connect to your terminal and rename those files.<br />If your file is not correctly shown in the list, please, refresh your browser.")
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
files = s:option(ListValue, "Files", "Function Files:")
|
||||
local new_function = functions_dir .. os.date("function-%Y%m%d-%H%M")
|
||||
|
||||
-- New File Entry
|
||||
files:value(new_function, "New File (".. new_function .. ")")
|
||||
files.default = new_function
|
||||
|
||||
local i, file_list = 0, { }
|
||||
for filename in io.popen("find " .. functions_dir .. " -type f"):lines() do
|
||||
i = i + 1
|
||||
files:value(filename, filename)
|
||||
end
|
||||
|
||||
ld = s:option(Button, "_load", "Load File")
|
||||
ld.inputstyle = "reload"
|
||||
|
||||
st_file = s:option(DummyValue, "_stfile", "Editing file:")
|
||||
function st_file.cfgvalue(self, section)
|
||||
if ld:formvalue(section) then
|
||||
fs.writefile(lock_file, files:formvalue(section))
|
||||
return files:formvalue(section)
|
||||
else
|
||||
fs.writefile(lock_file, "")
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
area = s:option(Value, "_functions")
|
||||
area.template = "bird6/tvalue"
|
||||
area.rows = 30
|
||||
function area.cfgvalue(self,section)
|
||||
if ld:formvalue(section) then
|
||||
local contents = fs.readfile(files:formvalue(section))
|
||||
if contents then
|
||||
return contents
|
||||
else
|
||||
return ""
|
||||
end
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
function area.write(self, section)
|
||||
local locked_file = fs.readfile(lock_file)
|
||||
if locked_file and not ld:formvalue(section) then
|
||||
local text = self:formvalue(section):gsub("\r\n?", "\n")
|
||||
fs.writefile(locked_file, text)
|
||||
fs.writefile(lock_file, "")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,266 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
--]]
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = luci.model.uci.cursor()
|
||||
|
||||
-- Repeated Strings
|
||||
local common_string = "Valid options are:<br />" .. "1. all (All the routes)<br />" .. "2. none (No routes)<br />" .. "3. filter <b>Your_Filter_Name</b> (Call a specific filter from any of the available in the filters files)"
|
||||
local imp_string = "Set if the protocol must import routes.<br />" .. common_string
|
||||
local exp_string = "Set if the protocol must export routes.<br />" .. common_string
|
||||
|
||||
m=Map("bird6", "Bird6 general protocol's configuration.")
|
||||
|
||||
-- Optional parameters lists
|
||||
local protoptions = {
|
||||
{["name"]="table", ["help"]="Auxiliar table for routing", ["depends"]={"static","kernel"}},
|
||||
{["name"]="import", ["help"]=imp_string, ["depends"]={"kernel"}},
|
||||
{["name"]="export", ["help"]=exp_string, ["depends"]={"kernel"}},
|
||||
{["name"]="scan_time", ["help"]="Time between scans", ["depends"]={"kernel","device"}},
|
||||
{["name"]="kernel_table", ["help"]="Set which table must be used as auxiliar kernel table", ["depends"]={"kernel"}},
|
||||
{["name"]="learn", ["help"]="Learn routes", ["depends"]={"kernel"}},
|
||||
{["name"]="persist", ["help"]="Store routes. After a restart, routes willstill be configured", ["depends"]={"kernel"}}
|
||||
}
|
||||
|
||||
local routeroptions = {
|
||||
{["name"]="prefix",["help"]="",["depends"]={"router","special","iface","multipath","recursive"}},
|
||||
{["name"]="via",["help"]="",["depends"]={"router","multipath"}},
|
||||
{["name"]="attribute",["help"]="",["depends"]={"special"}},
|
||||
{["name"]="iface",["help"]="",["depends"]={"iface"}},
|
||||
{["name"]="ip",["help"]="",["depends"]={"recursive"}}
|
||||
}
|
||||
|
||||
--
|
||||
-- KERNEL PROTOCOL
|
||||
--
|
||||
|
||||
sect_kernel_protos = m:section(TypedSection, "kernel", "Kernel options", "Configuration of the kernel protocols. First Instance MUST be Primary table (no table or kernel_table fields).")
|
||||
sect_kernel_protos.addremove = true
|
||||
sect_kernel_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
|
||||
disabled = sect_kernel_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "kernel" then
|
||||
if o.name == "learn" or o.name == "persist" then
|
||||
value = sect_kernel_protos:option(Flag, o.name, translate(o.name), translate(o.help))
|
||||
elseif o.name == "table" then
|
||||
value = sect_kernel_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
value:value(s.name)
|
||||
end)
|
||||
value:value("")
|
||||
value.default = ""
|
||||
else
|
||||
value = sect_kernel_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
end
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- DEVICE PROTOCOL
|
||||
--
|
||||
|
||||
sect_device_protos = m:section(TypedSection, "device", "Device options", "Configuration of the device protocols.")
|
||||
sect_device_protos.addremove = true
|
||||
sect_device_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
|
||||
disabled = sect_device_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "device" then
|
||||
value = sect_device_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- STATIC PROTOCOL
|
||||
--
|
||||
|
||||
sect_static_protos = m:section(TypedSection, "static", "Static options", "Configuration of the static protocols.")
|
||||
sect_static_protos.addremove = true
|
||||
sect_static_protos.anonymous = false
|
||||
|
||||
-- Default kernel parameters
|
||||
|
||||
disabled = sect_static_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
|
||||
disabled.default=0
|
||||
|
||||
-- Optional parameters
|
||||
for _,o in ipairs(protoptions) do
|
||||
if o.name ~= nil then
|
||||
for _, d in ipairs(o.depends) do
|
||||
if d == "static" then
|
||||
if o.name == "table" then
|
||||
value = sect_static_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
value:value(s.name)
|
||||
end)
|
||||
value:value("")
|
||||
value.default = ""
|
||||
else
|
||||
value = sect_static_protos:option(Value, o.name, translate(o.name), translate(o.help))
|
||||
end
|
||||
value.optional = true
|
||||
value.rmempty = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- PIPE PROTOCOL
|
||||
--
|
||||
sect_pipe_protos = m:section(TypedSection, "pipe", "Pipe options", "Configuration of the Pipe protocols.")
|
||||
sect_pipe_protos.addremove = true
|
||||
sect_pipe_protos.anonymous = false
|
||||
|
||||
-- Default Pipe parameters
|
||||
disabled = sect_pipe_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
|
||||
disabled.default=0
|
||||
|
||||
table = sect_pipe_protos:option(ListValue, "table", "Table", "Select the Primary Table to connect.")
|
||||
table.optional = false
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
table:value(s.name)
|
||||
end)
|
||||
table:value("")
|
||||
table.default = ""
|
||||
|
||||
peer_table = sect_pipe_protos:option(ListValue, "peer_table", "Peer Table", "Select the Secondary Table to connect.")
|
||||
table.optional = false
|
||||
uci:foreach("bird6", "table",
|
||||
function (s)
|
||||
peer_table:value(s.name)
|
||||
end)
|
||||
peer_table:value("")
|
||||
peer_table.default = ""
|
||||
|
||||
mode = sect_pipe_protos:option(ListValue, "mode", "Mode", "Select <b>transparent</b> to retransmit all routes and their attributes<br />Select <b>opaque</b> to retransmit optimal routes (similar to what other protocols do)")
|
||||
mode.optional = false
|
||||
mode:value("transparent")
|
||||
mode:value("opaque")
|
||||
mode.default = "transparent"
|
||||
|
||||
import = sect_pipe_protos:option(Value, "import", "Import",imp_string)
|
||||
import.optional=true
|
||||
|
||||
export = sect_pipe_protos:option(Value, "export", "Export", exp_string)
|
||||
export.optional=true
|
||||
|
||||
|
||||
--
|
||||
-- DIRECT PROTOCOL
|
||||
--
|
||||
sect_direct_protos = m:section(TypedSection, "direct", "Direct options", "Configuration of the Direct protocols.")
|
||||
sect_direct_protos.addremove = true
|
||||
sect_direct_protos.anonymous = false
|
||||
|
||||
-- Default Direct parameters
|
||||
disabled = sect_direct_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured. This protocol will connect the configured 'Table' to the 'Peer Table'.")
|
||||
disabled.optional = false
|
||||
disabled.default = 0
|
||||
|
||||
interface = sect_direct_protos:option(Value, "interface", "Interfaces", "By default Direct will generate device routes for all the interfaces. To restrict this behaviour, select a number of patterns to match your desired interfaces:" .. "<br />" .. "1. All the strings <b>MUST</b> be quoted: \"pattern\"" .. "<br />" .. "2. Use * (star) to match patterns: \"eth*\" (<b>include</b> all eth... interfaces)" .. "<br />" .. "3. You can add \"-\" (minus) to exclude patterns: \"-em*\" (<b>exclude</b> all em... interfaces)." .. "<br />" .. "4. Separate several patterns using , (coma): \"-em*\", \"eth*\" (<b>exclude</b> em... and <b>include</b> all eth... interfaces).")
|
||||
interface.optional = false
|
||||
interface.default = "\"*\""
|
||||
|
||||
|
||||
--
|
||||
-- ROUTES FOR STATIC PROTOCOL
|
||||
--
|
||||
sect_routes = m:section(TypedSection, "route", "Routes configuration", "Configuration of the routes used in static protocols.")
|
||||
sect_routes.addremove = true
|
||||
sect_routes.anonymous = true
|
||||
|
||||
instance = sect_routes:option(ListValue, "instance", "Route instance", "")
|
||||
i = 0
|
||||
|
||||
uci:foreach("bird6", "static",
|
||||
function (s)
|
||||
instance:value(s[".name"])
|
||||
end)
|
||||
|
||||
prefix = sect_routes:option(Value, "prefix", "Route prefix", "")
|
||||
prefix.datatype = "ip6prefix"
|
||||
|
||||
type = sect_routes:option(ListValue, "type", "Type of route", "")
|
||||
type:value("router")
|
||||
type:value("special")
|
||||
type:value("iface")
|
||||
type:value("recursive")
|
||||
type:value("multipath")
|
||||
|
||||
valueVia = sect_routes:option(Value, "via", "Via", "")
|
||||
valueVia.optional = false
|
||||
valueVia:depends("type", "router")
|
||||
valueVia.datatype = "ip6addr"
|
||||
|
||||
listVia = sect_routes:option(DynamicList, "l_via", "Via", "")
|
||||
listVia:depends("type", "multipath")
|
||||
listVia.optional=false
|
||||
listVia.datatype = "ip6addr"
|
||||
|
||||
attribute = sect_routes:option(Value, "attribute", "Attribute", "Types are: unreachable, prohibit and blackhole")
|
||||
attribute:depends("type", "special")
|
||||
|
||||
iface = sect_routes:option(ListValue, "iface", "Interface", "")
|
||||
iface:depends("type", "iface")
|
||||
|
||||
uci:foreach("network", "interface",
|
||||
function(section)
|
||||
if section[".name"] ~= "loopback" then
|
||||
iface:value(section[".name"])
|
||||
end
|
||||
end)
|
||||
|
||||
ip = sect_routes:option(Value, "ip", "IP address", "")
|
||||
ip:depends("type", "ip")
|
||||
ip.datatype = [[ or"ip4addr", "ip6addr" ]]
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird6 restart')
|
||||
end
|
||||
|
||||
return m
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
require("luci.sys")
|
||||
local http = require "luci.http"
|
||||
local uci = require "luci.model.uci"
|
||||
local uciout = uci.cursor()
|
||||
|
||||
m=Map("bird6", "Bird6 UCI configuration helper", "")
|
||||
|
||||
-- Named section: "bird"
|
||||
|
||||
s_bird_uci = m:section(NamedSection, "bird", "bird", "Bird6 file settings", "")
|
||||
s_bird_uci.addremove = False
|
||||
|
||||
uuc = s_bird_uci:option(Flag, "use_UCI_config", "Use UCI configuration", "Use UCI configuration instead of the /etc/bird6.conf file")
|
||||
|
||||
ucf = s_bird_uci:option(Value, "UCI_config_file", "UCI File", "Specify the file to place the UCI-translated configuration")
|
||||
ucf.default = "/tmp/bird6.conf"
|
||||
|
||||
-- Named Section: "table"
|
||||
|
||||
s_bird_table = m:section(TypedSection, "table", "Tables configuration", "Configuration of the tables used in the protocols")
|
||||
s_bird_table.addremove = true
|
||||
s_bird_table.anonymous = true
|
||||
|
||||
name = s_bird_table:option(Value, "name", "Table name", "Descriptor ID of the table")
|
||||
|
||||
-- Named section: "global"
|
||||
|
||||
s_bird_global = m:section(NamedSection, "global", "global", "Global options", "Basic Bird6 settings")
|
||||
s_bird_global.addremove = False
|
||||
|
||||
id = s_bird_global:option(Value, "router_id", "Router ID", "Identification number of the router. By default, is the router's IP.")
|
||||
|
||||
lf = s_bird_global:option(Value, "log_file", "Log File", "File used to store log related data.")
|
||||
|
||||
l = s_bird_global:option(MultiValue, "log", "Log", "Set which elements do you want to log.")
|
||||
l:value("all", "All")
|
||||
l:value("info", "Info")
|
||||
l:value("warning","Warning")
|
||||
l:value("error","Error")
|
||||
l:value("fatal","Fatal")
|
||||
l:value("debug","Debug")
|
||||
l:value("trace","Trace")
|
||||
l:value("remote","Remote")
|
||||
l:value("auth","Auth")
|
||||
|
||||
d = s_bird_global:option(MultiValue, "debug", "Debug", "Set which elements do you want to debug.")
|
||||
d:value("all", "All")
|
||||
d:value("states","States")
|
||||
d:value("routes","Routes")
|
||||
d:value("filters","Filters")
|
||||
d:value("interfaces","Interfaces")
|
||||
d:value("events","Events")
|
||||
d:value("packets","Packets")
|
||||
|
||||
listen_addr = s_bird_global:option(Value, "listen_bgp_addr", "BGP Address", "Set the Addres that BGP will listen to.")
|
||||
listen_addr.optional = true
|
||||
|
||||
listen_port = s_bird_global:option(Value, "listen_bgp_port", "BGP Port", "Set the port that BGP will listen to.")
|
||||
listen_port.optional = true
|
||||
|
||||
listen_dual = s_bird_global:option(Flag, "listen_bgp_dual", "BGP Dual/ipv6", "Set if BGP connections will listen ipv6 only 'ipv6only' or both ipv4/6 'dual' routes")
|
||||
listen_dual.optional = true
|
||||
|
||||
function m.on_commit(self,map)
|
||||
luci.sys.exec('/etc/init.d/bird6 restart')
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,53 +0,0 @@
|
|||
--[[
|
||||
Copyright (C) 2014-2017 - Eloi Carbo
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
local sys = require "luci.sys"
|
||||
|
||||
m = SimpleForm("bird6", "Bird6 Daemon Status Page", "This page let you Start, Stop, Restart and check Bird6 Service Status.")
|
||||
m.reset = false
|
||||
m.submit = false
|
||||
|
||||
s = m:section(SimpleSection)
|
||||
|
||||
start = s:option(Button, "_start", "Start Bird4 Daemon:")
|
||||
start.inputtitle = " Start "
|
||||
start.inputstyle = "apply"
|
||||
|
||||
stop = s:option(Button, "_stop", "Stop Bird4 Daemon:")
|
||||
stop.inputtitle = " Stop "
|
||||
stop.inputstyle = "remove"
|
||||
|
||||
restart = s:option(Button, "_restart", "Restart Bird4 Daemon:")
|
||||
restart.inputtitle = "Restart"
|
||||
restart.inputstyle = "reload"
|
||||
|
||||
output = s:option(DummyValue, "_value", "Service Status")
|
||||
function output.cfgvalue(self, section)
|
||||
local ret = ""
|
||||
if start:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird6 start_quiet")
|
||||
elseif stop:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird6 stop_quiet")
|
||||
elseif restart:formvalue(section) then
|
||||
ret = sys.exec("/etc/init.d/bird6 restart_quiet")
|
||||
else
|
||||
ret = sys.exec("/etc/init.d/bird6 status_quiet")
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
return m
|
|
@ -1,33 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
# This UCI-Defaults script will MOVE any pre-existing filter
|
||||
# stored in a file and configured as an UCI item (deprecated)
|
||||
# The script will try to match any "filter" Section, get its
|
||||
# "file_path" property and move the file (if exists) to the
|
||||
# new (v0.3+) default location: /etc/bird{4|6}/filters
|
||||
|
||||
[ $# -ne 1 ] && exit 1
|
||||
BIRD="$1"
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
# This function will move an existing folder configured on
|
||||
# Bird as a "filter" to filters' folder.
|
||||
mv_filter() {
|
||||
local section="$1"
|
||||
local file_path
|
||||
config_get file_path ${section} file_path
|
||||
|
||||
if [ -f ${file_path} ]; then
|
||||
mv ${file_path} /etc/${BIRD}/filters/
|
||||
fi
|
||||
uci delete ${BIRD}.${section}
|
||||
}
|
||||
|
||||
if [ -f /etc/config/${BIRD} ]; then
|
||||
config_load ${BIRD}
|
||||
config_foreach mv_filter 'filter'
|
||||
uci commit ${BIRD}
|
||||
fi
|
||||
|
||||
exit 0
|
|
@ -1,13 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
[ $# -ne 1 ] && exit 1
|
||||
|
||||
BIRD=$1
|
||||
|
||||
EXC=`mount -t overlayfs | grep overlayfs -c`
|
||||
|
||||
[ $EXC > 0 ] && rm -r /etc/init.d/${BIRD} || mv /etc/init.d/${BIRD} /etc/${BIRD}/init.d/${BIRD}.orig
|
||||
|
||||
ln -s /etc/${BIRD}/init.d/${BIRD} /etc/init.d/${BIRD}
|
||||
|
||||
exit 0
|
|
@ -1,41 +0,0 @@
|
|||
<%-
|
||||
-- Only populate textarea through XHR.poll
|
||||
-- "refresh" is present in the URL (.../log?refresh=1)
|
||||
if luci.http.formvalue("refresh") then
|
||||
|
||||
-- Force HTTP Contents to be "text/plain"
|
||||
luci.http.prepare_content("text/plain")
|
||||
|
||||
local sys = require("luci.sys")
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
|
||||
-- Get Log File from Bird's configuration or leave it empty.
|
||||
local log_file = uci:get("bird6", "global", "log_file") or ""
|
||||
local log_size = ""
|
||||
if log_file then
|
||||
log_size = sys.exec("du -h " .. log_file .. " | awk '{print $1}'")
|
||||
-- Gathering last 30 lines of the Log File.
|
||||
lf = sys.exec("tail -n30 " .. log_file):gsub("\r\n?", "\n")
|
||||
end
|
||||
|
||||
-- Write File used and its contents.
|
||||
luci.http.write("Using Log File: " .. log_file .. " - File Size: " .. log_size .. "\n" .. lf)
|
||||
|
||||
-- Avoid printing the rest of the page (return only text log data)
|
||||
return
|
||||
end
|
||||
-%>
|
||||
|
||||
<%+header%>
|
||||
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
// Refresh page each second. Use "refresh=1" as trigger.
|
||||
XHR.poll(1, '<%=url('admin/network/bird6/log')%>', { refresh: 1 }, function(xhrInstance) {
|
||||
var area = document.getElementById('log')
|
||||
area.value = xhrInstance.responseText;
|
||||
});
|
||||
//]]></script>
|
||||
|
||||
|
||||
<textarea readonly="readonly" style="width: 100%" wrap="on" rows="32" id="log"><%=lf:pcdata()%></textarea>
|
||||
<%+footer%>
|
|
@ -1,5 +0,0 @@
|
|||
<%+cbi/valueheader%>
|
||||
<textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 100%; font: normal 11pt 'Courier New'"<% else %> cols="<%=self.size%>"<% end %> data-update="change"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap") .. ifattr(self.readonly, "readonly") %>>
|
||||
<%-=pcdata(self:cfgvalue(section))-%>
|
||||
</textarea>
|
||||
<%+cbi/valuefooter%>
|
214
bird/Makefile
214
bird/Makefile
|
@ -1,214 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2009-2016 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bird
|
||||
PKG_VERSION:=1.6.3
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird
|
||||
PKG_MD5SUM:=39c51cf57c3ba8b5978b2a657ffa2f647ec7f3ae643e91cf42ee5cb070cf7e7c
|
||||
PKG_BUILD_DEPENDS:=ncurses readline
|
||||
PKG_MAINTAINER:=Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/bird/Default
|
||||
TITLE:=The BIRD Internet Routing Daemon
|
||||
URL:=http://bird.network.cz/
|
||||
DEPENDS:=+libpthread
|
||||
endef
|
||||
|
||||
define Package/birdc/Default
|
||||
TITLE:=The BIRD command-line client
|
||||
URL:=http://bird.network.cz/
|
||||
DEPENDS:= +libreadline +libncurses
|
||||
endef
|
||||
|
||||
define Package/birdcl/Default
|
||||
TITLE:=The BIRD lightweight command-line client
|
||||
URL:=http://bird.network.cz/
|
||||
endef
|
||||
|
||||
define Package/bird/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.
|
||||
|
||||
endef
|
||||
|
||||
define Package/bird/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/bird/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/bird/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/bird4
|
||||
$(call Package/bird/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv4)
|
||||
endef
|
||||
|
||||
define Package/birdc4
|
||||
$(call Package/birdc/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv4)
|
||||
DEPENDS+= +bird4
|
||||
endef
|
||||
|
||||
define Package/birdcl4
|
||||
$(call Package/birdcl/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv4)
|
||||
DEPENDS+= +bird4
|
||||
endef
|
||||
|
||||
define Package/bird6
|
||||
$(call Package/bird/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv6)
|
||||
endef
|
||||
|
||||
define Package/birdc6
|
||||
$(call Package/birdc/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv6)
|
||||
DEPENDS+= +bird6
|
||||
endef
|
||||
|
||||
define Package/birdcl6
|
||||
$(call Package/birdcl/Default)
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE+= (IPv6)
|
||||
DEPENDS+= +bird6
|
||||
endef
|
||||
|
||||
define Package/bird4/description
|
||||
$(call Package/bird/Default/description1)
|
||||
This is IPv4 version of BIRD, it supports OSPFv2, RIPv2 and BGP
|
||||
protocols.
|
||||
|
||||
$(call Package/bird/Default/description2)
|
||||
endef
|
||||
|
||||
define Package/birdc4/description
|
||||
$(call Package/bird/Default/description1)
|
||||
$(call Package/bird/Default/description3)
|
||||
endef
|
||||
|
||||
define Package/birdcl4/description
|
||||
$(call Package/bird/Default/description1)
|
||||
$(call Package/bird/Default/description4)
|
||||
endef
|
||||
|
||||
define Package/bird6/description
|
||||
$(call Package/bird/Default/description1)
|
||||
This is IPv6 version of BIRD, it supports OSPFv3, RIPng and BGP
|
||||
protocols.
|
||||
|
||||
$(call Package/bird/Default/description2)
|
||||
endef
|
||||
|
||||
define Package/birdc6/description
|
||||
$(call Package/bird/Default/description1)
|
||||
$(call Package/bird/Default/description3)
|
||||
endef
|
||||
|
||||
define Package/birdcl6/description
|
||||
$(call Package/bird/Default/description1)
|
||||
$(call Package/bird/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/bird$(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/bird$(2)/conffiles
|
||||
/etc/bird$(2).conf
|
||||
endef
|
||||
|
||||
define Package/birdc$(2)/install
|
||||
$(INSTALL_DIR) $$(1)/usr/sbin
|
||||
$(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdc$(2) $$(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
define Package/birdcl$(2)/install
|
||||
$(INSTALL_DIR) $$(1)/usr/sbin
|
||||
$(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdcl$(2) $$(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
endef
|
||||
|
||||
|
||||
$(eval $(call Build/Template,bird4,4, --disable-ipv6))
|
||||
$(eval $(call Build/Template,bird6,6, --enable-ipv6))
|
||||
|
||||
$(eval $(call BuildPackage,bird4))
|
||||
$(eval $(call BuildPackage,birdc4))
|
||||
$(eval $(call BuildPackage,birdcl4))
|
||||
$(eval $(call BuildPackage,bird6))
|
||||
$(eval $(call BuildPackage,birdc6))
|
||||
$(eval $(call BuildPackage,birdcl6))
|
|
@ -1,121 +0,0 @@
|
|||
|
||||
# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION
|
||||
# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO
|
||||
|
||||
# However, most of options used here are just for example
|
||||
# and will be removed in real-life configs.
|
||||
|
||||
log syslog all;
|
||||
|
||||
# Override router ID
|
||||
#router id 192.168.0.1;
|
||||
|
||||
# Turn on global debugging of all protocols
|
||||
#debug protocols all;
|
||||
|
||||
|
||||
# Define a route filter...
|
||||
# filter test_filter {
|
||||
# if net ~ 10.0.0.0/16 then accept;
|
||||
# else reject;
|
||||
# }
|
||||
|
||||
# The direct protocol automatically generates device routes to all network
|
||||
# interfaces. Can exist in as many instances as you wish if you want to
|
||||
# populate multiple routing tables with device routes. Because device routes
|
||||
# are handled by Linux kernel, this protocol is usually not needed.
|
||||
# protocol direct {
|
||||
# interface "*"; # Restrict network interfaces it works with
|
||||
# }
|
||||
|
||||
# This pseudo-protocol performs synchronization between BIRD's routing
|
||||
# tables and the kernel. You can run multiple instances of the kernel
|
||||
# protocol and synchronize different kernel tables with different BIRD tables.
|
||||
protocol kernel {
|
||||
# learn; # Learn all alien routes from the kernel
|
||||
# persist; # Don't remove routes on bird shutdown
|
||||
scan time 20; # Scan kernel routing table every 20 seconds
|
||||
# import none; # Default is import all
|
||||
# export all; # Default is export none
|
||||
}
|
||||
|
||||
# This pseudo-protocol watches all interface up/down events.
|
||||
protocol device {
|
||||
scan time 10; # Scan interfaces every 10 seconds
|
||||
}
|
||||
|
||||
# Static routes (again, there can be multiple instances, so that you
|
||||
# can disable/enable various groups of static routes on the fly).
|
||||
protocol static {
|
||||
# export all; # Default is export none
|
||||
# route 0.0.0.0/0 via 62.168.0.13;
|
||||
# route 10.0.0.0/8 reject;
|
||||
# route 192.168.0.0/16 reject;
|
||||
}
|
||||
|
||||
|
||||
#protocol rip {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export filter test_filter;
|
||||
|
||||
# port 1520;
|
||||
# period 7;
|
||||
# infinity 16;
|
||||
# garbage time 60;
|
||||
# interface "*" { mode broadcast; };
|
||||
# honor neighbor;
|
||||
# honor always;
|
||||
# honor never;
|
||||
# authentication none;
|
||||
#}
|
||||
|
||||
|
||||
#protocol ospf {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export where source = RTS_STATIC;
|
||||
|
||||
# area 0 {
|
||||
# interface "eth*" {
|
||||
# cost 10;
|
||||
# hello 3;
|
||||
# retransmit 2;
|
||||
# wait 5;
|
||||
# dead 20;
|
||||
# type broadcast;
|
||||
# authentication simple;
|
||||
# password "pass";
|
||||
# };
|
||||
# };
|
||||
#}
|
||||
|
||||
|
||||
#protocol bgp {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export where source = RTS_STATIC;
|
||||
|
||||
# local as 65000;
|
||||
# neighbor 192.168.1.1 as 65001;
|
||||
# multihop 20 via 192.168.2.1;
|
||||
|
||||
# hold time 240;
|
||||
# startup hold time 240;
|
||||
# connect retry time 120;
|
||||
# keepalive time 80; # defaults to hold time / 3
|
||||
# start delay time 5; # How long do we wait before initial connect
|
||||
# error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive
|
||||
# # errors occur, we increase the delay exponentially ...
|
||||
# error forget time 300; # ... until this timeout expires)
|
||||
# disable after error; # Disable the protocol automatically when an error occurs
|
||||
# next hop self; # Disable next hop processing and always advertise our local address as nexthop
|
||||
# source address 62.168.0.14; # What local address we use for the TCP connection
|
||||
# password "secret" # Password used for MD5 authentication
|
||||
# rr client; # I am a route reflector and the neighor is my client
|
||||
# rr cluster id 1.0.0.1 # Use this value for cluster id instead of my router id
|
||||
# };
|
||||
#}
|
|
@ -1,26 +0,0 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2010-2014 OpenWrt.org
|
||||
|
||||
BIRD="bird4"
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_USE_PID=1
|
||||
SERVICE_PID_FILE="/var/run/$BIRD.pid"
|
||||
|
||||
BIRD_BIN="/usr/sbin/$BIRD"
|
||||
BIRD_CONF="/etc/$BIRD.conf"
|
||||
|
||||
start() {
|
||||
service_start $BIRD_BIN -d -c $BIRD_CONF -P $SERVICE_PID_FILE
|
||||
}
|
||||
|
||||
stop() {
|
||||
service_stop $BIRD_BIN
|
||||
}
|
||||
|
||||
reload() {
|
||||
service_reload $BIRD_BIN
|
||||
}
|
|
@ -1,121 +0,0 @@
|
|||
|
||||
# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION
|
||||
# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO
|
||||
|
||||
# However, most of options used here are just for example
|
||||
# and will be removed in real-life configs.
|
||||
|
||||
log syslog all;
|
||||
|
||||
# Override router ID
|
||||
#router id 192.168.0.1;
|
||||
|
||||
# Turn on global debugging of all protocols
|
||||
#debug protocols all;
|
||||
|
||||
|
||||
# Define a route filter...
|
||||
# filter test_filter {
|
||||
# if net ~ 10.0.0.0/16 then accept;
|
||||
# else reject;
|
||||
# }
|
||||
|
||||
# The direct protocol automatically generates device routes to all network
|
||||
# interfaces. Can exist in as many instances as you wish if you want to
|
||||
# populate multiple routing tables with device routes. Because device routes
|
||||
# are handled by Linux kernel, this protocol is usually not needed.
|
||||
# protocol direct {
|
||||
# interface "*"; # Restrict network interfaces it works with
|
||||
# }
|
||||
|
||||
# This pseudo-protocol performs synchronization between BIRD's routing
|
||||
# tables and the kernel. You can run multiple instances of the kernel
|
||||
# protocol and synchronize different kernel tables with different BIRD tables.
|
||||
protocol kernel {
|
||||
# learn; # Learn all alien routes from the kernel
|
||||
# persist; # Don't remove routes on bird shutdown
|
||||
scan time 20; # Scan kernel routing table every 20 seconds
|
||||
# import none; # Default is import all
|
||||
# export all; # Default is export none
|
||||
}
|
||||
|
||||
# This pseudo-protocol watches all interface up/down events.
|
||||
protocol device {
|
||||
scan time 10; # Scan interfaces every 10 seconds
|
||||
}
|
||||
|
||||
# Static routes (again, there can be multiple instances, so that you
|
||||
# can disable/enable various groups of static routes on the fly).
|
||||
protocol static {
|
||||
# export all; # Default is export none
|
||||
# route 0.0.0.0/0 via 62.168.0.13;
|
||||
# route 10.0.0.0/8 reject;
|
||||
# route 192.168.0.0/16 reject;
|
||||
}
|
||||
|
||||
|
||||
#protocol rip {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export filter test_filter;
|
||||
|
||||
# port 1520;
|
||||
# period 7;
|
||||
# infinity 16;
|
||||
# garbage time 60;
|
||||
# interface "*" { mode broadcast; };
|
||||
# honor neighbor;
|
||||
# honor always;
|
||||
# honor never;
|
||||
# authentication none;
|
||||
#}
|
||||
|
||||
|
||||
#protocol ospf {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export where source = RTS_STATIC;
|
||||
|
||||
# area 0 {
|
||||
# interface "eth*" {
|
||||
# cost 10;
|
||||
# hello 3;
|
||||
# retransmit 2;
|
||||
# wait 5;
|
||||
# dead 20;
|
||||
# type broadcast;
|
||||
# authentication simple;
|
||||
# password "pass";
|
||||
# };
|
||||
# };
|
||||
#}
|
||||
|
||||
|
||||
#protocol bgp {
|
||||
# disabled;
|
||||
# import all;
|
||||
# export all;
|
||||
# export where source = RTS_STATIC;
|
||||
|
||||
# local as 65000;
|
||||
# neighbor 192.168.1.1 as 65001;
|
||||
# multihop 20 via 192.168.2.1;
|
||||
|
||||
# hold time 240;
|
||||
# startup hold time 240;
|
||||
# connect retry time 120;
|
||||
# keepalive time 80; # defaults to hold time / 3
|
||||
# start delay time 5; # How long do we wait before initial connect
|
||||
# error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive
|
||||
# # errors occur, we increase the delay exponentially ...
|
||||
# error forget time 300; # ... until this timeout expires)
|
||||
# disable after error; # Disable the protocol automatically when an error occurs
|
||||
# next hop self; # Disable next hop processing and always advertise our local address as nexthop
|
||||
# source address 62.168.0.14; # What local address we use for the TCP connection
|
||||
# password "secret" # Password used for MD5 authentication
|
||||
# rr client; # I am a route reflector and the neighor is my client
|
||||
# rr cluster id 1.0.0.1 # Use this value for cluster id instead of my router id
|
||||
# };
|
||||
#}
|
|
@ -1,26 +0,0 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2010-2014 OpenWrt.org
|
||||
|
||||
BIRD="bird6"
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_USE_PID=1
|
||||
SERVICE_PID_FILE="/var/run/$BIRD.pid"
|
||||
|
||||
BIRD_BIN="/usr/sbin/$BIRD"
|
||||
BIRD_CONF="/etc/$BIRD.conf"
|
||||
|
||||
start() {
|
||||
service_start $BIRD_BIN -d -c $BIRD_CONF -P $SERVICE_PID_FILE
|
||||
}
|
||||
|
||||
stop() {
|
||||
service_stop $BIRD_BIN
|
||||
}
|
||||
|
||||
reload() {
|
||||
service_reload $BIRD_BIN
|
||||
}
|
129
bird2/Makefile
Normal file
129
bird2/Makefile
Normal file
|
@ -0,0 +1,129 @@
|
|||
#
|
||||
# Copyright (C) 2009-2017 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:=bird2
|
||||
PKG_VERSION:=2.14
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird
|
||||
PKG_HASH:=b0b9f6f8566541b9be4af1f0cac675c5a3785601a55667a7ec3d7de29735a786
|
||||
|
||||
PKG_MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
|
||||
PKG_LICENSE:=GPL-2.0-or-later
|
||||
|
||||
PKG_BUILD_DEPENDS:=ncurses readline
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/bird-$(PKG_VERSION)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/bird2/Default/description
|
||||
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.
|
||||
|
||||
endef
|
||||
|
||||
define Package/bird2
|
||||
TITLE:=The BIRD Internet Routing Daemon (v2)
|
||||
URL:=http://bird.network.cz/
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
DEPENDS:=+libpthread
|
||||
CONFLICTS:=bird1-ipv4 bird1-ipv6 bird4 bird6
|
||||
endef
|
||||
|
||||
define Package/bird2c
|
||||
TITLE:=The BIRD command-line client (v2)
|
||||
URL:=http://bird.network.cz/
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
DEPENDS:=+bird2 +libreadline +libncurses
|
||||
CONFLICTS:=bird1c-ipv4 bird1c-ipv6 birdc4 birdc6
|
||||
endef
|
||||
|
||||
define Package/bird2cl
|
||||
TITLE:=The BIRD lightweight command-line client (v2)
|
||||
URL:=http://bird.network.cz/
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
DEPENDS:=+bird2
|
||||
CONFLICTS:=bird1cl-ipv4 bird1cl-ipv6 birdcl4 birdcl6
|
||||
endef
|
||||
|
||||
define Package/bird2/description
|
||||
$(call Package/bird2/Default/description)
|
||||
|
||||
BIRD supports OSPFv2, RIPv2, Babel and BGP protocols for IPv4 and
|
||||
OSPFv3, RIPng, Babel and BGP protocols for IPv6.
|
||||
|
||||
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.
|
||||
|
||||
This is the 2.0 branch of Bird which integrates support for IPv4 and IPv6
|
||||
into a single branch, and also adds support for the Babel routing protocol.
|
||||
endef
|
||||
|
||||
define Package/bird2c/description
|
||||
$(call Package/bird2/Default/description)
|
||||
|
||||
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/bird2cl/description
|
||||
$(call Package/bird2/Default/description)
|
||||
|
||||
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
|
||||
|
||||
CONFIGURE_ARGS += --disable-libssh
|
||||
|
||||
define Package/bird2/conffiles
|
||||
/etc/bird.conf
|
||||
/etc/bird4.conf
|
||||
/etc/bird6.conf
|
||||
endef
|
||||
|
||||
define Package/bird2/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bird $(1)/usr/sbin/
|
||||
$(INSTALL_DIR) $(1)/etc
|
||||
$(INSTALL_DATA) ./files/bird.conf $(1)/etc/
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_BIN) ./files/bird.init $(1)/etc/init.d/bird
|
||||
endef
|
||||
|
||||
define Package/bird2c/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/birdc $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
define Package/bird2cl/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/birdcl $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,bird2))
|
||||
$(eval $(call BuildPackage,bird2c))
|
||||
$(eval $(call BuildPackage,bird2cl))
|
332
bird2/files/bird.conf
Normal file
332
bird2/files/bird.conf
Normal file
|
@ -0,0 +1,332 @@
|
|||
/*
|
||||
* This is an example configuration file for MB-BGP setting
|
||||
*/
|
||||
|
||||
|
||||
log syslog all;
|
||||
# debug protocols all;
|
||||
|
||||
router id 192.168.1.1;
|
||||
|
||||
ipv4 table master4;
|
||||
ipv6 table master6;
|
||||
|
||||
ipv4 table mcast4;
|
||||
ipv6 table mcast6;
|
||||
|
||||
ipv4 table mtab4;
|
||||
ipv6 table mtab6;
|
||||
|
||||
vpn4 table vpntab4;
|
||||
vpn6 table vpntab6;
|
||||
|
||||
vpn4 table vpn4mc;
|
||||
vpn6 table vpn6mc;
|
||||
|
||||
flow4 table flowtab4;
|
||||
flow6 table flowtab6;
|
||||
|
||||
|
||||
protocol device {
|
||||
}
|
||||
|
||||
protocol kernel kernel4 {
|
||||
ipv4 {
|
||||
export all;
|
||||
};
|
||||
}
|
||||
|
||||
protocol kernel kernel6 {
|
||||
ipv6 {
|
||||
export all;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
protocol static static4 {
|
||||
ipv4;
|
||||
|
||||
route 10.10.0.0/24 via 192.168.1.2;
|
||||
route 10.10.1.0/24 via 192.168.1.2 { bgp_large_community.add((10,20,30)); bgp_large_community.add((10,(20*3),10)); };
|
||||
}
|
||||
|
||||
protocol static static6 {
|
||||
ipv6;
|
||||
|
||||
route 2001:db8:10:10::/64 via 2001:db8:1:1::10;
|
||||
route 2001:db8:10:11::/64 via 2001:db8:1:1::10;
|
||||
|
||||
route 2001:db8:1:1::/64 via fe80::ec9b:67ff:fe60:fd5d % ve1;
|
||||
}
|
||||
|
||||
# VPNv4 routes with MPLS labels
|
||||
protocol static statvpn4 {
|
||||
vpn4;
|
||||
|
||||
route 10:10 10.20.0.0/24 via 192.168.1.2 mpls 210;
|
||||
route 10:10 10.20.1.0/24 via 192.168.1.2 mpls 210;
|
||||
route 10:20 10.20.0.0/24 via 192.168.1.2 mpls 220;
|
||||
route 10:20 10.20.1.0/24 via 192.168.1.2 mpls 220;
|
||||
}
|
||||
|
||||
protocol static statvpn6 {
|
||||
vpn6;
|
||||
|
||||
route 10:10 2001:db8:20:10::/64 via 2001:db8:1:1::10 mpls 200/210;
|
||||
route 10:10 2001:db8:20:11::/64 via 2001:db8:1:1::10 mpls 200/210;
|
||||
route 10:20 2001:db8:20:10::/64 via 2001:db8:1:1::10 mpls 200/220;
|
||||
route 10:20 2001:db8:20:11::/64 via 2001:db8:1:1::10 mpls 200/220;
|
||||
}
|
||||
|
||||
# RFC 5575 flow specification
|
||||
protocol static flowstat4 {
|
||||
flow4;
|
||||
|
||||
route flow4 {
|
||||
dst 10.0.0.0/8;
|
||||
proto = 23;
|
||||
dport > 24 && < 30 || 40..50,60..70,80;
|
||||
sport > 24 && < 30 || = 40 || 50,60..70,80;
|
||||
icmp type 80;
|
||||
icmp code 90;
|
||||
tcp flags 0x03/0x0f;
|
||||
length 2048..65535;
|
||||
dscp = 63;
|
||||
fragment dont_fragment, is_fragment || !first_fragment;
|
||||
};
|
||||
|
||||
route flow4 {
|
||||
dst 11.0.0.0/8;
|
||||
proto = 0x12;
|
||||
sport > 0x5678 && < 0x9abc || 0xdef0 || 0x1234,0x5678,0x9abc..0xdef0;
|
||||
dport = 50;
|
||||
tcp flags 0x000/0xf00;
|
||||
};
|
||||
|
||||
route flow4 {
|
||||
dst 12.0.0.0/32;
|
||||
tcp flags ! 0/0x999;
|
||||
};
|
||||
|
||||
route flow4 {
|
||||
dst 220.0.254.0/24;
|
||||
tcp flags 0x99/0x999;
|
||||
};
|
||||
|
||||
route flow4 {
|
||||
dst 220.0.254.192/28;
|
||||
tcp flags ! 0xfff/0xfff;
|
||||
};
|
||||
|
||||
route flow4 {
|
||||
dst 15.0.0.0/8;
|
||||
tcp flags ! 0x999/0x999;
|
||||
};
|
||||
}
|
||||
|
||||
protocol static flowstat6 {
|
||||
flow6;
|
||||
|
||||
route flow6 {
|
||||
dst fec0:1122:3344:5566::1/128;
|
||||
src 0000:0000:0000:0001:1234:5678:9800:0000/101 offset 63;
|
||||
next header = 23;
|
||||
sport 24..30, 42 || 50,60,70..80;
|
||||
dport = 50;
|
||||
tcp flags 0x03/0x0f, !0/0xff || 0x33/0x33;
|
||||
fragment !is_fragment || !first_fragment;
|
||||
label 0xaaaa/0xaaaa && 0x33/0x33;
|
||||
};
|
||||
|
||||
route flow6 {
|
||||
dst fec0:1122:3344:5566::1/128;
|
||||
src ::1:1234:5678:9800:0/101 offset 63;
|
||||
next header = 23;
|
||||
dport = 50;
|
||||
sport > 24 && < 30 || = 40 || = 50 || = 60 || >= 70 && <= 80;
|
||||
tcp flags 0x3/0x3 && 0x0/0xc;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
protocol pipe {
|
||||
table master4;
|
||||
peer table mcast4;
|
||||
import none;
|
||||
export where source = RTS_OSPF;
|
||||
}
|
||||
|
||||
protocol pipe {
|
||||
table master6;
|
||||
peer table mcast6;
|
||||
import none;
|
||||
export where source = RTS_OSPF;
|
||||
}
|
||||
|
||||
protocol ospf v2 ospf4 {
|
||||
ipv4 {
|
||||
import all;
|
||||
# export where source = RTS_STATIC;
|
||||
};
|
||||
|
||||
area 0 {
|
||||
interface "ve0" { stub; };
|
||||
interface "ve1" { hello 5; type ptp; };
|
||||
interface "ve2" { hello 5; type bcast; ttl security; };
|
||||
interface "ve3" { hello 5; type bcast; ttl security; };
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
protocol ospf v3 ospf6 {
|
||||
ipv6 {
|
||||
import all;
|
||||
# export where source = RTS_STATIC;
|
||||
};
|
||||
|
||||
area 0 {
|
||||
interface "ve0" { stub; };
|
||||
interface "ve1" { hello 5; type ptp; };
|
||||
interface "ve2" { hello 5; type bcast; };
|
||||
};
|
||||
}
|
||||
|
||||
protocol bgp {
|
||||
local 192.168.11.1 as 1000;
|
||||
neighbor 192.168.11.2 as 2000;
|
||||
# local 192.168.1.1 as 1000;
|
||||
# neighbor 192.168.2.1 as 2000;
|
||||
# multihop;
|
||||
# rr client;
|
||||
# strict bind;
|
||||
# debug all;
|
||||
|
||||
# regular IPv4 unicast (1/1)
|
||||
ipv4 {
|
||||
# connects to master4 table by default
|
||||
import all;
|
||||
export where source ~ [ RTS_STATIC, RTS_BGP ];
|
||||
};
|
||||
|
||||
# regular IPv6 unicast (2/1)
|
||||
ipv6 {
|
||||
# connects to master6 table by default
|
||||
import all;
|
||||
export where source ~ [ RTS_STATIC, RTS_BGP ];
|
||||
# next hop address 2001:db8:1:1::1;
|
||||
};
|
||||
|
||||
# IPv4 multicast topology (1/2)
|
||||
ipv4 multicast {
|
||||
# explicit IPv4 table
|
||||
table mcast4;
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
|
||||
# IPv6 multicast topology (2/2)
|
||||
ipv6 multicast {
|
||||
# explicit IPv6 table
|
||||
table mcast6;
|
||||
import all;
|
||||
export all;
|
||||
# next hop address 2001:db8:1:1::1;
|
||||
};
|
||||
|
||||
# IPv4 with MPLS labels (1/4)
|
||||
ipv4 mpls {
|
||||
# explicit IPv4 table
|
||||
table mtab4;
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
|
||||
# IPv6 with MPLS labels (2/4)
|
||||
ipv6 mpls {
|
||||
# explicit IPv6 table
|
||||
table mtab6;
|
||||
import all;
|
||||
export all;
|
||||
# allows IPv4 next hops (6PE)
|
||||
# extended next hop;
|
||||
};
|
||||
|
||||
# VPNv4 with MPLS labels (1/128)
|
||||
vpn4 mpls {
|
||||
# connects to vpntab4 table by default
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
|
||||
# VPNv6 with MPLS labels (2/128)
|
||||
vpn6 mpls {
|
||||
# connects to vpntab6 table by default
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
|
||||
# VPNv4 multicast topology (1/129)
|
||||
vpn4 multicast {
|
||||
table vpn4mc;
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
|
||||
# VPNv6 multicast topology (2/129)
|
||||
vpn6 multicast {
|
||||
table vpn6mc;
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
|
||||
# IPv4 Flowspec (1/133)
|
||||
flow4 {
|
||||
# connects to flowtab4 table by default
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
|
||||
# IPv6 Flowspec (2/133)
|
||||
flow6 {
|
||||
# connects to flowtab6 table by default
|
||||
import all;
|
||||
export all;
|
||||
};
|
||||
}
|
||||
|
||||
protocol bgp {
|
||||
local 192.168.1.1 as 1000;
|
||||
neighbor 192.168.3.1 as 1000;
|
||||
multihop;
|
||||
rr client;
|
||||
|
||||
ipv4 {
|
||||
import all;
|
||||
export where source ~ [ RTS_STATIC, RTS_BGP ];
|
||||
};
|
||||
|
||||
ipv6 {
|
||||
import all;
|
||||
export where source ~ [ RTS_STATIC, RTS_BGP ];
|
||||
next hop address 2001:db8:1:1::1;
|
||||
};
|
||||
}
|
||||
|
||||
protocol bgp {
|
||||
local 2001:db8:1:1::1 as 1000;
|
||||
neighbor 2001:db8:4:1::1 as 1000;
|
||||
multihop;
|
||||
rr client;
|
||||
|
||||
ipv4 {
|
||||
import all;
|
||||
export where source ~ [ RTS_STATIC, RTS_BGP ];
|
||||
next hop address 192.168.4.1;
|
||||
};
|
||||
|
||||
ipv6 {
|
||||
import all;
|
||||
export where source ~ [ RTS_STATIC, RTS_BGP ];
|
||||
};
|
||||
}
|
||||
|
25
bird2/files/bird.init
Normal file
25
bird2/files/bird.init
Normal file
|
@ -0,0 +1,25 @@
|
|||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2010-2017 OpenWrt.org
|
||||
|
||||
USE_PROCD=1
|
||||
START=70
|
||||
STOP=10
|
||||
|
||||
BIRD_BIN="/usr/sbin/bird"
|
||||
BIRD_CONF="/etc/bird.conf"
|
||||
BIRD_PID_FILE="/var/run/bird.pid"
|
||||
|
||||
start_service() {
|
||||
mkdir -p /var/run
|
||||
procd_open_instance
|
||||
procd_set_param command $BIRD_BIN -f -c $BIRD_CONF -P $BIRD_PID_FILE
|
||||
procd_set_param file "$BIRD_CONF"
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
procd_send_signal bird
|
||||
}
|
11
bird2/patches/000-ospf-bus-error.patch
Normal file
11
bird2/patches/000-ospf-bus-error.patch
Normal file
|
@ -0,0 +1,11 @@
|
|||
--- a/proto/ospf/topology.h
|
||||
+++ b/proto/ospf/topology.h
|
||||
@@ -41,7 +41,7 @@ struct top_hash_entry
|
||||
u8 mode; /* LSA generated during RT calculation (LSA_RTCALC or LSA_STALE)*/
|
||||
u8 nhs_reuse; /* Whether nhs nodes can be reused during merging.
|
||||
See a note in rt.c:add_cand() */
|
||||
-};
|
||||
+} PACKED;
|
||||
|
||||
|
||||
/* Prevents ospf_hash_find() to ignore the entry, for p->lsrqh and p->lsrth */
|
157
bmx6/Makefile
157
bmx6/Makefile
|
@ -1,157 +0,0 @@
|
|||
# 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:=git://github.com/bmx-routing/bmx6.git
|
||||
#PKG_SOURCE_URL:=file:///usr/src/bmx-routing/bmx6.git
|
||||
|
||||
PKG_REV:=0312168aaa384379ccbefd4b2d936fc698664d5b
|
||||
PKG_MIRROR_HASH:=98acdbda8a8cadadf8141c7b8a17b6417112f70f3211b86abad23a8c7a28be10
|
||||
PKG_VERSION:=r2018020902
|
||||
PKG_RELEASE:=5
|
||||
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))
|
|
@ -1,82 +0,0 @@
|
|||
|
||||
# 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'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
#!/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
|
||||
}
|
111
bmx7/Makefile
111
bmx7/Makefile
|
@ -1,66 +1,46 @@
|
|||
#
|
||||
# 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:=bmx7
|
||||
PKG_VERSION:=7.1.1
|
||||
PKG_RELEASE:=5
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://codeload.github.com/bmx-routing/bmx7/tar.gz/v$(PKG_VERSION)?
|
||||
PKG_HASH:=5f88df1c95e5cb842a6016bb1604e3e7f6097c63c5c9916edc3c84e96d4f5f65
|
||||
|
||||
PKG_SOURCE_URL:=git://github.com/bmx-routing/bmx7.git
|
||||
#PKG_SOURCE_URL:=file:///usr/src/bmx-routing/bmx7.git
|
||||
PKG_MAINTAINER:=Axel Neumann <neumann@cgws.de>
|
||||
PKG_LICENSE:=GPL-2.0-or-later
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
PKG_REV:=f78db8298dd8b3658f6fcfa90df2644a15b99924
|
||||
PKG_MIRROR_HASH:=80ca8e04603d824e4dede0055030c765bd9e69f7945c01ffb953de37b228028e
|
||||
PKG_VERSION:=r2018030903
|
||||
PKG_RELEASE:=3
|
||||
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)
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
TARGET_CFLAGS += $(FPIC)
|
||||
|
||||
MAKE_ARGS += EXTRA_CFLAGS="$(TARGET_CFLAGS) -I. -I$(STAGING_DIR)/usr/include -DCRYPTLIB=MBEDTLS_2_4_0 -DCORE_LIMIT=20000 -DTRAFFIC_DUMP -DNO_TRACE_FUNCTION_CALLS -DBMX7_LIB_IWINFO"
|
||||
|
||||
MAKE_ARGS += \
|
||||
EXTRA_LDFLAGS="$(TARGET_LDFLAGS) -L$(STAGING_DIR)/usr/lib -liwinfo" \
|
||||
MAKE_ARGS += EXTRA_CFLAGS="$(TARGET_CFLAGS) \
|
||||
-I. \
|
||||
-I$(STAGING_DIR)/usr/include \
|
||||
-DCRYPTLIB=MBEDTLS_2_8_0 \
|
||||
-DCORE_LIMIT=20000 \
|
||||
-DTRAFFIC_DUMP \
|
||||
-DNO_TRACE_FUNCTION_CALLS \
|
||||
-DBMX7_LIB_IWINFO" \
|
||||
EXTRA_LDFLAGS="$(TARGET_LDFLAGS) \
|
||||
-L$(STAGING_DIR)/usr/lib -liwinfo" \
|
||||
GIT_REV="$(PKG_REV)" \
|
||||
CC="$(TARGET_CC)" \
|
||||
INSTALL_DIR="$(PKG_INSTALL_DIR)" \
|
||||
build_all
|
||||
|
||||
MAKE_PATH:=src
|
||||
|
||||
define Package/bmx7/Default
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=Routing and Redirection
|
||||
TITLE:=BMX7 layer 3 routing daemon
|
||||
URL:=http://github.com/bmx-routing/bmx7
|
||||
MAINTAINER:=Axel Neumann <neumann@cgws.de>
|
||||
URL:=https://github.com/bmx-routing/bmx7
|
||||
DEPENDS:=+zlib +libmbedtls +libiwinfo
|
||||
endef
|
||||
|
||||
|
@ -82,7 +62,7 @@ endef
|
|||
define Package/bmx7-iwinfo
|
||||
$(call Package/bmx7/Default)
|
||||
DEPENDS:=bmx7 +libiwinfo
|
||||
TITLE:=link characteristics plugin based on libiwinfo (recommended!)
|
||||
TITLE:=link characteristics plugin via libiwinfo (recommended!)
|
||||
endef
|
||||
|
||||
define Package/bmx7-topology
|
||||
|
@ -115,30 +95,15 @@ define Package/bmx7-table
|
|||
TITLE:=plugin to announce routes from tables via tunnels
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
mkdir -p $(PKG_INSTALL_DIR)
|
||||
define Package/bmx7/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/bmx7 $(1)/usr/sbin/bmx7
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_ARGS)
|
||||
$(MAKE) -C $(PKG_BUILD_DIR)/$(MAKE_PATH) $(MAKE_ARGS)
|
||||
endef
|
||||
|
||||
define Package/bmx7/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bmx7 $(1)/usr/sbin/bmx7
|
||||
endef
|
||||
|
||||
define Package/bmx7/postinst
|
||||
#!/bin/sh
|
||||
# # check if we are on real system
|
||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||
if [ -f /etc/sysupgrade.conf ] && ! grep bmx7 /etc/sysupgrade.conf; then
|
||||
echo /etc/bmx7 >> /etc/sysupgrade.conf
|
||||
fi
|
||||
fi
|
||||
endef
|
||||
|
||||
|
||||
define Package/bmx7-uci-config/conffiles
|
||||
/etc/config/bmx7
|
||||
/etc/bmx7
|
||||
|
@ -146,42 +111,48 @@ endef
|
|||
|
||||
define Package/bmx7-uci-config/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib $(1)/etc/config $(1)/etc/init.d
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_uci_config/bmx7_config.so $(1)/usr/lib/bmx7_config.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_uci_config/bmx7_config.so \
|
||||
$(1)/usr/lib/bmx7_config.so
|
||||
$(INSTALL_BIN) ./files/etc/init.d/bmx7 $(1)/etc/init.d/bmx7
|
||||
$(INSTALL_DATA) ./files/etc/config/bmx7 $(1)/etc/config/bmx7
|
||||
endef
|
||||
|
||||
define Package/bmx7-iwinfo/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_iwinfo/bmx7_iwinfo.so $(1)/usr/lib/bmx7_iwinfo.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_iwinfo/bmx7_iwinfo.so \
|
||||
$(1)/usr/lib/bmx7_iwinfo.so
|
||||
endef
|
||||
|
||||
define Package/bmx7-topology/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_topology/bmx7_topology.so $(1)/usr/lib/bmx7_topology.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_topology/bmx7_topology.so \
|
||||
$(1)/usr/lib/bmx7_topology.so
|
||||
endef
|
||||
|
||||
define Package/bmx7-json/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_json/bmx7_json.so $(1)/usr/lib/bmx7_json.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_json/bmx7_json.so \
|
||||
$(1)/usr/lib/bmx7_json.so
|
||||
endef
|
||||
|
||||
define Package/bmx7-sms/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_sms/bmx7_sms.so $(1)/usr/lib/bmx7_sms.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_sms/bmx7_sms.so \
|
||||
$(1)/usr/lib/bmx7_sms.so
|
||||
endef
|
||||
|
||||
define Package/bmx7-tun/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_tun/bmx7_tun.so $(1)/usr/lib/bmx7_tun.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_tun/bmx7_tun.so \
|
||||
$(1)/usr/lib/bmx7_tun.so
|
||||
endef
|
||||
|
||||
define Package/bmx7-table/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx7_table/bmx7_table.so $(1)/usr/lib/bmx7_table.so
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib/bmx7_table/bmx7_table.so \
|
||||
$(1)/usr/lib/bmx7_table.so
|
||||
endef
|
||||
|
||||
|
||||
$(eval $(call BuildPackage,bmx7))
|
||||
$(eval $(call BuildPackage,bmx7-uci-config))
|
||||
$(eval $(call BuildPackage,bmx7-iwinfo))
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
|
||||
# for more information:
|
||||
# http://bmx6.net/projects/bmx6/wiki
|
||||
# https://github.com/bmx-routing/bmx7/
|
||||
# options execute: bmx7 --help
|
||||
|
||||
config 'bmx7' 'general'
|
||||
|
@ -19,22 +18,18 @@ config 'bmx7' 'general'
|
|||
#config 'plugin'
|
||||
# option 'plugin' 'bmx7_iwinfo.so'
|
||||
|
||||
|
||||
config 'dev' 'mesh_1'
|
||||
option 'dev' 'br-lan'
|
||||
|
||||
config 'dev' 'mesh_2'
|
||||
option 'dev' 'wlan0'
|
||||
|
||||
|
||||
|
||||
#config 'plugin'
|
||||
# option 'plugin' 'bmx7_tun.so'
|
||||
|
||||
#config 'plugin'
|
||||
# option 'plugin' 'bmx7_table.so'
|
||||
|
||||
|
||||
#config 'tunDev' default
|
||||
# option 'tunDev' 'default'
|
||||
# option 'tun6Address' '2012:0:0:6666::1/64'
|
||||
|
@ -50,8 +45,3 @@ config 'dev' 'mesh_2'
|
|||
# option 'tunOut' 'ip4'
|
||||
# option 'network' '10.0.0.0/9'
|
||||
# option 'minPrefixLen' '27'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ BIN=/usr/sbin/bmx7
|
|||
CONF=/etc/config/bmx7
|
||||
|
||||
start_service() {
|
||||
cd /root/
|
||||
cd /root/ || return
|
||||
while pgrep -f mac80211.sh ; do sleep 1; done
|
||||
|
||||
procd_open_instance "bmx7"
|
||||
|
@ -20,5 +20,9 @@ start_service() {
|
|||
}
|
||||
|
||||
reload_service() {
|
||||
$BIN -c configReload
|
||||
"$BIN" -c configReload
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "bmx7"
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue