mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-29 23:59:40 +08:00
Compare commits
578 Commits
release-7.
...
dmf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb840d2220 | ||
|
|
ca2b9fa807 | ||
|
|
3c32d7fa7d | ||
|
|
21de9e9a37 | ||
|
|
d0ce299c01 | ||
|
|
c7883322ca | ||
|
|
341ac893ff | ||
|
|
4c1c10281a | ||
|
|
f56b780135 | ||
|
|
9c0ae45ea9 | ||
|
|
5ab944d42f | ||
|
|
783857b0b3 | ||
|
|
3a09f3b1bb | ||
|
|
3370d6f4a8 | ||
|
|
a8f81dc358 | ||
|
|
dc670b2621 | ||
|
|
83a5721b93 | ||
|
|
41f26348b9 | ||
|
|
e36012bcc7 | ||
|
|
c2f1103417 | ||
|
|
248c8fe510 | ||
|
|
c61e80db94 | ||
|
|
d7fe821608 | ||
|
|
8dae05642a | ||
|
|
77914bbb43 | ||
|
|
00f31bb4ba | ||
|
|
2de38cd3c4 | ||
|
|
d4f437c6c1 | ||
|
|
088df53f81 | ||
|
|
2887f4053a | ||
|
|
454dda3433 | ||
|
|
74577dd729 | ||
|
|
6effe4023e | ||
|
|
bb3adc86ff | ||
|
|
82a32a7731 | ||
|
|
f0f18ed780 | ||
|
|
677357d997 | ||
|
|
fa608bc23b | ||
|
|
563a5d03b8 | ||
|
|
b1b432d852 | ||
|
|
fe06c8515f | ||
|
|
9101095a0a | ||
|
|
2bd4c0c236 | ||
|
|
61bda623ca | ||
|
|
e2eaf6221a | ||
|
|
82183e9e3b | ||
|
|
edfbcb1074 | ||
|
|
5af1df3493 | ||
|
|
3ec6c21456 | ||
|
|
9d251b5d9d | ||
|
|
a3e4a0f6e9 | ||
|
|
d5044df134 | ||
|
|
cef4d4efea | ||
|
|
1f093159d8 | ||
|
|
22e6d80384 | ||
|
|
fe1bf101c3 | ||
|
|
24c30a098e | ||
|
|
a0c1801511 | ||
|
|
59e7ece054 | ||
|
|
cb9825504d | ||
|
|
628331c808 | ||
|
|
229f62a906 | ||
|
|
034bd7e8b2 | ||
|
|
c594a4957f | ||
|
|
5fd540d5ba | ||
|
|
64fcaaadc7 | ||
|
|
64f4ceda35 | ||
|
|
0485c372bd | ||
|
|
155b4fe2b3 | ||
|
|
cf573d3fad | ||
|
|
09aa9746d5 | ||
|
|
e56ad858aa | ||
|
|
362bb8b1cf | ||
|
|
9bb0da51cf | ||
|
|
3158f92912 | ||
|
|
2847fdd2c2 | ||
|
|
bde6e11169 | ||
|
|
543ba2ac7a | ||
|
|
c02548298d | ||
|
|
0f03e3ae70 | ||
|
|
2c4307f83a | ||
|
|
98925cc464 | ||
|
|
d8d2d0090b | ||
|
|
2fc98ac307 | ||
|
|
98f5e19916 | ||
|
|
e8da3d1cd7 | ||
|
|
4112fbd17c | ||
|
|
26f202edb7 | ||
|
|
67b4ba0301 | ||
|
|
68fb3bea32 | ||
|
|
c0a1139764 | ||
|
|
39f30cd31a | ||
|
|
ac78f69136 | ||
|
|
f72d4e35d0 | ||
|
|
e5fc33e941 | ||
|
|
5faab025cc | ||
|
|
7a62843c29 | ||
|
|
b0d2b10055 | ||
|
|
7129b55362 | ||
|
|
6662f27493 | ||
|
|
b42c0201cf | ||
|
|
d626a673b5 | ||
|
|
18a5f6ca5b | ||
|
|
97045b2d39 | ||
|
|
8475fa81bc | ||
|
|
e67f2bbcf7 | ||
|
|
a3d7280423 | ||
|
|
61de08f440 | ||
|
|
05ecde4f55 | ||
|
|
55c3233739 | ||
|
|
6e9a38beac | ||
|
|
fea9e4de88 | ||
|
|
ceb5a9f2e4 | ||
|
|
cb8623a862 | ||
|
|
c6672e3cf0 | ||
|
|
75d0b18f09 | ||
|
|
806f685d74 | ||
|
|
e412cfa36d | ||
|
|
55967685ef | ||
|
|
3655ae9d79 | ||
|
|
d526ee41cd | ||
|
|
c7315af615 | ||
|
|
4d414af657 | ||
|
|
074e0c1cd1 | ||
|
|
6b81616883 | ||
|
|
ee3144f736 | ||
|
|
c96eceed2d | ||
|
|
dac23ee614 | ||
|
|
cc312af2f3 | ||
|
|
e506f6462c | ||
|
|
6fb90643c7 | ||
|
|
7e82a1c907 | ||
|
|
9bf94f688c | ||
|
|
ebf0e949b4 | ||
|
|
2766fef0c3 | ||
|
|
a73cd73fe1 | ||
|
|
0df826868a | ||
|
|
2ed0a4ec01 | ||
|
|
944ef75d57 | ||
|
|
b3cfbc8536 | ||
|
|
36928bdcb9 | ||
|
|
b8634e5bec | ||
|
|
a0ba20647d | ||
|
|
642544f579 | ||
|
|
f71042d2eb | ||
|
|
40c9c7ac7c | ||
|
|
f9a046f0b4 | ||
|
|
a7ea8701b9 | ||
|
|
718fde966f | ||
|
|
e198ed73c7 | ||
|
|
5e7a131b64 | ||
|
|
7816cc1e49 | ||
|
|
28d70c56c8 | ||
|
|
2c9a35eb8c | ||
|
|
0779d9f121 | ||
|
|
afa5f38654 | ||
|
|
1eeb06fd36 | ||
|
|
d64bf6ceea | ||
|
|
c28f5afe45 | ||
|
|
1ed383bee7 | ||
|
|
8236cd4093 | ||
|
|
46a09d8f8d | ||
|
|
61c7afe582 | ||
|
|
258449fc11 | ||
|
|
f5db3d3d45 | ||
|
|
a0c6545534 | ||
|
|
96d18ad234 | ||
|
|
18c9bef5f8 | ||
|
|
bd3b904c15 | ||
|
|
350ced4c32 | ||
|
|
b4e735e731 | ||
|
|
e96e2328a7 | ||
|
|
c8c6b5ab4b | ||
|
|
9bd7e17835 | ||
|
|
fa703437e1 | ||
|
|
cfc335aed8 | ||
|
|
1139c21f34 | ||
|
|
6af6728603 | ||
|
|
5a208be259 | ||
|
|
8764f317d0 | ||
|
|
c2e9144819 | ||
|
|
fc9f946be7 | ||
|
|
2aed4dc8f5 | ||
|
|
ce1b42e095 | ||
|
|
8fee332f4c | ||
|
|
ca78501dba | ||
|
|
9280ddd093 | ||
|
|
15563ca117 | ||
|
|
0718730d6b | ||
|
|
f9ad16934c | ||
|
|
966dbd6038 | ||
|
|
b1809e6993 | ||
|
|
ad8b8b2a55 | ||
|
|
6bf1cae138 | ||
|
|
92c3d6d721 | ||
|
|
853a0c840c | ||
|
|
49bcef77aa | ||
|
|
fa8e9fc3ef | ||
|
|
e3eec0d7ab | ||
|
|
74339e6216 | ||
|
|
8197f9ad93 | ||
|
|
1f96c3d295 | ||
|
|
d1d57ca528 | ||
|
|
10428fbda0 | ||
|
|
8e5d4c53ff | ||
|
|
1fb22dfe8c | ||
|
|
99fe2c2b2a | ||
|
|
c153911acf | ||
|
|
31cd59b33c | ||
|
|
21e6193e0a | ||
|
|
3af94e2180 | ||
|
|
df91d06078 | ||
|
|
ea090f50e1 | ||
|
|
7df4486a43 | ||
|
|
6818818127 | ||
|
|
63c0fb7d3b | ||
|
|
2a38e7cd23 | ||
|
|
8f6ae03e7e | ||
|
|
fecbbe90af | ||
|
|
fe1cdbd9bc | ||
|
|
67bf2c0227 | ||
|
|
307059d44b | ||
|
|
a8aa693e18 | ||
|
|
53fc48997a | ||
|
|
9e180eb2bf | ||
|
|
b98ccac057 | ||
|
|
fb236949fc | ||
|
|
5631c28df4 | ||
|
|
8170684100 | ||
|
|
332a35102d | ||
|
|
ba5e332b0d | ||
|
|
09560fb532 | ||
|
|
c4cf8cb24b | ||
|
|
56c94f1ec6 | ||
|
|
279fe9d291 | ||
|
|
924675d271 | ||
|
|
64cf5c7c9f | ||
|
|
9fa9b1adbf | ||
|
|
9944917399 | ||
|
|
2a25fc0ec7 | ||
|
|
ebd7e68714 | ||
|
|
000762c0cb | ||
|
|
c4328f411f | ||
|
|
0428934a69 | ||
|
|
580d24e04a | ||
|
|
95778a4262 | ||
|
|
02ee448479 | ||
|
|
0dcc9743a2 | ||
|
|
1a1a1e1255 | ||
|
|
9710e46c51 | ||
|
|
19e69f7b61 | ||
|
|
e319c85064 | ||
|
|
29638a28f7 | ||
|
|
ccb337ecbd | ||
|
|
5474b1c6d0 | ||
|
|
8df0ad8e46 | ||
|
|
6e358a6bd1 | ||
|
|
20a28db536 | ||
|
|
c6ee9114bc | ||
|
|
89fb4a0857 | ||
|
|
8d86188ff1 | ||
|
|
18d6afea15 | ||
|
|
0cb9aac1f1 | ||
|
|
dfe2af4643 | ||
|
|
2fe133227d | ||
|
|
15f17da6e5 | ||
|
|
2e56ef292c | ||
|
|
65e4bebc0f | ||
|
|
ceb577a6ab | ||
|
|
2d45a45126 | ||
|
|
45294a9f0c | ||
|
|
eb5c837353 | ||
|
|
495d95dcc8 | ||
|
|
32e5dc46b3 | ||
|
|
6980c1e2e5 | ||
|
|
da727b4dc1 | ||
|
|
d8aaacc4c9 | ||
|
|
e036702c16 | ||
|
|
604a105bc9 | ||
|
|
04bdaa950f | ||
|
|
54fdaf2b43 | ||
|
|
644e98e595 | ||
|
|
9fc594d74f | ||
|
|
ac7cfb581e | ||
|
|
ba75b33fc5 | ||
|
|
912978164b | ||
|
|
7a50c328e1 | ||
|
|
f8c9088db7 | ||
|
|
fd34c3e9f3 | ||
|
|
70d7d7a64d | ||
|
|
112f4cb99d | ||
|
|
2380a6de86 | ||
|
|
b0c168322e | ||
|
|
22d8a0992c | ||
|
|
3c075c293c | ||
|
|
17ae16e5d2 | ||
|
|
46dc9e86d8 | ||
|
|
0b3420240d | ||
|
|
83ca06b626 | ||
|
|
2dafb9ec2c | ||
|
|
c2c54e5ca0 | ||
|
|
9314e4bbf3 | ||
|
|
5840332288 | ||
|
|
bb4fffb680 | ||
|
|
4b2b09080d | ||
|
|
ba651b5457 | ||
|
|
1509db0630 | ||
|
|
85e97ca660 | ||
|
|
f9640bc237 | ||
|
|
72b16e33ab | ||
|
|
4e81706967 | ||
|
|
483fc2e6cb | ||
|
|
c2594f2d37 | ||
|
|
fb2eac485b | ||
|
|
c867ab610e | ||
|
|
ef8d667b83 | ||
|
|
3934674c81 | ||
|
|
4f53f35dc1 | ||
|
|
4fe815299a | ||
|
|
9394517727 | ||
|
|
742b357026 | ||
|
|
d383896918 | ||
|
|
646f5d6e1c | ||
|
|
d897632279 | ||
|
|
47e93f13c1 | ||
|
|
70bb662514 | ||
|
|
6f9ec4bf7d | ||
|
|
fc88c554c1 | ||
|
|
5ba6ade386 | ||
|
|
0d1b585c5d | ||
|
|
bf43efa993 | ||
|
|
0e3545cacb | ||
|
|
fefe14d540 | ||
|
|
b6df14f78e | ||
|
|
24cfbe2e48 | ||
|
|
eee28bb66c | ||
|
|
5fcee38906 | ||
|
|
72a9da5bd3 | ||
|
|
2cf19c9469 | ||
|
|
bd0fed8409 | ||
|
|
b23e510dd3 | ||
|
|
bf06544066 | ||
|
|
85762b4641 | ||
|
|
60dafc2028 | ||
|
|
e6054d9f8f | ||
|
|
8b106e6b58 | ||
|
|
41edb9f1a5 | ||
|
|
f6026298e8 | ||
|
|
c3ab091cdc | ||
|
|
dcfca56db8 | ||
|
|
991657fc99 | ||
|
|
90f13664e9 | ||
|
|
e843c83d0c | ||
|
|
7d5c13a9f5 | ||
|
|
417a5c5428 | ||
|
|
0074af0d3c | ||
|
|
fae1f7d816 | ||
|
|
f500a8c749 | ||
|
|
af9e4f99c6 | ||
|
|
e451e32f77 | ||
|
|
26cbba9724 | ||
|
|
5be4e38c68 | ||
|
|
549534f8aa | ||
|
|
f4a623e637 | ||
|
|
833a9a002a | ||
|
|
ff4e68f70a | ||
|
|
b471113bfa | ||
|
|
2b997a4386 | ||
|
|
06a280707a | ||
|
|
c54fd95889 | ||
|
|
86fb3db75b | ||
|
|
70cda05eda | ||
|
|
502aab4f3c | ||
|
|
34b63e84aa | ||
|
|
5f2aa06285 | ||
|
|
5232cc61ac | ||
|
|
98d8e9866c | ||
|
|
0e59fd0d47 | ||
|
|
a7e8e65d88 | ||
|
|
1fd74364fa | ||
|
|
20c49302c1 | ||
|
|
c2e5ade3bb | ||
|
|
b933622547 | ||
|
|
7b12c29425 | ||
|
|
082452bfb5 | ||
|
|
a6b8987dac | ||
|
|
d1307bfd76 | ||
|
|
edd78f675e | ||
|
|
3a1772e1b8 | ||
|
|
b2dd40cae3 | ||
|
|
24f22d0ecc | ||
|
|
a86f478014 | ||
|
|
9a59ccc498 | ||
|
|
15e4dd732a | ||
|
|
784a281fa6 | ||
|
|
8f82b31658 | ||
|
|
3745b4e913 | ||
|
|
90d646319b | ||
|
|
13064e27b3 | ||
|
|
539bf50985 | ||
|
|
1b7b377bd1 | ||
|
|
1c9ba1c83c | ||
|
|
e307ee7aa8 | ||
|
|
6bcf7987d7 | ||
|
|
ff146bf093 | ||
|
|
0f23bee1da | ||
|
|
2070630b07 | ||
|
|
f1702b3e70 | ||
|
|
9634b0678b | ||
|
|
d395030be7 | ||
|
|
4cb0504eb3 | ||
|
|
6df57301f9 | ||
|
|
f527b8a25a | ||
|
|
fbba67542e | ||
|
|
824d6d3abe | ||
|
|
1a9a339cc6 | ||
|
|
0533f114d1 | ||
|
|
dc579e3c60 | ||
|
|
d232e76905 | ||
|
|
2fffb45748 | ||
|
|
b15f1b5026 | ||
|
|
43a0dfc863 | ||
|
|
307381c9af | ||
|
|
1a80f2df47 | ||
|
|
9b79eb42db | ||
|
|
602926b076 | ||
|
|
74cfe57095 | ||
|
|
01845eded6 | ||
|
|
11dce5812c | ||
|
|
7af15ec9a9 | ||
|
|
8359755dc8 | ||
|
|
1a735b7730 | ||
|
|
6a008d3419 | ||
|
|
6142da5d43 | ||
|
|
f5715d478a | ||
|
|
bce9364d14 | ||
|
|
425949900b | ||
|
|
938681c270 | ||
|
|
30f7a15450 | ||
|
|
4d4006309b | ||
|
|
41f1e0d52a | ||
|
|
db207a87fc | ||
|
|
89ab349565 | ||
|
|
8ffe108f95 | ||
|
|
074d9268b0 | ||
|
|
fc7b21aa73 | ||
|
|
6f83732b0e | ||
|
|
97141307ed | ||
|
|
ddec5540bc | ||
|
|
09b97ae69d | ||
|
|
977c1b5767 | ||
|
|
467b3897fb | ||
|
|
a688381a3c | ||
|
|
9bad79439b | ||
|
|
608b9637b0 | ||
|
|
fcd59e95f0 | ||
|
|
5820d98e2c | ||
|
|
9c6b9d6260 | ||
|
|
9fad74246e | ||
|
|
aab3f74290 | ||
|
|
0eb2ce3728 | ||
|
|
f9aabb68d5 | ||
|
|
9917da1ca3 | ||
|
|
acf7344c13 | ||
|
|
693ff8bd19 | ||
|
|
c1286064bb | ||
|
|
2503b1fc72 | ||
|
|
d468c13b3f | ||
|
|
064611a15d | ||
|
|
5c427dd08a | ||
|
|
1703e6d328 | ||
|
|
35c27393ce | ||
|
|
fca93627ba | ||
|
|
417a127dd9 | ||
|
|
afde0b98ad | ||
|
|
a0069cc9be | ||
|
|
368255f50b | ||
|
|
ad1233ff32 | ||
|
|
697ddc356e | ||
|
|
b82eb8325e | ||
|
|
c150053a83 | ||
|
|
7ee83ff47f | ||
|
|
98905256f8 | ||
|
|
a8a511c4ff | ||
|
|
d0d90946b3 | ||
|
|
c2ad0fa44d | ||
|
|
be7fa433c5 | ||
|
|
01e9d7c0bc | ||
|
|
2f398a2671 | ||
|
|
8254547866 | ||
|
|
e8ceb167b5 | ||
|
|
434c794671 | ||
|
|
9628be4812 | ||
|
|
bd90dc7ec2 | ||
|
|
e0736df927 | ||
|
|
afa58be1f8 | ||
|
|
3cbcac96ba | ||
|
|
a92f32eba4 | ||
|
|
842968da4f | ||
|
|
60ef90c1b6 | ||
|
|
56cec9cb7f | ||
|
|
4042d46009 | ||
|
|
d6dfc5bd08 | ||
|
|
451036aebc | ||
|
|
8d01ace7a6 | ||
|
|
d7e22b922b | ||
|
|
a1d535058d | ||
|
|
1bb307ef4f | ||
|
|
404a642e41 | ||
|
|
ae3f1819e6 | ||
|
|
fbd8f64c40 | ||
|
|
369fc0d4bb | ||
|
|
b44afe067f | ||
|
|
d69245f570 | ||
|
|
c3564ff528 | ||
|
|
fafe1d9447 | ||
|
|
e35bf1d509 | ||
|
|
8e11e5dbc8 | ||
|
|
2698ee9358 | ||
|
|
92be6f1129 | ||
|
|
4dfc196968 | ||
|
|
1c17fed77d | ||
|
|
27b9fb9350 | ||
|
|
b917a2177e | ||
|
|
2372de4864 | ||
|
|
c5d7ddd851 | ||
|
|
a688b2091c | ||
|
|
bfc7e6a78a | ||
|
|
41495cf6e5 | ||
|
|
d3d1b444de | ||
|
|
9681b6222c | ||
|
|
d20fb01a1b | ||
|
|
85e49b3df6 | ||
|
|
511e0af668 | ||
|
|
1151478d13 | ||
|
|
7e87028731 | ||
|
|
cb18ecc420 | ||
|
|
e581c05d27 | ||
|
|
3ae6c52e7d | ||
|
|
498a06916b | ||
|
|
332057fdd4 | ||
|
|
58aff3cb45 | ||
|
|
5678b6dcaa | ||
|
|
a597c514f7 | ||
|
|
3c1dcf90eb | ||
|
|
62dc6c28a3 | ||
|
|
2703ea0421 | ||
|
|
b4a0572b7c | ||
|
|
428055c911 | ||
|
|
97723f9e7a | ||
|
|
2dceb5b44b | ||
|
|
8c9689caf7 | ||
|
|
af5bb94c8c | ||
|
|
9db65fcfba | ||
|
|
2b43c27e53 | ||
|
|
c16f4d3f82 | ||
|
|
99a4f3c036 | ||
|
|
71217d4f68 | ||
|
|
ad012d7549 | ||
|
|
6cca837500 | ||
|
|
6bec3c159c | ||
|
|
fd921bb196 | ||
|
|
60d2f92da3 | ||
|
|
8f83250890 | ||
|
|
652ec8a4af | ||
|
|
937b824055 | ||
|
|
889723079b | ||
|
|
7a457ae32a | ||
|
|
7e5e38e657 | ||
|
|
44edac6572 | ||
|
|
fea3e1e4ef | ||
|
|
eae31a6dd4 | ||
|
|
3a1a65d5df | ||
|
|
70a22d0299 | ||
|
|
2a19a1a92a | ||
|
|
5b865c9dbc | ||
|
|
bc041faf04 | ||
|
|
de08bc79a1 |
@@ -5,14 +5,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bbfdm
|
||||
PKG_VERSION:=1.16.6.6
|
||||
PKG_VERSION:=1.18.18
|
||||
|
||||
USE_LOCAL:=0
|
||||
ifneq ($(USE_LOCAL),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/bbfdm.git
|
||||
PKG_SOURCE_VERSION:=6317266bdfb0180d75ed2dd830e108f09fe2526a
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_VERSION:=fbf01a9e30e7ecccc2453af7abfbccf939e27d43
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -55,7 +55,7 @@ define Package/dm-service
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=TRx69
|
||||
TITLE:=Datamodel ubus backend to expose micro-service tree
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libbbfdm-api +libbbfdm-ubus +bbf_configmngr
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libbbfdm-api +libbbfdm-ubus +bbf_configmngr +libeasy
|
||||
endef
|
||||
|
||||
define Package/bbf_configmngr
|
||||
@@ -183,6 +183,7 @@ define Package/bbf_configmngr/install
|
||||
|
||||
$(INSTALL_BIN) ./files/etc/init.d/bbf_configd $(1)/etc/init.d/bbf_configd
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/utilities/files/usr/share/bbfdm/scripts/bbf_config_notify.sh $(1)/usr/share/bbfdm/scripts/
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/utilities/files/usr/share/bbfdm/scripts/bbf_default_reload.sh $(1)/etc/bbfdm/
|
||||
$(INSTALL_DATA) ./files/etc/bbfdm/critical_services.json $(1)/etc/bbfdm/
|
||||
endef
|
||||
|
||||
|
||||
@@ -1,23 +1,47 @@
|
||||
{
|
||||
"usp": [
|
||||
"firewall",
|
||||
"network",
|
||||
"dhcp",
|
||||
"time",
|
||||
"wireless",
|
||||
"ieee1905",
|
||||
"mapcontroller",
|
||||
"mosquitto",
|
||||
"nginx",
|
||||
"netmode"
|
||||
"/etc/config/firewall",
|
||||
"/etc/bbfdm/dmmap/dmmap_firewall",
|
||||
"/etc/config/network",
|
||||
"/etc/bbfdm/dmmap/IP",
|
||||
"/etc/bbfdm/dmmap/Ethernet",
|
||||
"/etc/bbfdm/dmmap/GRE",
|
||||
"/etc/bbfdm/dmmap/IPv6rd",
|
||||
"/etc/bbfdm/dmmap/PPP",
|
||||
"/etc/bbfdm/dmmap/Routing",
|
||||
"/etc/config/dhcp",
|
||||
"/etc/bbfdm/dmmap/DHCPv4",
|
||||
"/etc/bbfdm/dmmap/DHCPv6",
|
||||
"/etc/config/time",
|
||||
"/etc/bbfdm/dmmap/dmmap_time",
|
||||
"/etc/config/mapcontroller",
|
||||
"/etc/config/wireless",
|
||||
"/etc/bbfdm/dmmap/WiFi",
|
||||
"/etc/config/ieee1905",
|
||||
"/etc/config/mosquitto",
|
||||
"/etc/config/nginx",
|
||||
"/etc/config/netmode",
|
||||
"/etc/bbfdm/dmmap/dmmap_netmode"
|
||||
],
|
||||
"cwmp": [
|
||||
"firewall",
|
||||
"network",
|
||||
"dhcp",
|
||||
"mapcontroller",
|
||||
"wireless",
|
||||
"time",
|
||||
"netmode"
|
||||
"/etc/config/firewall",
|
||||
"/etc/bbfdm/dmmap/dmmap_firewall",
|
||||
"/etc/config/network",
|
||||
"/etc/bbfdm/dmmap/IP",
|
||||
"/etc/bbfdm/dmmap/Ethernet",
|
||||
"/etc/bbfdm/dmmap/GRE",
|
||||
"/etc/bbfdm/dmmap/IPv6rd",
|
||||
"/etc/bbfdm/dmmap/PPP",
|
||||
"/etc/bbfdm/dmmap/Routing",
|
||||
"/etc/config/dhcp",
|
||||
"/etc/bbfdm/dmmap/DHCPv4",
|
||||
"/etc/bbfdm/dmmap/DHCPv6",
|
||||
"/etc/config/mapcontroller",
|
||||
"/etc/config/wireless",
|
||||
"/etc/bbfdm/dmmap/WiFi",
|
||||
"/etc/config/time",
|
||||
"/etc/bbfdm/dmmap/dmmap_time",
|
||||
"/etc/config/netmode",
|
||||
"/etc/bbfdm/dmmap/dmmap_netmode"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -10,19 +10,10 @@ log() {
|
||||
echo "${@}"|logger -t bbf.config -p info
|
||||
}
|
||||
|
||||
create_needed_directories()
|
||||
{
|
||||
mkdir -p /tmp/bbfdm/.cwmp
|
||||
mkdir -p /tmp/bbfdm/.usp
|
||||
mkdir -p /tmp/bbfdm/.bbfdm
|
||||
}
|
||||
|
||||
start_service()
|
||||
{
|
||||
local log_level
|
||||
|
||||
create_needed_directories
|
||||
|
||||
config_load bbfdm
|
||||
config_get log_level "reload_handler" log_level 2
|
||||
|
||||
@@ -36,6 +27,6 @@ start_service()
|
||||
service_triggers() {
|
||||
for config_file in /etc/config/*; do
|
||||
config_name=$(basename "$config_file")
|
||||
procd_add_config_trigger "config.change" "$config_name" /usr/share/bbfdm/scripts/bbf_config_notify.sh
|
||||
procd_add_config_trigger "config.change" "$config_name" /usr/share/bbfdm/scripts/bbf_config_notify.sh "$config_name"
|
||||
done
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ PKG_SOURCE_VERSION:=7b810a696c78b746185c11282bdbe3fb7f8c5d4b
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/dotse/bbk.git
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/mmeeks/bootchart.git
|
||||
PKG_SOURCE_VERSION:=3ab81137cafe25c2ca4bc3a5f322a63646f9ce8d
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
|
||||
@@ -5,6 +5,12 @@ config BRIDGEMNGR_BRIDGE_VLAN
|
||||
help
|
||||
Set this option to use bridge-vlan as backend for VLAN objects.
|
||||
|
||||
config BRIDGEMNGR_COPY_PBITS
|
||||
bool "Copy pbits from cvlan to svlan"
|
||||
default y
|
||||
help
|
||||
Set this option to copy cvlan pbits to svlan pbits by default (driver vlan).
|
||||
|
||||
config BRIDGEMNGR_BRIDGE_VENDOR_EXT
|
||||
bool "Use bridge BBF vendor extensions"
|
||||
default y
|
||||
@@ -14,4 +20,9 @@ config BRIDGEMNGR_BRIDGE_VENDOR_EXT
|
||||
config BRIDGEMNGR_BRIDGE_VENDOR_PREFIX
|
||||
string "Package specific datamodel Vendor Prefix for TR181 extensions"
|
||||
default ""
|
||||
|
||||
config BRIDGEMNGR_USE_DM_FRAMEWORK
|
||||
bool "Use new DM framework support"
|
||||
default n
|
||||
|
||||
endif
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bridgemngr
|
||||
PKG_VERSION:=1.0.18.2
|
||||
PKG_VERSION:=1.2.0
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/bridgemngr
|
||||
PKG_SOURCE_VERSION:=71ed529be038392071b0399bcfe9d46e89d3cb46
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/bridgemngr.git
|
||||
PKG_SOURCE_VERSION:=3c8b4bbc53cf89dc98a54fa1490c160a77e24c66
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -20,27 +20,35 @@ PKG_LICENSE:=GPL-2.0-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
include ../bbfdm/bbfdm.mk
|
||||
include ../dm-framework/dm-framework.mk
|
||||
|
||||
define Package/bridgemngr
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=Bridge Manager
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json
|
||||
DEPENDS+=+libbbfdm-api +libbbfdm-ubus +dm-service
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=Bridge Manager
|
||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json
|
||||
ifeq ($(CONFIG_BRIDGEMNGR_USE_DM_FRAMEWORK),y)
|
||||
DEPENDS+= +dm-framework
|
||||
else
|
||||
DEPENDS+= +libbbfdm-api +libbbfdm-ubus +dm-service
|
||||
endif
|
||||
endef
|
||||
|
||||
define Package/bridgemngr/description
|
||||
Package to add Device.Bridging. data model support.
|
||||
Package to add Device.Bridging. data model support.
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
ifneq ($(CONFIG_BRIDGEMNGR_USE_DM_FRAMEWORK),y)
|
||||
MAKE_PATH:=src
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_BRIDGEMNGR_BRIDGE_VENDOR_PREFIX),"")
|
||||
VENDOR_PREFIX = $(CONFIG_BBF_VENDOR_PREFIX)
|
||||
VENDOR_PREFIX = $(if $(CONFIG_BBF_VENDOR_PREFIX),$(CONFIG_BBF_VENDOR_PREFIX),$(CONFIG_DM_FRAMEWORK_VENDOR_PREFIX))
|
||||
else
|
||||
VENDOR_PREFIX = $(CONFIG_BRIDGEMNGR_BRIDGE_VENDOR_PREFIX)
|
||||
endif
|
||||
@@ -48,18 +56,32 @@ endif
|
||||
TARGET_CFLAGS += -DBBF_VENDOR_PREFIX=\\\"$(VENDOR_PREFIX)\\\"
|
||||
|
||||
ifeq ($(CONFIG_BRIDGEMNGR_BRIDGE_VLAN),y)
|
||||
TARGET_CFLAGS += -DBRIDGE_VLAN_BACKEND
|
||||
TARGET_CFLAGS += -DBRIDGE_VLAN_BACKEND
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_BRIDGEMNGR_COPY_PBITS),y)
|
||||
TARGET_CFLAGS += -DBRIDGEMNGR_COPY_PBITS
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_BRIDGEMNGR_USE_DM_FRAMEWORK),y)
|
||||
define Build/Compile
|
||||
$(call Build/Compile/DM,$(PKG_BUILD_DIR)/dmf,$(PKG_BUILD_DIR)/dmf,$(VENDOR_PREFIX))
|
||||
endef
|
||||
endif
|
||||
|
||||
define Package/bridgemngr/install
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
|
||||
ifeq ($(CONFIG_BRIDGEMNGR_USE_DM_FRAMEWORK),y)
|
||||
$(call Build/Install/DM,$(PKG_BUILD_DIR)/dmf,$(PKG_BUILD_DIR)/dmf,$(1),bridgemngr)
|
||||
else
|
||||
$(BBFDM_REGISTER_SERVICES) ./bbfdm_service.json $(1) $(PKG_NAME)
|
||||
$(BBFDM_INSTALL_MS_DM) $(PKG_BUILD_DIR)/src/libbridgemngr.so $(1) $(PKG_NAME)
|
||||
ifeq ($(CONFIG_BRIDGEMNGR_BRIDGE_VENDOR_EXT), y)
|
||||
$(BBFDM_INSTALL_MS_PLUGIN) $(PKG_BUILD_DIR)/src/libbridgeext.so $(1) $(PKG_NAME) 10
|
||||
$(BBFDM_INSTALL_MS_PLUGIN) -v ${VENDOR_PREFIX} ./files/VLAN_Filtering_Extension.json $(1) $(PKG_NAME) 11
|
||||
endif
|
||||
endif
|
||||
|
||||
$(INSTALL_BIN) ./files/etc/init.d/bridging $(1)/etc/init.d/
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=bulkdata
|
||||
PKG_VERSION:=2.1.20
|
||||
PKG_VERSION:=2.1.23
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/bulkdata.git
|
||||
PKG_SOURCE_VERSION:=a5e57962938ca143ede65d92be90b6e9fce66e15
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_VERSION:=f54550f2d587a701c0a8d5cac4a0910a99ce92cf
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bulut/bulut-gw-client.git
|
||||
PKG_SOURCE_VERSION:=227700c44817afa2c392fa08bf4cf70fa6177f01
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
@@ -12,7 +12,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/ddnsmngr.git
|
||||
PKG_SOURCE_VERSION:=44af9a7b3fec3929f8554af9633a5b8068189b48
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -4,4 +4,16 @@ config DECOLLECTOR_EASYMESH_VERSION
|
||||
int "Support Easymesh version"
|
||||
default 6
|
||||
|
||||
config DECOLLECTOR_BUILD_TR181_PLUGIN
|
||||
bool "Build TR-181 mapping module (responsible for Device.WiFi.DataElements.)"
|
||||
default y
|
||||
|
||||
config DECOLLECTOR_VENDOR_EXTENSIONS
|
||||
bool "Iopsys vendor extensions for Device.WiFi.DataElements."
|
||||
default y
|
||||
|
||||
config DECOLLECTOR_VENDOR_PREFIX
|
||||
string "Package specific datamodel Vendor Prefix for TR181 extensions"
|
||||
default ""
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=decollector
|
||||
PKG_VERSION:=6.2.1.14
|
||||
PKG_VERSION:=6.2.3.9
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=d9ff69760bc34dd3928fa784dfb3116bfe3f95af
|
||||
PKG_SOURCE_VERSION:=d1d948a48952fe2091e84af1293a6e77857439cf
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/decollector.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
@@ -24,6 +24,7 @@ PKG_LICENSE:=BSD-3-Clause
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(TOPDIR)/feeds/iopsys/bbfdm/bbfdm.mk
|
||||
|
||||
define Package/decollector
|
||||
SECTION:=utils
|
||||
@@ -31,6 +32,7 @@ define Package/decollector
|
||||
TITLE:=WiFi DataElements Collector Proxy
|
||||
DEPENDS:=+libuci +libubox +ubus +libpthread +libnl-genl \
|
||||
+libeasy +libwifiutils +libieee1905 +ieee1905-map-plugin
|
||||
DEPENDS+=+libbbfdm-api +libbbfdm-ubus
|
||||
endef
|
||||
|
||||
define Package/decollector/description
|
||||
@@ -66,6 +68,18 @@ MAKE_PATH:=src
|
||||
|
||||
TARGET_CFLAGS += -DEASYMESH_VERSION=$(CONFIG_DECOLLECTOR_EASYMESH_VERSION)
|
||||
|
||||
ifeq ($(CONFIG_DECOLLECTOR_BUILD_TR181_PLUGIN),y)
|
||||
MAKE_FLAGS += DECOLLECTOR_BUILD_TR181_PLUGIN=y
|
||||
ifeq ($(CONFIG_DECOLLECTOR_VENDOR_EXTENSIONS),y)
|
||||
TARGET_CFLAGS += -DDECOLLECTOR_VENDOR_EXTENSIONS
|
||||
ifeq ($(CONFIG_DECOLLECTOR_VENDOR_PREFIX),"")
|
||||
TARGET_CFLAGS += -DCUSTOM_PREFIX=\\\"$(CONFIG_BBF_VENDOR_PREFIX)\\\"
|
||||
else
|
||||
TARGET_CFLAGS += -DCUSTOM_PREFIX=\\\"$(CONFIG_DECOLLECTOR_VENDOR_PREFIX)\\\"
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
EXECS := \
|
||||
$(if $(CONFIG_PACKAGE_decollector),decollector)
|
||||
|
||||
@@ -76,6 +90,7 @@ define Package/decollector/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) ./files/decollector.init $(1)/etc/init.d/decollector
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/decollector $(1)/usr/sbin/
|
||||
$(BBFDM_REGISTER_SERVICES) ./bbfdm_service.json $(1) $(PKG_NAME)
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,decollector))
|
||||
|
||||
26
decollector/bbfdm_service.json
Normal file
26
decollector/bbfdm_service.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"daemon": {
|
||||
"enable": "1",
|
||||
"service_name": "decollector",
|
||||
"unified_daemon": true,
|
||||
"services": [
|
||||
{
|
||||
"parent_dm": "Device.WiFi.",
|
||||
"object": "DataElements"
|
||||
}
|
||||
],
|
||||
"config": {
|
||||
"loglevel": "3"
|
||||
},
|
||||
"apply_handler": {
|
||||
"uci": [
|
||||
{
|
||||
"file": [
|
||||
"mapcontroller"
|
||||
],
|
||||
"external_handler": "/etc/wifidmd/bbf_config_reload.sh"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,13 +2,13 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dectmngr
|
||||
PKG_RELEASE:=3
|
||||
PKG_VERSION:=3.7.10
|
||||
PKG_VERSION:=3.7.13
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dectmngr.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=1f851980a6ba616df54f79930225f8bcd563b711
|
||||
PKG_SOURCE_VERSION:=5c2720563b3ed889e9d4de6fdb9b0f6a9d584094
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -20,7 +20,7 @@ export BUILD_DIR
|
||||
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dhcpmngr
|
||||
PKG_VERSION:=1.0.10
|
||||
PKG_VERSION:=1.1.6
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/dhcpmngr.git
|
||||
PKG_SOURCE_VERSION:=e238e47fa13153c5b1890056b0d09c65879de8c5
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_VERSION:=74d96cd70119e4ea08767d68b45b4922162d0328
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
87
dm-framework/Makefile
Executable file
87
dm-framework/Makefile
Executable file
@@ -0,0 +1,87 @@
|
||||
#
|
||||
# Copyright (c) 2025 IOPSYS
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dm-framework
|
||||
PKG_VERSION:=1.0.1
|
||||
PKG_RELEASE:=1
|
||||
|
||||
USE_LOCAL:=0
|
||||
ifneq ($(USE_LOCAL),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/lcm/dm-framework.git
|
||||
PKG_SOURCE_VERSION:=0124fbc08c15f5e3147ec2589cb9c222fe8bea09
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/dm-framework
|
||||
CATEGORY:=Genexis
|
||||
TITLE:=DM JS Framework
|
||||
URL:=http://www.genexis.eu
|
||||
DEPENDS:=+libsqlite3 +libjson-c +libstdcpp +quickjs +libubus +libubox +libuci +ubus
|
||||
PKG_LICENSE:=GENEXIS
|
||||
endef
|
||||
|
||||
define Package/dm-framework/description
|
||||
JS based TR181 datamodel framework
|
||||
endef
|
||||
|
||||
TARGET_CFLAGS += $(FPIC)
|
||||
|
||||
ifeq ($(USE_LOCAL),1)
|
||||
define Build/Prepare
|
||||
$(CP) ~/git/dm-framework/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
define Package/dm-framework/install
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_BIN) ./files/etc/init.d/dmf $(1)/etc/init.d/
|
||||
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dm-api/libdmapi.so $(1)/usr/lib/
|
||||
|
||||
$(INSTALL_DIR) $(1)/etc/bbfdm/dmf
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dm-api/quickjs/uci.js $(1)/etc/bbfdm/dmf/
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dm-api/quickjs/utils.js $(1)/etc/bbfdm/dmf/
|
||||
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dm-agent/dm-agent $(1)/usr/sbin
|
||||
|
||||
$(INSTALL_DIR) $(1)/etc/dm-framework
|
||||
$(INSTALL_BIN) ./files/etc/dm-framework/dmf_reload_handler.sh $(1)/etc/dm-framework/
|
||||
endef
|
||||
|
||||
|
||||
# Development Installation (headers and libraries)
|
||||
define Build/InstallDev
|
||||
# DM-API development files - headers are now in dm-api/include/
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(CP) $(PKG_BUILD_DIR)/dm-api/include/dm_types.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/dm-api/include/dm_node.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/dm-api/core/dm_api.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/dm-api/core/dm_linker.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/dm-api/core/dbmgr.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/dm-api/include/dm_log.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/dm-api/utils/dm_list.h $(1)/usr/include/
|
||||
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/dm-api/libdmapi.so $(1)/usr/lib/
|
||||
|
||||
# Install json2code.js script and package.json to staging for other packages to use
|
||||
$(INSTALL_DIR) $(1)/usr/lib/dm-framework/scripts
|
||||
$(CP) $(PKG_BUILD_DIR)/scripts/json2code.js $(1)/usr/lib/dm-framework/scripts/
|
||||
$(CP) $(PKG_BUILD_DIR)/scripts/package.json $(1)/usr/lib/dm-framework/scripts/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,dm-framework))
|
||||
33
dm-framework/dm-framework.mk
Normal file
33
dm-framework/dm-framework.mk
Normal file
@@ -0,0 +1,33 @@
|
||||
# dm-framework.mk - Common rules for DM Framework
|
||||
|
||||
DM_SCRIPT_DIR ?= $(STAGING_DIR)/usr/lib/dm-framework/scripts
|
||||
JSON2CODE = $(DM_SCRIPT_DIR)/json2code.js
|
||||
|
||||
# Macro to generate code
|
||||
# $(1): Input directory (datamodels)
|
||||
# $(2): Output directory (where generated files go)
|
||||
# $(3): Vendor Prefix (optional)
|
||||
define Build/Compile/DM
|
||||
$(INSTALL_DIR) $(2)
|
||||
@# Install npm dependencies if not already installed
|
||||
@if [ ! -d "$(DM_SCRIPT_DIR)/node_modules" ]; then \
|
||||
cd $(DM_SCRIPT_DIR) && npm install --production; \
|
||||
fi
|
||||
node $(JSON2CODE) -i $(1) -o $(2) $(if $(3),--vendor-prefix $(3))
|
||||
$(TARGET_CC) $(TARGET_CFLAGS) -I$(2) -I$(STAGING_DIR)/usr/include/ -fPIC -c $(2)/dm.c -o $(2)/dm.o
|
||||
$(TARGET_CC) $(TARGET_LDFLAGS) -shared -o $(2)/lib$(PKG_NAME).so $(2)/dm.o
|
||||
endef
|
||||
|
||||
# Macro to install DM
|
||||
# $(1): Input directory (datamodels)
|
||||
# $(2): Output directory (build dir)
|
||||
# $(3): Destination directory (rootfs)
|
||||
# $(4): Package Name (subdir in /etc/bbfdm/dmf)
|
||||
define Build/Install/DM
|
||||
$(INSTALL_DIR) $(3)/etc/bbfdm/dmf/$(4)
|
||||
$(CP) $(2)/lib$(PKG_NAME).so $(3)/etc/bbfdm/dmf/$(4)/
|
||||
$(CP) $(1)/*.js $(3)/etc/bbfdm/dmf/$(4)/
|
||||
$(CP) $(2)/default.db $(3)/etc/bbfdm/dmf/default_dm.db
|
||||
$(CP) $(2)/exports.js $(3)/etc/bbfdm/dmf/$(4)/exports.js
|
||||
$(CP) $(2)/dm_consts.js $(3)/etc/bbfdm/dmf/$(4)/dm_consts.js
|
||||
endef
|
||||
26
dm-framework/dmf_service.json
Normal file
26
dm-framework/dmf_service.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"daemon": {
|
||||
"enable": "1",
|
||||
"service_name": "dmf",
|
||||
"unified_daemon": true,
|
||||
"services": [
|
||||
{
|
||||
"parent_dm": "Device.",
|
||||
"object": "Bridging"
|
||||
}
|
||||
],
|
||||
"config": {
|
||||
"loglevel": "3"
|
||||
},
|
||||
"apply_handler": {
|
||||
"uci": [
|
||||
{
|
||||
"file": [
|
||||
"/etc/bbfdm/dmmap/Bridging"
|
||||
],
|
||||
"external_handler": "/etc/dm-framework/dmf_reload_handler.sh"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
11
dm-framework/files/etc/dm-framework/dmf_reload_handler.sh
Normal file
11
dm-framework/files/etc/dm-framework/dmf_reload_handler.sh
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
. /usr/share/libubox/jshn.sh
|
||||
|
||||
logger -t dmf.reload_handler "Inputs [$@]"
|
||||
|
||||
json_init
|
||||
json_add_string "cmd" "commit"
|
||||
json_compact
|
||||
|
||||
data="$(json_dump)"
|
||||
ubus -t 5 call bbfdm.dmf transaction "${data}"
|
||||
12
dm-framework/files/etc/init.d/dmf
Normal file
12
dm-framework/files/etc/init.d/dmf
Normal file
@@ -0,0 +1,12 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=85
|
||||
STOP=05
|
||||
USE_PROCD=1
|
||||
|
||||
start_service() {
|
||||
procd_open_instance dmf
|
||||
procd_set_param command "/usr/sbin/dm-agent"
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
}
|
||||
@@ -11,11 +11,12 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dmcli
|
||||
PKG_LICENSE:=PROPRIETARY GENEXIS
|
||||
PKG_VERSION:=1.9.4
|
||||
PKG_VERSION:=1.9.6
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/gnx/dmcli.git
|
||||
PKG_SOURCE_VERSION:=2139e81d0faca09fe1832c503297ef75ea76d6eb
|
||||
PKG_SOURCE_VERSION:=f03188eff6c2cab59e4c8f18a435c940ff5043f5
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dnsmngr
|
||||
PKG_VERSION:=1.0.20
|
||||
PKG_VERSION:=1.0.21
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/dnsmngr.git
|
||||
PKG_SOURCE_VERSION:=448d278734a824f9d4ad1e7a55acd16c222d4c7e
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_VERSION:=ef3714cc7555f763dfab626add8f90d7bc0a33b5
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/dslmngr.git
|
||||
PKG_SOURCE_VERSION:=8fb4093b4d26b3cb06603e110d424005e33cf5d6
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MAINTAINER:=Rahul Thakur <rahul.thakur@iopsys.eu>
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -14,7 +14,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/ebtables-extensions.git
|
||||
PKG_SOURCE_VERSION:=7357622d806833d93d317164dc6673fbf5fd1629
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ethmngr
|
||||
PKG_VERSION:=3.0.9
|
||||
PKG_VERSION:=3.1.4
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/ethmngr.git
|
||||
PKG_SOURCE_VERSION:=0bcfd98d64b5bd8d3162944e2abd5740f9bf4b92
|
||||
PKG_SOURCE_VERSION:=0283fb5cb74a7baca46c4360da680757c57c86ac
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -16,7 +16,7 @@ PKG_SOURCE_VERSION:=98af6019a4a1b478a6fa35f74528cb3cd404ae40
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://git.launchpad.net/fatrace
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
|
||||
@@ -10,20 +10,15 @@ PKG_NAME:=fdtextract
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.0
|
||||
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/fdtextract.git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/system/fdtextract.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=e3cefda3b26c9aea3021b20725ce7b31b33eebc4
|
||||
PKG_SOURCE_VERSION:=7917dbcb29724476cd46164eec29848df1e5fb67
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
RSTRIP:=true
|
||||
export BUILD_DIR
|
||||
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
@@ -40,9 +35,7 @@ endef
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/fdtextract $(1)/usr/sbin/
|
||||
$(STRIP) $(1)/usr/sbin/fdtextract
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
|
||||
@@ -8,11 +8,5 @@ config FIREWALLMNGR_PORT_TRIGGER
|
||||
help
|
||||
Set this option to include support for PortTrigger object.
|
||||
|
||||
config FIREWALLMNGR_NAT_INTERFACE_SETTING
|
||||
bool "Include Device.NAT.InterfaceSetting"
|
||||
default y
|
||||
help
|
||||
Set this option to include support for NAT InterfaceSetting object.
|
||||
|
||||
endmenu
|
||||
endif
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=firewallmngr
|
||||
PKG_VERSION:=1.0.9.5
|
||||
PKG_VERSION:=1.0.12
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/firewallmngr.git
|
||||
PKG_SOURCE_VERSION:=02dc90c48d996148b68d02632bac13a28d75cf25
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_VERSION:=30319c67fb4db285a2bcd272b1c10bc040eecf19
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -52,10 +52,6 @@ ifeq ($(CONFIG_FIREWALLMNGR_PORT_TRIGGER),y)
|
||||
TARGET_CFLAGS += -DINCLUDE_PORT_TRIGGER
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_FIREWALLMNGR_NAT_INTERFACE_SETTING),y)
|
||||
TARGET_CFLAGS += -DINCLUDE_NAT_IF_SETTING
|
||||
endif
|
||||
|
||||
define Package/firewallmngr/install
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
|
||||
@@ -13,7 +13,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/fluent/fluent-bit.git
|
||||
PKG_SOURCE_VERSION=v$(PKG_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -56,7 +56,7 @@ CMAKE_OPTIONS+= \
|
||||
-DFLB_BACKTRACE=No \
|
||||
-DFLB_KAFKA=No \
|
||||
-DFLB_WASM=No \
|
||||
-DFLB_LUAJIT=No
|
||||
-DFLB_LUAJIT=Yes
|
||||
|
||||
# In plugins
|
||||
CMAKE_OPTIONS += \
|
||||
@@ -107,7 +107,7 @@ CMAKE_OPTIONS += \
|
||||
-DFLB_FILTER_AWS=No \
|
||||
-DFLB_FILTER_ECS=No \
|
||||
-DFLB_FILTER_KUBERNETES=No \
|
||||
-DFLB_FILTER_LUA=No \
|
||||
-DFLB_FILTER_LUA=Yes \
|
||||
-DFLB_FILTER_NEST=No \
|
||||
-DFLB_FILTER_RECORD_MODIFIER=No \
|
||||
-DFLB_FILTER_THROTTLE=No \
|
||||
|
||||
@@ -15,7 +15,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/gateway-info.git
|
||||
PKG_SOURCE_VERSION:=dd15893a8291e556a8c49ff9e143c763db0379b5
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ configure_send_op125() {
|
||||
|
||||
|
||||
if [ "${uci}" = "network" ]; then
|
||||
new_send_opt="$sendopt $opt125"
|
||||
[ -n "${sendopt}" ] && new_send_opt="$sendopt $opt125" || new_send_opt="$opt125"
|
||||
uci -q set network."${intf}".sendopts="$new_send_opt"
|
||||
else
|
||||
new_send_opt="$sendopt$opt125"
|
||||
@@ -228,7 +228,7 @@ enable_dhcp_option125() {
|
||||
|
||||
if [ "${proto}" = "dhcp" ]; then
|
||||
if [ ${req125_present} -eq 0 ]; then
|
||||
newreqopts="$reqopts 125"
|
||||
[ -n "${reqopts}" ] && newreqopts="$reqopts 125" || newreqopts="125"
|
||||
uci -q set network."${wan}".reqopts="$newreqopts"
|
||||
fi
|
||||
|
||||
|
||||
@@ -40,22 +40,22 @@ get_vivsoi() {
|
||||
|
||||
#hex-string 2 character=1 Byte
|
||||
# length in hex string will be twice of actual Byte length
|
||||
[ "$len" -gt "8" ] || return
|
||||
[ "${len}" -gt 8 ] || return
|
||||
|
||||
data="${opt125}"
|
||||
rem_len="${len}"
|
||||
while [ $rem_len -gt 0 ]; do
|
||||
while [ "${rem_len}" -gt 0 ]; do
|
||||
ent_id=${data:0:8}
|
||||
ent_id=$(printf "%d\n" "0x$ent_id")
|
||||
|
||||
if [ $ent_id -ne 3561 ]; then
|
||||
if [ "${ent_id}" -ne 3561 ]; then
|
||||
len_val=${data:8:2}
|
||||
data_len=$(printf "%d\n" "0x$len_val")
|
||||
# add 4 byte for ent_id and 1 byte for len
|
||||
data_len=$(( data_len * 2 + 10 ))
|
||||
# move ahead data to next enterprise id
|
||||
data=${data:"${data_len}":"${rem_len}"}
|
||||
rem_len=$(( rem_len - $data_len ))
|
||||
rem_len=$(( rem_len - data_len ))
|
||||
continue
|
||||
fi
|
||||
|
||||
@@ -66,7 +66,7 @@ get_vivsoi() {
|
||||
data_len=$(( data_len * 2 + 10 ))
|
||||
|
||||
opt_len=$(printf "%d\n" "0x$len_val")
|
||||
[ $opt_len -eq 0 ] && return
|
||||
[ "${opt_len}" -eq 0 ] && return
|
||||
|
||||
# populate the option data of enterprise id
|
||||
sub_data_len=$(( opt_len * 2))
|
||||
@@ -74,7 +74,7 @@ get_vivsoi() {
|
||||
sub_data=${data:10:"${sub_data_len}"}
|
||||
|
||||
# parsing of suboption of option 125
|
||||
while [ $sub_data_len -gt 0 ]; do
|
||||
while [ "${sub_data_len}" -gt 0 ]; do
|
||||
# get the suboption id
|
||||
sub_opt_id=${sub_data:0:2}
|
||||
sub_opt_id=$(printf "%d\n" "0x$sub_opt_id")
|
||||
@@ -85,20 +85,20 @@ get_vivsoi() {
|
||||
sub_opt_len=$(( sub_opt_len * 2 ))
|
||||
|
||||
# get the value of sub option starting 4 means starting after length
|
||||
sub_opt_val=${sub_data:4:${sub_opt_len}}
|
||||
sub_opt_val=${sub_data:4:"${sub_opt_len}"}
|
||||
|
||||
# assign the value found in sub option
|
||||
case "${sub_opt_id}" in
|
||||
"4")
|
||||
OUI=$(echo -n $sub_opt_val | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
OUI=$(echo -n "${sub_opt_val}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
GW_DISCOVERED=1
|
||||
;;
|
||||
"5")
|
||||
SERIAL=$(echo -n $sub_opt_val | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
SERIAL=$(echo -n "${sub_opt_val}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
GW_DISCOVERED=1
|
||||
;;
|
||||
"6")
|
||||
CLASS=$(echo -n $sub_opt_val | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
CLASS=$(echo -n "${sub_opt_val}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
GW_DISCOVERED=1
|
||||
;;
|
||||
esac
|
||||
@@ -110,7 +110,7 @@ get_vivsoi() {
|
||||
sub_data_len=$((sub_data_len - sub_opt_end))
|
||||
|
||||
# fetch next sub option hex string
|
||||
sub_data=${sub_data:${sub_opt_end}:${sub_data_len}}
|
||||
sub_data=${sub_data:"${sub_opt_end}":"${sub_data_len}"}
|
||||
done
|
||||
|
||||
# move ahead data to next enterprise id
|
||||
@@ -131,15 +131,13 @@ send_host_query() {
|
||||
sleep 5
|
||||
|
||||
json_load "$(ubus call umdns browse)"
|
||||
json_select discovered_services
|
||||
if [ "${?}" -ne 0 ]; then
|
||||
if ! json_select discovered_services; then
|
||||
json_cleanup
|
||||
loop=$(( loop - 1 ))
|
||||
continue
|
||||
fi
|
||||
|
||||
json_select _usp-agt-mqtt._tcp
|
||||
if [ "${?}" -ne 0 ]; then
|
||||
if ! json_select _usp-agt-mqtt._tcp; then
|
||||
json_cleanup
|
||||
loop=$(( loop - 1 ))
|
||||
continue
|
||||
@@ -156,7 +154,7 @@ send_host_query() {
|
||||
|
||||
json_get_keys keys
|
||||
for key in $keys; do
|
||||
json_select $key
|
||||
json_select "${key}"
|
||||
json_get_var _host host ""
|
||||
|
||||
if [ -z "${_host}" ] || [[ "${sent_host}" =~ " ${_host}" ]]; then
|
||||
@@ -166,9 +164,10 @@ send_host_query() {
|
||||
|
||||
sent_host="${sent_host} ${_host}"
|
||||
cmd="ubus call umdns query '{\"question\":\"$_host\",\"interface\":\"$intf\"}'"
|
||||
eval $cmd
|
||||
sh -c "${cmd}"
|
||||
resp=0
|
||||
json_select ..
|
||||
sleep 2 # umdns query sometime takes time to resolve so adding some sleep
|
||||
done
|
||||
|
||||
json_cleanup
|
||||
@@ -185,32 +184,29 @@ get_usp_agent_id() {
|
||||
fi
|
||||
|
||||
json_load "$(ubus call umdns browse)"
|
||||
json_select discovered_services
|
||||
if [ "${?}" -ne 0 ]; then
|
||||
if ! json_select discovered_services; then
|
||||
json_cleanup
|
||||
echo ${ID}
|
||||
echo "${ID}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
json_select _usp-agt-mqtt._tcp
|
||||
if [ "${?}" -ne 0 ]; then
|
||||
if ! json_select _usp-agt-mqtt._tcp; then
|
||||
json_cleanup
|
||||
echo ${ID}
|
||||
echo "${ID}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
json_get_keys keys
|
||||
for key in $keys; do
|
||||
json_select $key
|
||||
json_select $family
|
||||
if [ "${?}" -ne 0 ]; then
|
||||
json_select "${key}"
|
||||
if ! json_select "${family}"; then
|
||||
json_select ..
|
||||
continue
|
||||
fi
|
||||
|
||||
json_get_keys ips
|
||||
for ip in $ips; do
|
||||
json_get_var ip_val $ip
|
||||
json_get_var ip_val "${ip}"
|
||||
if [ "${ip_val}" != "${dhcp_ip}" ]; then
|
||||
continue
|
||||
fi
|
||||
@@ -219,8 +215,8 @@ get_usp_agent_id() {
|
||||
json_select txt
|
||||
json_get_keys txts
|
||||
for _txt in $txts; do
|
||||
json_get_var text_val $_txt
|
||||
if [[ "${text_val:0:3}" == "ID=" ]]; then
|
||||
json_get_var text_val "${_txt}"
|
||||
if [[ "${text_val:0:3}" = "ID=" ]]; then
|
||||
ID="${text_val:3}"
|
||||
break
|
||||
fi
|
||||
@@ -238,16 +234,16 @@ get_usp_agent_id() {
|
||||
done
|
||||
|
||||
json_cleanup
|
||||
echo ${ID}
|
||||
echo "${ID}"
|
||||
}
|
||||
|
||||
get_mac_address() {
|
||||
ip="${1}"
|
||||
device="${2}"
|
||||
|
||||
mac="$(cat /proc/net/arp | grep $ip | awk '{print $4}')"
|
||||
mac=$(grep "${ip}" /proc/net/arp | awk '{print $4}')
|
||||
if [ -z "${mac}" ]; then
|
||||
arp_resp="$(arping -b -f -c 5 -I $device $ip | grep 'Unicast reply from' | awk '{print $5}')"
|
||||
arp_resp=$(arping -b -f -c 5 -I "${device}" "${ip}" | grep 'Unicast reply from' | awk '{print $5}')
|
||||
if [ -n "${arp_resp}" ]; then
|
||||
mac=${arp_resp:1:-1}
|
||||
fi
|
||||
@@ -260,7 +256,7 @@ send_unknown_gw_event() {
|
||||
mac="${1}"
|
||||
|
||||
cmd="ubus -t 5 send gateway-info.gateway.unknown '{\"hwaddr\":\"$mac\"}'"
|
||||
eval $cmd
|
||||
sh -c "${cmd}"
|
||||
}
|
||||
|
||||
send_cwmp_gw_event() {
|
||||
@@ -269,14 +265,14 @@ send_cwmp_gw_event() {
|
||||
serial="${3}"
|
||||
|
||||
cmd="ubus -t 5 send gateway-info.gateway.cwmp '{\"oui\":\"$oui\",\"class\":\"$class\",\"serial\":\"$serial\"}'"
|
||||
eval $cmd
|
||||
sh -c "${cmd}"
|
||||
}
|
||||
|
||||
send_usp_gw_event() {
|
||||
endpoint="${1}"
|
||||
|
||||
cmd="ubus -t 5 send gateway-info.gateway.usp '{\"endpoint\":\"$endpoint\"}'"
|
||||
eval $cmd
|
||||
sh -c "${cmd}"
|
||||
}
|
||||
|
||||
config_load gateway
|
||||
@@ -287,13 +283,13 @@ if [ "${enable}" -eq 0 ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "${wan_intf}" == "${INTERFACE}" ]; then
|
||||
if [ "${1}" == "deconfig" ]; then
|
||||
if [ "${wan_intf}" = "${INTERFACE}" ]; then
|
||||
if [ "${1}" = "deconfig" ]; then
|
||||
rm -rf /var/state/gwinfo
|
||||
return 0
|
||||
fi
|
||||
|
||||
json_load "$(ifstatus ${INTERFACE})"
|
||||
json_load "$(ifstatus "${INTERFACE}")"
|
||||
json_get_var dev_name device ""
|
||||
json_select data
|
||||
json_get_var dhcp_ip dhcpserver ""
|
||||
@@ -303,7 +299,7 @@ if [ "${wan_intf}" == "${INTERFACE}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
MAC="$(get_mac_address $dhcp_ip $dev_name)"
|
||||
MAC=$(get_mac_address "${dhcp_ip}" "${dev_name}")
|
||||
|
||||
mkdir -p /var/state
|
||||
touch /var/state/gwinfo
|
||||
@@ -326,8 +322,8 @@ if [ "${wan_intf}" == "${INTERFACE}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
len=$(printf "$opt125"|wc -c)
|
||||
get_vivsoi "$opt125" "$len"
|
||||
len=$(echo -n "${opt125}" | wc -c)
|
||||
get_vivsoi "${opt125}" "${len}"
|
||||
|
||||
if [ "${GW_DISCOVERED}" -eq 0 ]; then
|
||||
send_unknown_gw_event "${MAC}"
|
||||
@@ -341,19 +337,18 @@ if [ "${wan_intf}" == "${INTERFACE}" ]; then
|
||||
uci -q -c /var/state commit gwinfo
|
||||
|
||||
# Check for USP parameters
|
||||
ubus -t 15 wait_for umdns
|
||||
if [ "${?}" -ne 0 ]; then
|
||||
if ! ubus -t 15 wait_for umdns; then
|
||||
send_cwmp_gw_event "${OUI}" "${CLASS}" "${SERIAL}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
resp=$(send_host_query $dev_name)
|
||||
resp=$(send_host_query "${dev_name}")
|
||||
if [ "${resp}" -ne 0 ]; then
|
||||
send_cwmp_gw_event "${OUI}" "${CLASS}" "${SERIAL}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
ID="$(get_usp_agent_id $dhcp_ip)"
|
||||
ID=$(get_usp_agent_id "${dhcp_ip}")
|
||||
if [ -z "${ID}" ]; then
|
||||
send_cwmp_gw_event "${OUI}" "${CLASS}" "${SERIAL}"
|
||||
return 0
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=hostmngr
|
||||
PKG_VERSION:=1.3.6
|
||||
PKG_VERSION:=1.4.3
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=624fee52af9cce08c6c69a5f7dd2191691d61aa8
|
||||
PKG_SOURCE_VERSION:=667866b8149d3df83a05536319eac02aee0b6d75
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/hostmngr.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
@@ -19,4 +19,8 @@ config ICWMP_VENDOR_PREFIX
|
||||
config ICWMP_ENABLE_SMM_SUPPORT
|
||||
bool "Enable software module management support"
|
||||
default n
|
||||
|
||||
config ICWMP_ENABLE_ANNEX_F_INFORM_PARAM
|
||||
bool "Enable Device.Gateway. and Device.ManagementServer.ManageableDevice. as inform parameter"
|
||||
default y
|
||||
endmenu
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=icwmp
|
||||
PKG_VERSION:=9.9.9.8
|
||||
PKG_VERSION:=9.10.13
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/icwmp.git
|
||||
PKG_SOURCE_VERSION:=cef78dc528690386caac5a7ff6c1afca6dd3d315
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_VERSION:=fc34f19ec5ab691b3d815a0d1d917903d310db75
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -90,6 +90,9 @@ define Package/icwmp/install
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/95-set-random-inform-time $(1)/etc/uci-defaults/
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/85-migrate-gw-info $(1)/etc/uci-defaults/
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/999-cwmp-conn-config $(1)/etc/uci-defaults/
|
||||
ifeq ($(CONFIG_ICWMP_ENABLE_ANNEX_F_INFORM_PARAM),y)
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/99-cwmp-annex-f-config $(1)/etc/uci-defaults/
|
||||
endif
|
||||
$(INSTALL_BIN) ./files/etc/icwmpd/vendor_log.sh $(1)/etc/icwmpd/vendor_log.sh
|
||||
$(INSTALL_BIN) ./files/etc/icwmpd/firewall.cwmp $(1)/etc/icwmpd/firewall.cwmp
|
||||
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/icwmp $(1)/lib/upgrade/keep.d/icwmp
|
||||
|
||||
@@ -31,7 +31,6 @@ config cpe 'cpe'
|
||||
option bind_retries '5'
|
||||
option userid '' #$OUI-$SER
|
||||
option passwd ''
|
||||
option port '7547'
|
||||
option provisioning_code ''
|
||||
option amd_version '5'
|
||||
# compression possible configs: InstanceNumber, InstanceAlias
|
||||
|
||||
@@ -133,9 +133,56 @@ add_firewall_rule() {
|
||||
fi
|
||||
}
|
||||
|
||||
remove_port_protection() {
|
||||
local enabled chain rule rule_num
|
||||
|
||||
config_get enabled "${1}" "${2}"
|
||||
|
||||
if [ "${enabled}" -eq 1 ]; then
|
||||
config_get zonename "$1" name
|
||||
[ -n "$zonename" ] || return 0
|
||||
|
||||
chain='prerouting_'$zonename'_rule'
|
||||
|
||||
while rule=$(iptables -w -t nat -nL "$chain" --line-numbers | grep -m 1 -w CWMP_Port_protection); do
|
||||
rule_num=${rule%%[$' \t']*}
|
||||
iptables -w -t nat -D "$chain" "$rule_num"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
cleanup_port_protection() {
|
||||
config_load firewall
|
||||
config_foreach remove_port_protection zone masq
|
||||
}
|
||||
|
||||
install_port_protection() {
|
||||
local PORT="${3}"
|
||||
local enabled zonename chain
|
||||
|
||||
config_get enabled "${1}" "${2}"
|
||||
|
||||
if [ "${enabled}" -eq 1 ]; then
|
||||
config_get zonename "${1}" name
|
||||
[ -n "$zonename" ] || return 0
|
||||
|
||||
chain='prerouting_'$zonename'_rule'
|
||||
|
||||
iptables -w -t nat -I "$chain" -p tcp --dport "$PORT" -j ACCEPT -m comment --comment=CWMP_Port_protection
|
||||
iptables -w -t nat -I "$chain" -p udp --dport "$PORT" -j ACCEPT -m comment --comment=CWMP_Port_protection
|
||||
fi
|
||||
}
|
||||
|
||||
add_port_protection() {
|
||||
config_load firewall
|
||||
config_foreach install_port_protection zone masq "${1}"
|
||||
}
|
||||
|
||||
configure_connection_req_rules() {
|
||||
app="${1}"
|
||||
|
||||
cleanup_port_protection
|
||||
|
||||
wan="$(uci -q get cwmp.cpe.default_wan_interface)"
|
||||
wan="${wan:-wan}"
|
||||
|
||||
@@ -175,8 +222,11 @@ configure_connection_req_rules() {
|
||||
fi
|
||||
fi
|
||||
|
||||
port=$(uci -q get cwmp.cpe.port)
|
||||
port="${port:-7547}"
|
||||
port=$(uci -q -c /var/state get icwmp.cpe.port)
|
||||
if [ -z "${port}" ]; then
|
||||
log "cwmp cpe port not configured"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ipaddr=$(uci -q get cwmp.cpe.allowed_cr_ip)
|
||||
if [ -n "${ipaddr}" ]; then
|
||||
@@ -197,6 +247,8 @@ configure_connection_req_rules() {
|
||||
# Close the ACS port at Lan side
|
||||
close_downstream_acs_port "${lan}" "${port}"
|
||||
fi
|
||||
|
||||
add_port_protection "${port}"
|
||||
}
|
||||
|
||||
load_zone_names
|
||||
|
||||
@@ -5,7 +5,6 @@ uci -q batch <<-EOT
|
||||
set firewall.cwmp=include
|
||||
set firewall.cwmp.path=/etc/icwmpd/firewall.cwmp
|
||||
set firewall.cwmp.reload=1
|
||||
commit firewall
|
||||
EOT
|
||||
|
||||
exit 0
|
||||
|
||||
53
icwmp/files/etc/uci-defaults/99-cwmp-annex-f-config
Normal file
53
icwmp/files/etc/uci-defaults/99-cwmp-annex-f-config
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
validate_inform_parameter() {
|
||||
local section="${1}"
|
||||
local target_param="${2}"
|
||||
local parameter_name
|
||||
|
||||
config_get parameter_name "${section}" parameter_name
|
||||
if [ "${parameter_name}" = "${target_param}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
check_param_exists() {
|
||||
local target_param="${1}"
|
||||
local found=1
|
||||
|
||||
check_section() {
|
||||
local section="${1}"
|
||||
if validate_inform_parameter "${section}" "${target_param}"; then
|
||||
found=0
|
||||
fi
|
||||
}
|
||||
|
||||
config_foreach check_section inform_parameter
|
||||
return "${found}"
|
||||
}
|
||||
|
||||
configure_annex_f_inform_param() {
|
||||
[ -f /etc/config/gateway ] || return 0
|
||||
|
||||
config_load cwmp
|
||||
|
||||
if ! check_param_exists "Device.GatewayInfo."; then
|
||||
uci -q set cwmp.gw_info_param=inform_parameter
|
||||
uci -q set cwmp.gw_info_param.enable='1'
|
||||
uci -q set cwmp.gw_info_param.events_list='0 BOOTSTRAP,1 BOOT'
|
||||
uci -q set cwmp.gw_info_param.parameter_name='Device.GatewayInfo.'
|
||||
fi
|
||||
|
||||
if ! check_param_exists "Device.ManagementServer.ManageableDevice."; then
|
||||
uci -q set cwmp.mng_dev_param=inform_parameter
|
||||
uci -q set cwmp.mng_dev_param.enable='1'
|
||||
uci -q set cwmp.mng_dev_param.events_list='0 BOOTSTRAP,1 BOOT'
|
||||
uci -q set cwmp.mng_dev_param.parameter_name='Device.ManagementServer.ManageableDevice.'
|
||||
fi
|
||||
}
|
||||
|
||||
configure_annex_f_inform_param
|
||||
@@ -16,12 +16,12 @@ get_opt43() {
|
||||
local opt43="$1"
|
||||
local len="$2"
|
||||
|
||||
[ "$len" -gt "2" ] || return
|
||||
[ "${len}" -gt 2 ] || return
|
||||
|
||||
first_byte=${opt43:0:2}
|
||||
first_byte=$(printf "%d\n" "0x$first_byte")
|
||||
|
||||
if [ $len -ge 4 ] && [ $first_byte -ge 1 ] && [ $first_byte -le 4 ]; then
|
||||
if [ "${len}" -ge 4 ] && [ "${first_byte}" -ge 1 ] && [ "${first_byte}" -le 4 ]; then
|
||||
# it is in encapsulated form
|
||||
# opt43 encapsulated vendor-specific option has data in below format
|
||||
# Code Len Data item Code Len Data item Code
|
||||
@@ -35,7 +35,7 @@ get_opt43() {
|
||||
data="${opt43}"
|
||||
rem_len="${len}"
|
||||
# parsing of suboption of option 43
|
||||
while [ $rem_len -gt 0 ]; do
|
||||
while [ "${rem_len}" -gt 0 ]; do
|
||||
# get the suboption id
|
||||
sub_opt_id=${data:0:2}
|
||||
sub_opt_id=$(printf "%d\n" "0x$sub_opt_id")
|
||||
@@ -50,13 +50,13 @@ get_opt43() {
|
||||
|
||||
# assign the value found in sub option
|
||||
case "${sub_opt_id}" in
|
||||
"1") DHCP_ACS_URL=$(echo -n $sub_opt_val | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
"1") DHCP_ACS_URL=$(echo -n "${sub_opt_val}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
;;
|
||||
"2") DHCP_PROV_CODE=$(echo -n $sub_opt_val | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
"2") DHCP_PROV_CODE=$(echo -n "${sub_opt_val}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
;;
|
||||
"3") MIN_WAIT_INVL=$(echo -n $sub_opt_val | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
"3") MIN_WAIT_INVL=$(echo -n "${sub_opt_val}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
;;
|
||||
"4") INVL_MULTIPLIER=$(echo -n $sub_opt_val | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
"4") INVL_MULTIPLIER=$(echo -n "${sub_opt_val}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -70,13 +70,14 @@ get_opt43() {
|
||||
rem_len=$((rem_len - sub_opt_end))
|
||||
done
|
||||
else
|
||||
DHCP_ACS_URL=$(echo -n $opt43 | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
DHCP_ACS_URL=$(echo -n "${opt43}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf && echo '')
|
||||
fi
|
||||
}
|
||||
|
||||
config_load cwmp
|
||||
config_get wan_intf cpe default_wan_interface "wan"
|
||||
config_get dhcp_discovery acs dhcp_discovery "0"
|
||||
config_get_bool insecure_enable acs insecure_enable "0"
|
||||
config_get dhcp_url acs dhcp_url ""
|
||||
config_get min_wait_intvl acs dhcp_retry_min_wait_interval "0"
|
||||
config_get intvl_multi acs dhcp_retry_interval_multiplier "0"
|
||||
@@ -92,9 +93,9 @@ if [ "$discovery_enable" = "0" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "${wan_intf}" == "${INTERFACE}" ]; then
|
||||
if [ "${wan_intf}" = "${INTERFACE}" ]; then
|
||||
if [ -n "$opt43" ]; then
|
||||
len=$(printf "$opt43"|wc -c)
|
||||
len=$(echo -n "$opt43"|wc -c)
|
||||
get_opt43 "$opt43" "$len"
|
||||
fi
|
||||
|
||||
@@ -102,6 +103,17 @@ if [ "${wan_intf}" == "${INTERFACE}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "${insecure_enable}" -eq "0" ]; then
|
||||
case $DHCP_ACS_URL in
|
||||
https://*)
|
||||
log "ACS url $DHCP_ACS_URL has https"
|
||||
;;
|
||||
*)
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
sec=$(uci -q get cwmp.acs)
|
||||
|
||||
if [ -z "${sec}" ]; then
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ieee1905
|
||||
PKG_VERSION:=8.7.38
|
||||
PKG_VERSION:=8.7.44
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=0fb1f2f45543a6fcd8107bb2185da81a7f3b5114
|
||||
PKG_SOURCE_VERSION:=29ba8f04dc6bd7e77683352c0c71988f51fbadf8
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/ieee1905.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
@@ -116,7 +116,7 @@ MAKE_PATH:=src
|
||||
|
||||
|
||||
define Package/ieee1905/install
|
||||
$(CP) ./files/* $(1)/
|
||||
$(CP) ./files/etc $(1)/
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_DIR) $(1)/usr/lib/ieee1905
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
|
||||
23
ieee1905/files/datamodel_description.json
Normal file
23
ieee1905/files/datamodel_description.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"Device.IEEE1905.AL.": {
|
||||
"type": "object",
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"access": false,
|
||||
"array": false,
|
||||
"{BBF_VENDOR_PREFIX}LocalOnlyMode": {
|
||||
"type": "boolean",
|
||||
"read": true,
|
||||
"write": true,
|
||||
"protocols": [
|
||||
"cwmp",
|
||||
"usp"
|
||||
],
|
||||
"description": "Enable or disable interfaces from ieee1905.",
|
||||
"datatype": "boolean"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ PKG_INSTALL:=1
|
||||
PKG_SOURCE_PROTO=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/imonitor.git
|
||||
PKG_SOURCE_VERSION:=4beb1d5d6925507f1850a84c0b83aaf12a082f7f
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
PKG_SOURCE_SUBDIR:=${PKG_NAME}-${PKG_VERSION}
|
||||
PKG_INSTALL:=1
|
||||
|
||||
@@ -4,7 +4,7 @@ PKG_NAME:=iopsys-analytics
|
||||
PKG_RELEASE:=$(COMMITCOUNT)
|
||||
PKG_LICENSE:=PROPRIETARY
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=25e32ac5a860aec6e53e3449565b71595073e014
|
||||
PKG_SOURCE_VERSION:=5ad41ca8eb5de887487feb7148b5dce44943218c
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/iopsys-analytics.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
@@ -14,7 +14,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=ac1beae4794f99533b28db7d0e6e80f4c268a3e8
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/ipt-trigger.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ PKG_NAME:=libpicoevent-bcm
|
||||
PKG_LICENSE:=LGPL-2.1-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@@ -17,7 +17,7 @@ PKG_NAME:=libpicoevent
|
||||
PKG_LICENSE:=LGPL-2.1-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libqos
|
||||
PKG_VERSION:=7.2.109
|
||||
PKG_VERSION:=7.2.111
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libqos.git
|
||||
PKG_SOURCE_VERSION:=4948d372c3d7e43a0ba9aee517dbb83b94bba3dc
|
||||
PKG_SOURCE_VERSION:=2e4c6a9c27e0f4f68dfe7a5c930afefd8dc7119a
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
@@ -65,7 +65,7 @@ define Package/libqos
|
||||
SUBMENU:=IOPSYS HAL libs
|
||||
MENU:=1
|
||||
TITLE:= QoS library (libqos)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_brcmbca:bcm963xx-bsp
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_brcmbca:bcm963xx-bsp +TARGET_airoha:libuci
|
||||
endef
|
||||
|
||||
define Package/libqos/config
|
||||
|
||||
@@ -6,7 +6,7 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/apietila/libtrace.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.zst
|
||||
PKG_SOURCE_VERSION:=e4b4c5cce35a52da152776a00532aa0b80879c5b
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libvoice-airoha
|
||||
PKG_RELEASE:=1
|
||||
PKG_VERSION:=1.1.7
|
||||
PKG_VERSION:=1.1.8
|
||||
PKG_LICENSE:=PROPRIETARY
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
@@ -17,8 +17,8 @@ LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/$(PKG_NAME).git
|
||||
PKG_SOURCE_VERSION:=3a30086a68a3409f0396acb01380f91daabf7a2f
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_VERSION:=9763c574ec69e2aa492db4f1296d4bcd53776fba
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -25,6 +25,5 @@ db commit
|
||||
# configure the PCM for DECT/DCX81
|
||||
[ -f "/proc/device-tree/aliases/dcx81-uart" ] && {
|
||||
uci set dect.global.pcm_fsync='SHORT_LF'
|
||||
uci set dect.global.pcm_slot_start='8'
|
||||
uci set dect.global.dect_channel_start='3'
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/$(PKG_NAME).git
|
||||
PKG_SOURCE_VERSION:=baf5ebfb45404714bbfcc3068080f93265934d8a
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/$(PKG_NAME).git
|
||||
PKG_SOURCE_VERSION:=0b2bef862fb5aea0b285e339459f46779224e2d0
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -1,27 +1,32 @@
|
||||
#
|
||||
# Copyright (C) 2020-2023 Iopsys
|
||||
# Copyright (C) 2019-2024 Iopsys
|
||||
# Copyright (C) 2025 Genexis Sweden AB
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libwifi
|
||||
PKG_VERSION:=7.13.10
|
||||
PKG_VERSION:=7.22.11
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=5e8d828c01ed7ab2feba9028b603dde9708cb656
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/libwifi.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE_VERSION:=6572047d613d4dc88ed83a80fb4ae0798ab71078
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/libwifi.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_LICENSE:=LGPL-2.1-only
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
PKG_LICENSE_FILES:=
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@genexis.eu>
|
||||
|
||||
MAKE_VERBOSE := 1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
include $(INCLUDE_DIR)/cmake.mk
|
||||
|
||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
||||
TARGET_PLATFORM=BROADCOM
|
||||
@@ -42,10 +47,20 @@ else ifeq ($(CONFIG_TARGET_armvirt),y)
|
||||
else ifeq ($(CONFIG_TARGET_airoha),y)
|
||||
TARGET_PLATFORM=ECONET
|
||||
TARGET_WIFI_TYPE=MEDIATEK
|
||||
TARGET_CFLAGS +=-DIOPSYS_ECONET
|
||||
TARGET_CFLAGS +=-DIOPSYS_ECONET -I$(LINUX_DIR)/include/uapi/linux/mtk_nl80211_inc
|
||||
ifeq ($(CONFIG_TARGET_airoha_an7581),y)
|
||||
TARGET_CFLAGS +=-DCONFIG_MTK
|
||||
endif
|
||||
else ifeq ($(CONFIG_TARGET_mediatek),y)
|
||||
TARGET_PLATFORM=MEDIATEK
|
||||
TARGET_WIFI_TYPE=MAC80211
|
||||
ifeq ($(CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_cx750),y)
|
||||
TARGET_WIFI_TYPE=MEDIATEK
|
||||
TARGET_CFLAGS +=-DCONFIG_MTK -I$(LINUX_DIR)/include/uapi/linux/mtk_nl80211_inc
|
||||
else ifeq ($(CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7987a-spim-nand-an8801sb),y)
|
||||
TARGET_WIFI_TYPE=MEDIATEK
|
||||
TARGET_CFLAGS +=-DCONFIG_MTK -I$(LINUX_DIR)/include/uapi/linux/mtk_nl80211_inc
|
||||
endif
|
||||
else ifeq ($(CONFIG_TARGET_ipq95xx),y)
|
||||
TARGET_PLATFORM=IPQ95XX
|
||||
TARGET_WIFI_TYPE=QUALCOMM
|
||||
@@ -67,7 +82,7 @@ endif
|
||||
PKG_BUILD_DEPENDS:=PACKAGE_kmod-mt7915e_en7523:mt76_en7523
|
||||
|
||||
ifneq ($(CONFIG_PACKAGE_libwifi),)
|
||||
TARGET_CFLAGS +=-DHAS_WIFI
|
||||
CMAKE_OPTIONS +=-DHAS_WIFI=ON
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_LIBWIFI_USE_CTRL_IFACE),y)
|
||||
@@ -78,18 +93,8 @@ ifeq ($(CONFIG_LIBWIFI_SKIP_PROBES),y)
|
||||
TARGET_CFLAGS +=-DLIBWIFI_BRCM_SKIP_PROBES
|
||||
endif
|
||||
|
||||
TARGET_CFLAGS += \
|
||||
-I$(STAGING_DIR)/usr/include \
|
||||
-I$(STAGING_DIR)/usr/include/openssl \
|
||||
-I$(STAGING_DIR)/usr/include/libnl3
|
||||
|
||||
MAKE_FLAGS += \
|
||||
CFLAGS="$(TARGET_CFLAGS) -Wall -I./" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
FPIC="$(FPIC)" \
|
||||
PLATFORM="$(TARGET_PLATFORM)" \
|
||||
WIFI_TYPE="$(TARGET_WIFI_TYPE)" \
|
||||
subdirs="$(subdirs)"
|
||||
CMAKE_OPTIONS += -DPLATFORM=$(TARGET_PLATFORM) -DWIFI_TYPE=$(TARGET_WIFI_TYPE)
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
@@ -97,43 +102,39 @@ define Build/Prepare
|
||||
endef
|
||||
endif
|
||||
|
||||
define Package/libwifi-common
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:=libwifi
|
||||
SUBMENU:=IOPSYS HAL libs
|
||||
DEPENDS:=+libopenssl
|
||||
MENU:=1
|
||||
define Package/libwifiutils
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:= WiFi utility library (libwifiutils.so)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +libopenssl
|
||||
endef
|
||||
|
||||
define Package/libwifiutils/description
|
||||
Library provides WiFi utility functions
|
||||
endef
|
||||
|
||||
define Package/libwifi
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:= WiFi HAL library (libwifi-7.so.m)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +libwifiutils +TARGET_brcmbca:bcm963xx-bsp
|
||||
endef
|
||||
|
||||
define Package/libwifi/description
|
||||
Library provides WiFi HAL APIs and WiFi common utility functions
|
||||
endef
|
||||
|
||||
define Package/libwifiutils
|
||||
$(call Package/libwifi-common)
|
||||
TITLE:= WiFi utility library (libwifiutils.so)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy
|
||||
Library provides WiFi HAL APIs
|
||||
endef
|
||||
|
||||
define Build/InstallDev/libwifiutils
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/wifidefs.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/wifiutils.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifiutils*.so* $(1)/usr/lib/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifiutils/wifidefs.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifiutils/wifiutils.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifiutils/libwifiutils*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Package/libwifiutils/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifiutils*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
|
||||
define Package/libwifi
|
||||
$(call Package/libwifi-common)
|
||||
TITLE:= WiFi library (libwifi)
|
||||
DEPENDS+=+libnl +libnl-route +libeasy +libwifiutils +TARGET_brcmbca:bcm963xx-bsp
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifiutils/libwifiutils*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
define Package/libwifi/config
|
||||
@@ -154,13 +155,12 @@ define Package/libwifi/config
|
||||
endif
|
||||
endef
|
||||
|
||||
|
||||
define Build/InstallDev/libwifi
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/wifiops.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/wifi.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi-7*.so* $(1)/usr/lib/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifiops.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifi.h $(1)/usr/include/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifi-7*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ endef
|
||||
|
||||
define Package/libwifi/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi-7*.so* $(1)/usr/lib/
|
||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifi-7*.so* $(1)/usr/lib/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,libwifiutils))
|
||||
|
||||
@@ -12,7 +12,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/system/logmngr.git
|
||||
PKG_SOURCE_VERSION:=62441fdfe14a39bff8fff7c62307bd7b54d7240f
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -65,7 +65,9 @@ define Package/logmngr/install
|
||||
$(INSTALL_DIR) $(1)/lib/logmngr
|
||||
ifeq ($(CONFIG_LOGMNGR_BACKEND_FLUENTBIT),y)
|
||||
$(INSTALL_DIR) $(1)/sbin
|
||||
$(INSTALL_DIR) $(1)/etc/fluent-bit
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/ntp/
|
||||
$(INSTALL_BIN) ./files/etc/fluent-bit/syslog_facility.lua $(1)/etc/fluent-bit/syslog_facility.lua
|
||||
$(INSTALL_BIN) ./files/logread $(1)/sbin/
|
||||
$(INSTALL_DATA) ./files/lib/logmngr/fluent-bit.sh $(1)/lib/logmngr/
|
||||
$(INSTALL_BIN) ./files/etc/hotplug.d/ntp/20-reload_fluent_bit $(1)/etc/hotplug.d/ntp/
|
||||
|
||||
@@ -8,7 +8,7 @@ config source 'default_source'
|
||||
|
||||
config template 'default_template'
|
||||
option name 'default_template'
|
||||
option expression '{time} {hostname} {ident}[{pid}]: {message}'
|
||||
option expression '{time} {hostname} {facility}.{severity} {ident}[{pid}]: {message}'
|
||||
|
||||
config action 'default_action'
|
||||
option name 'default_action'
|
||||
|
||||
30
logmngr/files/etc/fluent-bit/syslog_facility.lua
Normal file
30
logmngr/files/etc/fluent-bit/syslog_facility.lua
Normal file
@@ -0,0 +1,30 @@
|
||||
function map_facility_severity(tag, timestamp, record)
|
||||
local priority = record["priority"] or record["pri"]
|
||||
|
||||
if not priority then
|
||||
record["facility"] = "user"
|
||||
record["severity"] = "info"
|
||||
return 2, timestamp, record
|
||||
end
|
||||
|
||||
local facility_map = {
|
||||
[0] = "kern", [1] = "user", [2] = "mail", [3] = "daemon",
|
||||
[4] = "auth", [5] = "syslog", [6] = "lpr", [7] = "news",
|
||||
[8] = "uucp", [9] = "cron", [10] = "authpriv", [11] = "ftp",
|
||||
[16] = "local0", [17] = "local1", [18] = "local2", [19] = "local3",
|
||||
[20] = "local4", [21] = "local5", [22] = "local6", [23] = "local7"
|
||||
}
|
||||
|
||||
local severity_map = {
|
||||
[0] = "emerg", [1] = "alert", [2] = "crit", [3] = "err",
|
||||
[4] = "warn", [5] = "notice", [6] = "info", [7] = "debug"
|
||||
}
|
||||
|
||||
local facility_num = math.floor(priority / 8)
|
||||
local severity_num = priority % 8
|
||||
|
||||
record["facility"] = facility_map[facility_num] or "user"
|
||||
record["severity"] = severity_map[severity_num] or "info"
|
||||
|
||||
return 2, timestamp, record
|
||||
end
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=12
|
||||
START=09
|
||||
|
||||
USE_PROCD=1
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ create_service_section() {
|
||||
append_conf " flush 1"
|
||||
append_conf " daemon off"
|
||||
append_conf " log_level info"
|
||||
append_conf " coro_stack_size 24576"
|
||||
append_conf " coro_stack_size 1048576"
|
||||
append_conf " parsers_file /etc/fluent-bit/parsers.conf"
|
||||
append_conf " hot_reload on"
|
||||
append_conf ""
|
||||
@@ -88,6 +88,12 @@ create_default_filters() {
|
||||
append_conf " match *"
|
||||
append_conf " hostname_key hostname"
|
||||
append_conf ""
|
||||
|
||||
append_conf "[FILTER]"
|
||||
append_conf " name lua"
|
||||
append_conf " match *"
|
||||
append_conf " script /etc/fluent-bit/syslog_facility.lua"
|
||||
append_conf " call map_facility_severity"
|
||||
}
|
||||
|
||||
create_input_section() {
|
||||
|
||||
@@ -13,7 +13,7 @@ PKG_SOURCE_VERSION:=d0fb770eacd6691b98df138b60f5116e02f71a9b
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/loop-detector
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
|
||||
@@ -63,8 +63,12 @@ config AGENT_CHECK_PARTIAL_WIFI_RELOAD
|
||||
bool "Option that allow SSID/PSK simple reload"
|
||||
default y
|
||||
|
||||
config DYNBHD_DYNAMICALLY_PERSIST_CONTROLLER
|
||||
bool "Let dynbhd through AP-Autoconfiguration Search and DHCP Discovery determine the controller or agent role"
|
||||
config DYNBH
|
||||
bool "Enable map-agent dynamic Ethernet backhaul management"
|
||||
default n
|
||||
|
||||
config DYNBH_DYNAMICALLY_PERSIST_CONTROLLER
|
||||
bool "Let map-agent through AP-Autoconfiguration Search and DHCP Discovery determine the controller or agent role"
|
||||
|
||||
config AGENT_UNASSOC_STA_CONT_MONITOR
|
||||
bool "Enable continuos monitoring of unassociated clients"
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=map-agent
|
||||
PKG_VERSION:=6.3.7.17
|
||||
PKG_VERSION:=6.5.0.10
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_VERSION:=7f71fafbec49fa4b25d1e8d07cfc1fee5b4bbab0
|
||||
PKG_SOURCE_VERSION:=1a9763bd4e520975e6951f77e85f369487cf1318
|
||||
PKG_MAINTAINER:=Jakob Olsson <jakob.olsson@iopsys.eu>
|
||||
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
@@ -38,14 +38,6 @@ ifeq ($(CONFIG_AGENT_USE_LIBDPP),y)
|
||||
TARGET_CFLAGS += -DUSE_LIBDPP
|
||||
endif
|
||||
|
||||
define Package/dynbhd
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=Dynamic Backhaul Daemon
|
||||
DEPENDS:=+libwifi +libuci +libubox +ubus +libeasy +libieee1905 +ieee1905 \
|
||||
+ieee1905-map-plugin +map-agent
|
||||
endef
|
||||
|
||||
ifeq ($(CONFIG_AGENT_ZEROTOUCH_DPP),y)
|
||||
TARGET_CFLAGS += -DZEROTOUCH_DPP
|
||||
endif
|
||||
@@ -54,10 +46,6 @@ define Package/map-agent/description
|
||||
This package provides EasyMesh R6 compliant Wi-Fi Multi-AP Agent.
|
||||
endef
|
||||
|
||||
define Package/dynbhd/description
|
||||
Dyanmic LAN/WAN port detection and loop avoidance.
|
||||
endef
|
||||
|
||||
define Package/map-agent/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
@@ -115,7 +103,11 @@ ifeq ($(CONFIG_AGENT_CHECK_PARTIAL_WIFI_RELOAD),y)
|
||||
TARGET_CFLAGS += -DCHECK_PARTIAL_WIFI_RELOAD
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_DYNBHD_DYNAMICALLY_PERSIST_CONTROLLER),y)
|
||||
ifeq ($(CONFIG_DYNBH),y)
|
||||
TARGET_CFLAGS += -DDYNBH
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_DYNBH_DYNAMICALLY_PERSIST_CONTROLLER),y)
|
||||
TARGET_CFLAGS += -DPERSIST_CONTROLLER
|
||||
endif
|
||||
|
||||
@@ -128,6 +120,10 @@ MAKE_PATH:=src
|
||||
define Package/map-agent/install
|
||||
$(INSTALL_DIR) $(1)/etc
|
||||
$(CP) ./files/* $(1)/
|
||||
ifeq ($(CONFIG_DYNBH),y)
|
||||
$(RM) $(1)/etc/hotplug.d/ethernet/map-dynamic-backhaul
|
||||
$(RM) $(1)/etc/hotplug.d/ethernet/map-topology-discovery
|
||||
endif
|
||||
$(INSTALL_DIR) $(1)/usr/lib
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_DIR) $(1)/lib/wifi
|
||||
@@ -135,15 +131,6 @@ define Package/map-agent/install
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mapagent $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
define Package/dynbhd/install
|
||||
$(INSTALL_DIR) $(1)/etc
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_DIR) $(1)/lib/wifi/dynbhd
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/ethernet
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/dynbh/dynbhd $(1)/usr/sbin/dynbhd
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/dynbh/api $(1)/lib/wifi/dynbhd/api
|
||||
# $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/dynbh/map-dynamic-backhaul $(1)/etc/hotplug.d/ethernet/map-dynamic-backhaul
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
@@ -152,4 +139,3 @@ endef
|
||||
endif
|
||||
|
||||
$(eval $(call BuildPackage,map-agent))
|
||||
$(eval $(call BuildPackage,dynbhd))
|
||||
|
||||
@@ -17,7 +17,7 @@ config dynamic_backhaul
|
||||
option missing_bh_reconfig_timer '1800'
|
||||
|
||||
config controller_select
|
||||
option id 'auto'
|
||||
option mode 'auto'
|
||||
option probe_int '20'
|
||||
option retry_int '9'
|
||||
option autostart '1'
|
||||
|
||||
@@ -27,11 +27,6 @@ done
|
||||
al_brnet="${al_bridge:3}"
|
||||
[ "$(uci -q get network.${al_brnet}.proto)" == "dhcp" ] || exit 0
|
||||
|
||||
############## Dynamic Backhaul Daemon ##############
|
||||
if [ -n "$(which dynbhd)" ]; then
|
||||
exit 0
|
||||
fi
|
||||
########################################################
|
||||
|
||||
################ Dedicated ETH WAN Port ################
|
||||
wanport="$(jsonfilter -i /etc/board.json -e @.network.wan.device)"
|
||||
@@ -95,7 +90,8 @@ if [ "$LINK" = "up" ]; then
|
||||
config_foreach remove_from_bridge bsta
|
||||
config_foreach update_bstas bsta down
|
||||
|
||||
/lib/wifi/multiap set_uplink "eth" "$PORT"
|
||||
hwaddr="$(ifconfig $PORT | grep -i hwaddr | awk '{print $5}' | awk '{print tolower($0)}')"
|
||||
/lib/wifi/multiap set_uplink "eth" "$PORT" "$hwaddr"
|
||||
else
|
||||
/lib/wifi/multiap unset_uplink "eth"
|
||||
#rm -f "$map_bh_file"
|
||||
|
||||
@@ -7,20 +7,6 @@ USE_PROCD=1
|
||||
|
||||
IS_CFG_VALID=1
|
||||
|
||||
MAP_DEV="map_dev"
|
||||
MAP_IF="map"
|
||||
|
||||
|
||||
start_dynbhd_service() {
|
||||
rm -f /var/run/multiap/multiap.backhaul
|
||||
procd_open_instance
|
||||
procd_set_param command "/usr/sbin/dynbhd"
|
||||
procd_set_param respawn
|
||||
# procd_set_param stdout 1
|
||||
# procd_set_param stderr 1
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
validate_agent_section() {
|
||||
uci_validate_section mapagent agent "agent" \
|
||||
'enabled:bool:true' \
|
||||
@@ -51,7 +37,7 @@ validate_cs_section() {
|
||||
|
||||
uci_validate_section mapagent $section "${section}" \
|
||||
'local:bool:false' \
|
||||
'id:string' \
|
||||
'mode:string' \
|
||||
'probe_int:range(0,1000):20' \
|
||||
'retry_int:range(0,255):3' \
|
||||
'autostart:bool:false'
|
||||
@@ -179,17 +165,6 @@ create_dir() {
|
||||
}
|
||||
|
||||
start_service() {
|
||||
if [ -f /usr/sbin/dynbhd ]; then
|
||||
# Start dynbhd only if the device is operating in extender/repeater mode
|
||||
al_bridge="$(uci -q get mapagent.agent.al_bridge)"
|
||||
if [ "${al_bridge:0:3}" = "br-" ]; then
|
||||
al_brnet="${al_bridge:3}"
|
||||
if [ "$(uci -q get network.${al_brnet}.proto)" == "dhcp" ]; then
|
||||
start_dynbhd_service
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
config_load "mapagent"
|
||||
validate_agent_config || return 1;
|
||||
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
#!/bin/sh
|
||||
. /lib/functions.sh
|
||||
|
||||
cfg=mapagent
|
||||
config_load $cfg
|
||||
|
||||
if uci -q get $cfg.agent.partial_wifi_reload >/dev/null; then
|
||||
uci -q set $cfg.agent.partial_wifi_reload='0'
|
||||
fi
|
||||
|
||||
if uci -q get $cfg.agent.chan_ch_relay_mcast >/dev/null; then
|
||||
uci -q set $cfg.agent.chan_ch_relay_mcast='0'
|
||||
fi
|
||||
|
||||
rename_dpp_uri() {
|
||||
local section="$1"
|
||||
local type device ifname band
|
||||
local ch_list=""
|
||||
|
||||
config_get type "$section" type
|
||||
config_get device "$section" device
|
||||
config_get ifname "$section" ifname
|
||||
config_get band "$section" band
|
||||
config_get chirp_interval "$section" chirp_interval
|
||||
|
||||
append_chan() {
|
||||
local val="$1"
|
||||
local chan_num="${val#*/}"
|
||||
ch_list="$ch_list $chan_num"
|
||||
}
|
||||
config_list_foreach "$section" chan append_chan
|
||||
|
||||
new_section=$(uci add "$cfg" dpp_chirp)
|
||||
[ -n "$type" ] && uci set "$cfg.$new_section.type=$type"
|
||||
[ -n "$device" ] && uci set "$cfg.$new_section.device=$device"
|
||||
[ -n "$ifname" ] && uci set "$cfg.$new_section.ifname=$ifname"
|
||||
[ -n "$band" ] && uci set "$cfg.$new_section.band=$band"
|
||||
|
||||
if [ -n "$chirp_interval" ]; then
|
||||
uci set "${cfg}.${new_section}.chirp_interval=$chirp_interval"
|
||||
fi
|
||||
|
||||
for ch in $ch_list; do
|
||||
uci add_list "$cfg.$new_section.channel=$ch"
|
||||
done
|
||||
uci delete "$cfg.$section"
|
||||
}
|
||||
|
||||
uci -q delete "$cfg.@dpp_controller[0]"
|
||||
|
||||
config_foreach rename_dpp_uri dpp_uri
|
||||
|
||||
exit 0
|
||||
15
map-agent/files/etc/uci-defaults/994-map-set-cntlr-sel-mode
Normal file
15
map-agent/files/etc/uci-defaults/994-map-set-cntlr-sel-mode
Normal file
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
adapt_cntlr_sel() {
|
||||
local section=$1
|
||||
id=$(uci -q get mapagent.@controller_select[0].id)
|
||||
|
||||
uci -q del mapagent.@controller_select[0].id
|
||||
|
||||
# re-apply any custom value
|
||||
[ -z "${id}" ] || uci -q set mapagent.@controller_select[0].mode="${id}"
|
||||
}
|
||||
|
||||
adapt_cntlr_sel
|
||||
@@ -10,6 +10,11 @@ network_mode="$(fw_printenv -n netmode)" # default is layer3
|
||||
multiap_mode="$(fw_printenv -n multiap_mode)" # default is full
|
||||
disable_mlo="$(fw_printenv -n disable_mlo)"
|
||||
|
||||
is_logan() {
|
||||
[ -d /sys/module/mt_wifi ] && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
is_airoha() {
|
||||
[ -f /proc/device-tree/compatible ] || return
|
||||
strings /proc/device-tree/compatible | grep -qE '^(econet,|airoha,)'; return
|
||||
@@ -64,45 +69,45 @@ generate_multiap_config() {
|
||||
device="$dev"
|
||||
|
||||
ifprefix_radio=""
|
||||
if is_airoha; then
|
||||
if is_logan; then
|
||||
uci set mapagent.agent.mld_ap_prefix="bss"
|
||||
uci set mapagent.agent.mld_sta_prefix="sta"
|
||||
ifname_sta=""
|
||||
case "$band" in
|
||||
2g)
|
||||
ifprefix="ra%"
|
||||
ifname="ra0"
|
||||
ifname_bh="ra1"
|
||||
ifname_sta="apcli0"
|
||||
;;
|
||||
5g)
|
||||
ifprefix="rai%"
|
||||
ifname="rai0"
|
||||
ifname_bh="rai1"
|
||||
ifname_sta="apclii0"
|
||||
;;
|
||||
6g)
|
||||
ifprefix="rax%"
|
||||
ifname="rax0"
|
||||
ifname_bh="rax1"
|
||||
ifname_sta="apclix0"
|
||||
;;
|
||||
esac
|
||||
ifprefix_radio="${ifprefix}"
|
||||
if [ "${network_mode}" == "extender" ]; then
|
||||
ifname="${ifname_sta}"
|
||||
fi
|
||||
|
||||
[ "$disable_mlo" == "1" ] || {
|
||||
uci set wireless.$dev.mlo="1"
|
||||
uci set wireless.$dev.mlo_capable="1"
|
||||
}
|
||||
elif is_airoha; then
|
||||
if [ -d "/sys/module/mt76" ]; then
|
||||
ifprefix="wlan%_%"
|
||||
ifname="wlan${devidx}_0"
|
||||
ifname_bh="wlan${devidx}_1"
|
||||
else
|
||||
uci set mapagent.agent.mld_prefix="bss"
|
||||
ifname_sta=""
|
||||
case "$band" in
|
||||
2g)
|
||||
ifprefix="ra%"
|
||||
ifname="ra0"
|
||||
ifname_bh="ra1"
|
||||
ifname_sta="apcli0"
|
||||
;;
|
||||
5g)
|
||||
ifprefix="rai%"
|
||||
ifname="rai0"
|
||||
ifname_bh="rai1"
|
||||
ifname_sta="apclii0"
|
||||
;;
|
||||
6g)
|
||||
ifprefix="rax%"
|
||||
ifname="rax0"
|
||||
ifname_bh="rax1"
|
||||
ifname_sta="apclix0"
|
||||
;;
|
||||
esac
|
||||
ifprefix_radio="${ifprefix}"
|
||||
if [ "${network_mode}" == "extender" ]; then
|
||||
ifname="${ifname_sta}"
|
||||
fi
|
||||
|
||||
[ "$disable_mlo" == "1" ] || {
|
||||
uci set wireless.$dev.mlo="1"
|
||||
uci set wireless.$dev.mlo_capable="1"
|
||||
}
|
||||
fi
|
||||
|
||||
uci set wireless.$dev.channels="$channels"
|
||||
uci commit wireless
|
||||
elif is_broadcom; then
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=map-controller
|
||||
PKG_VERSION:=6.4.4.24
|
||||
PKG_VERSION:=6.4.5.0
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_VERSION:=e149d0c26dc7a382638e7778f8cf1c01f382b76e
|
||||
PKG_SOURCE_VERSION:=f335cf5bfdf700843173fcdd5d61d1900cc0aa8a
|
||||
PKG_MAINTAINER:=Jakob Olsson <jakob.olsson@genexis.eu>
|
||||
|
||||
LOCAL_DEV=0
|
||||
|
||||
@@ -4,11 +4,10 @@ config controller 'controller'
|
||||
option registrar '2 5 6'
|
||||
option debug '2'
|
||||
option bcn_metrics_max_num '10'
|
||||
option initial_channel_scan '0'
|
||||
option enable_ts '0'
|
||||
option primary_vid '1'
|
||||
option primary_pcp '0'
|
||||
option stale_sta_timeout '30d'
|
||||
option stale_sta_timeout '20d'
|
||||
option de_collect_interval '60'
|
||||
list plugin 'zerotouch'
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@ validate_controller_section() {
|
||||
'registrar:string' \
|
||||
'debug:range(0,16)' \
|
||||
'bcn_metrics_max_num:range(1,256)' \
|
||||
'initial_channel_scan:bool:true' \
|
||||
'resend_num:uinteger:0' \
|
||||
'allow_bgdfs:range(0,2629744)' \
|
||||
'stale_sta_timeout:string' \
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
cfg=mapcontroller
|
||||
config_load $cfg
|
||||
|
||||
uci -q get $cfg.controller.debug >/dev/null 2>&1 && \
|
||||
uci set $cfg.controller.debug='2'
|
||||
|
||||
allow_bgdfs=$(uci -q get $cfg.controller.allow_bgdfs || echo "0")
|
||||
channel_plan_val=$(uci -q get $cfg.controller.channel_plan || echo "0")
|
||||
|
||||
uci -q delete $cfg.controller.allow_bgdfs
|
||||
uci -q delete $cfg.controller.channel_plan
|
||||
|
||||
uci -q get $cfg.controller.stale_sta_timeout >/dev/null 2>&1 || \
|
||||
uci set $cfg.controller.stale_sta_timeout='30d'
|
||||
|
||||
if [ -f /usr/lib/mapcontroller/zerotouch.so ]; then
|
||||
uci -q del_list $cfg.controller.plugin='zerotouch'
|
||||
uci -q add_list $cfg.controller.plugin='zerotouch'
|
||||
fi
|
||||
|
||||
if ! uci show $cfg 2>/dev/null | grep -q "=channel_plan"; then
|
||||
section=$(uci add $cfg channel_plan)
|
||||
uci set $cfg.$section.preclear_dfs="$allow_bgdfs"
|
||||
uci set $cfg.$section.acs="$channel_plan_val"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,66 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
cfg="mapcontroller"
|
||||
config_load "$cfg"
|
||||
|
||||
used_ids=""
|
||||
|
||||
collect_used_ids() {
|
||||
local section="$1"
|
||||
local id
|
||||
|
||||
id=$(uci -q get ${cfg}.${section}.id)
|
||||
if [ -n "$id" ] && printf "%s" "$id" | grep -qE '^[0-9]+$'; then
|
||||
used_ids="$used_ids $id"
|
||||
fi
|
||||
}
|
||||
|
||||
# Find first available ID from 0 to INT32_MAX
|
||||
find_first_available_id() {
|
||||
local max_int=2147483647
|
||||
local expected=0
|
||||
local id
|
||||
|
||||
# Convert list to sorted unique list
|
||||
sorted_ids=$(printf "%s\n" $used_ids | sort -n | uniq)
|
||||
|
||||
for id in $sorted_ids; do
|
||||
if [ "$id" -eq "$expected" ]; then
|
||||
expected=$((expected + 1))
|
||||
elif [ "$id" -gt "$expected" ]; then
|
||||
# Found a gap -> return the gap
|
||||
echo "$expected"
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
# If no gaps, next available is `expected`
|
||||
if [ "$expected" -le "$max_int" ]; then
|
||||
echo "$expected"
|
||||
else
|
||||
echo -1
|
||||
fi
|
||||
}
|
||||
|
||||
# Assign ID if missing
|
||||
add_qos_rule_id() {
|
||||
local section="$1"
|
||||
local id
|
||||
|
||||
id=$(uci -q get ${cfg}.${section}.id)
|
||||
if [ -z "$id" ]; then
|
||||
new_id=$(find_first_available_id)
|
||||
[ "$new_id" -ge 0 ] || return # No available ID
|
||||
uci -q set ${cfg}.${section}.id="$new_id"
|
||||
|
||||
used_ids="$used_ids $new_id"
|
||||
fi
|
||||
}
|
||||
|
||||
# Step 1: Collect all existing IDs
|
||||
config_foreach collect_used_ids qos_rule
|
||||
|
||||
# Step 2: Assign IDs to rules missing them
|
||||
config_foreach add_qos_rule_id qos_rule
|
||||
@@ -14,5 +14,3 @@ for sec in $sections; do
|
||||
|
||||
uci rename $cfg.$s=$sec
|
||||
done
|
||||
|
||||
uci commit $cfg
|
||||
|
||||
@@ -21,21 +21,9 @@ adapt_sta_steering() {
|
||||
uci -q del $cfg.@sta_steering[0].use_usta_metrics
|
||||
uci -q del $cfg.@sta_steering[0].bandsteer
|
||||
uci -q del $cfg.@sta_steering[0].diffsnr
|
||||
if [ -f /usr/lib/mapcontroller/rcpi.so ]; then
|
||||
uci -q del_list $cfg.@sta_steering[0].plugins="rcpi"
|
||||
uci -q add_list $cfg.@sta_steering[0].plugins="rcpi"
|
||||
fi
|
||||
|
||||
if [ -f /usr/lib/mapcontroller/rate.so ]; then
|
||||
uci -q del_list $cfg.@sta_steering[0].plugins="rate"
|
||||
uci -q add_list $cfg.@sta_steering[0].plugins="rate"
|
||||
fi
|
||||
|
||||
if [ -f /usr/lib/mapcontroller/bsteer.so ]; then
|
||||
uci -q del_list $cfg.@sta_steering[0].plugins="bsteer"
|
||||
uci -q add_list $cfg.@sta_steering[0].plugins="bsteer"
|
||||
fi
|
||||
|
||||
uci del_list $cfg.@sta_steering[0].plugins="rcpi"
|
||||
uci add_list $cfg.@sta_steering[0].plugins="rcpi"
|
||||
uci -q set $cfg.@sta_steering[0].plugins_enabled="1"
|
||||
uci -q set $cfg.@sta_steering[0].plugins_policy="any"
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=map-plugins
|
||||
PKG_VERSION:=1.2.6
|
||||
PKG_VERSION:=1.2.7
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
@@ -59,7 +59,8 @@ define Package/map-plugins
|
||||
endef
|
||||
|
||||
define Package/map-plugins/description
|
||||
Provides extra Multi-AP services viz. steering, channel-planning, self-organizing network etc.
|
||||
Provides extra Multi-AP services viz. steering, channel-planning,
|
||||
self-organizing network, zero-touch onboarding etc.
|
||||
endef
|
||||
|
||||
define Package/map-plugins/install
|
||||
@@ -70,5 +71,11 @@ define Build/Compile
|
||||
$(foreach p,$(plugins),$(call Build/Compile/map-plugins-$(p), $(1)))
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -r --exclude=.* ~/git/map-plugins/ $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
$(eval $(call BuildPackage,map-plugins))
|
||||
$(eval $(foreach p,$(ppkg),$(call BuildPackage,$(p))))
|
||||
|
||||
@@ -14,7 +14,7 @@ ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/hal/mcastmngr.git
|
||||
PKG_SOURCE_VERSION:=17d73b8f1947823a0d32ed589a240a2642904fe1
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=netmngr
|
||||
PKG_VERSION:=1.1.8
|
||||
PKG_VERSION:=1.2.4
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/netmngr.git
|
||||
PKG_SOURCE_VERSION:=6310f32b80f8abeccbf99ad55ce88792b19342d6
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_SOURCE_VERSION:=8240c6089cdd44f268db135920800b8fc1d65ca9
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.zst
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
# Creating Custom Netmodes in IOWRT
|
||||
|
||||
This guide provides developers with detailed instructions on how to create and manage custom network modes (netmodes) in IOWRT. The `netmode` script allows for flexible network configuration, and developers can define their own modes by structuring the necessary files and scripts within the `/etc/netmodes/` directory.
|
||||
|
||||
## Table of Contents
|
||||
1. [Overview of Netmodes](#overview-of-netmodes)
|
||||
2. [Directory Structure](#directory-structure)
|
||||
3. [Creating a Custom Netmode](#creating-a-custom-netmode)
|
||||
- [Step 1: Pre-Execution Scripts](#step-1-pre-execution-scripts)
|
||||
- [Step 2: UCI Configuration Files](#step-2-uci-configuration-files)
|
||||
- [Step 3: Custom Execution Scripts](#step-3-custom-execution-scripts)
|
||||
- [Step 4: Post-Execution Scripts](#step-4-post-execution-scripts)
|
||||
4. [Enabling and Switching Netmodes](#enabling-and-switching-netmodes)
|
||||
|
||||
## Overview of Netmodes
|
||||
|
||||
Netmodes in IOWRT provide a way to switch between different network configurations based on the needs of the environment. Developers can create custom netmodes by organizing scripts and configuration files in specific directories under `/etc/netmodes/<NETMODE_NAME>`.
|
||||
|
||||
## Directory Structure
|
||||
|
||||
A custom netmode is defined within the `/etc/netmodes/<NETMODE_NAME>` directory, which should contain the following subdirectories:
|
||||
|
||||
- **/lib/netmode/pre/**: Generic scripts executed before the netmode-specific configurations are applied.
|
||||
- **/etc/netmodes/<NETMODE_NAME>/uci/**: Contains UCI configuration files that will be copied to `/etc/config/` during the application of the netmode.
|
||||
- **/etc/netmodes/<NETMODE_NAME>/scripts/**: Custom scripts specific to the netmode that are executed after the UCI configurations are applied.
|
||||
- **/lib/netmode/post/**: Generic scripts executed after the netmode-specific configurations are completed.
|
||||
|
||||
## Creating a Custom Netmode
|
||||
|
||||
To create a new netmode, follow these steps:
|
||||
|
||||
### Step 1: Pre-Execution Scripts
|
||||
|
||||
Scripts located in `/lib/netmode/pre/` are executed before any mode-specific actions. These are typically used for preparing the system or cleaning up configurations from the previous netmode.
|
||||
|
||||
- **Create Pre-Execution Scripts**:
|
||||
- Place your generic pre-execution scripts in `/lib/netmode/pre/`.
|
||||
- Example script (`/lib/netmode/pre/cleanup.sh`):
|
||||
```bash
|
||||
#!/bin/sh
|
||||
echo "Cleaning up old network configurations..."
|
||||
# Add commands here
|
||||
```
|
||||
|
||||
### Step 2: UCI Configuration Files
|
||||
|
||||
The UCI configuration files stored in `/etc/netmodes/<NETMODE_NAME>/uci/` will be copied to `/etc/config/`, effectively applying the desired network configuration.
|
||||
|
||||
- **Place UCI Config Files**:
|
||||
- Create UCI configuration files under `/etc/netmodes/<NETMODE_NAME>/uci/`.
|
||||
- Example (`/etc/netmodes/bridge/uci/network`):
|
||||
````bash
|
||||
config device 'br_lan'
|
||||
option name 'br-lan'
|
||||
option type 'bridge'
|
||||
option multicast_to_unicast '0'
|
||||
option bridge_empty '1'
|
||||
list ports 'eth1'
|
||||
list ports 'eth3'
|
||||
list ports 'eth4'
|
||||
|
||||
config interface 'lan'
|
||||
option proto 'dhcp'
|
||||
option device 'br-lan'
|
||||
option force_link '1'
|
||||
option reqopts '43 125'
|
||||
````
|
||||
|
||||
### Step 3: Custom Execution Scripts
|
||||
|
||||
After the UCI files are applied, any scripts in `/etc/netmodes/<NETMODE_NAME>/scripts/` are executed. These can be used to perform additional configuration tasks that are specific to the netmode.
|
||||
|
||||
- **Create Custom Scripts**:
|
||||
- Add scripts to `/etc/netmodes/<NETMODE_NAME>/scripts/`.
|
||||
- Example (`/etc/netmodes/bridge/scripts/setup_bridge.sh`):
|
||||
```bash
|
||||
#!/bin/sh
|
||||
echo "Setting up bridge mode..."
|
||||
# Additional configuration commands here
|
||||
```
|
||||
|
||||
### Step 4: Post-Execution Scripts
|
||||
|
||||
Finally, the generic scripts in `/lib/netmode/post/` are executed. These scripts typically finalize the setup or perform any necessary cleanups.
|
||||
|
||||
- **Create Post-Execution Scripts**:
|
||||
- Place scripts in `/lib/netmode/post/`.
|
||||
- Example script (`/lib/netmode/post/restart_services.sh`):
|
||||
```bash
|
||||
#!/bin/sh
|
||||
echo "Restarting network services..."
|
||||
# Add commands here
|
||||
```
|
||||
|
||||
## Enabling and Switching Netmodes
|
||||
|
||||
The netmode mechanism can be enabled or disabled via the UCI configuration, and you can switch between netmodes using UCI commands.
|
||||
|
||||
- **Enable Netmode**:
|
||||
```bash
|
||||
uci set netmode.global.enabled=1
|
||||
uci commit netmode
|
||||
```
|
||||
|
||||
- **Switch Netmode**:
|
||||
```bash
|
||||
uci set netmode.global.mode='<NETMODE_NAME>'
|
||||
uci commit netmode
|
||||
```
|
||||
901
netmode/docs/ADVANCED_MODE_GUIDE.md
Normal file
901
netmode/docs/ADVANCED_MODE_GUIDE.md
Normal file
@@ -0,0 +1,901 @@
|
||||
# Advanced Mode - Complete Configuration Guide
|
||||
|
||||
## Table of Contents
|
||||
1. [Overview](#overview)
|
||||
2. [Interface Types](#interface-types)
|
||||
3. [Configuration Examples](#configuration-examples)
|
||||
4. [Use Case Scenarios](#use-case-scenarios)
|
||||
5. [TR-069/USP Configuration](#tr-069usp-configuration)
|
||||
6. [Troubleshooting](#troubleshooting)
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
The **advanced** mode is a unified, flexible network configuration mode for OpenWrt/iopsys routers. It provides a single, powerful interface for configuring:
|
||||
|
||||
- **Bridge interfaces** with VLAN/QinQ support (traditional VLAN devices)
|
||||
- **Bridge VLAN filtering** (modern kernel bridge features - recommended)
|
||||
- **Routed interfaces** with VLAN/MACVLAN support
|
||||
- **Standalone interfaces** (direct VLAN without bridge)
|
||||
- **Mixed scenarios** (combine bridges and routed interfaces)
|
||||
|
||||
### Key Features
|
||||
|
||||
- ✅ Unified configuration syntax
|
||||
- ✅ Multiple interface types in one configuration
|
||||
- ✅ VLAN (802.1Q) and QinQ (802.1ad) support
|
||||
- ✅ Modern bridge VLAN filtering for better performance
|
||||
- ✅ MACVLAN support for multi-service routing
|
||||
- ✅ Per-interface port assignment
|
||||
- ✅ Flexible protocol configuration (DHCP, none, static)
|
||||
- ✅ UCI device name resolution (LAN1 → eth1)
|
||||
- ✅ Automatic reconfiguration on parameter changes
|
||||
|
||||
### Configuration Parameters
|
||||
|
||||
| Parameter | Description | Example |
|
||||
|-----------|-------------|---------|
|
||||
| `interface_names` | Comma-separated interface names | `wan,iptv,mgmt` |
|
||||
| `interface_types` | Comma-separated interface types | `bridge:transparent,brvlan:wan-tagged:1499,route:vlan:100,direct:200` |
|
||||
| `ports` | Comma-separated port assignments | `ALL,LAN1-LAN2-WAN,WAN` |
|
||||
| `macaddrs` | Comma-separated MAC addresses (optional) | `BaseMACAddress,BaseMACAddressP1,AA:BB:CC:DD:EE:FF` |
|
||||
|
||||
### How It Works
|
||||
|
||||
When you change any configuration parameter and restart netmode:
|
||||
1. The system detects the configuration change automatically
|
||||
2. Old network configuration is cleaned up (interfaces, bridges, VLANs)
|
||||
3. System configuration is preserved (loopback, physical devices)
|
||||
4. New configuration is applied based on your parameters
|
||||
5. No manual intervention needed!
|
||||
|
||||
---
|
||||
|
||||
## Interface Types
|
||||
|
||||
### Bridge Types (Traditional VLAN Devices)
|
||||
|
||||
Bridge types create L2 bridge interfaces using traditional VLAN devices (eth0.100, etc.).
|
||||
|
||||
| Type | Syntax | Description |
|
||||
|------|--------|-------------|
|
||||
| **Transparent** | `bridge:transparent` | No VLAN tagging on any port |
|
||||
| **Tagged** | `bridge:tagged:VID` | All ports tagged with same VLAN ID |
|
||||
| **WAN-Tagged** | `bridge:wan-tagged:VID` | Only WAN port tagged, LAN ports untagged |
|
||||
| **Transparent QinQ** | `bridge:transparent-qinq:SVID` | LAN untagged, WAN single S-tag (802.1ad) |
|
||||
| **Transparent QinQ (Double)** | `bridge:transparent-qinq:CVID:SVID` | LAN untagged, WAN double-tagged (C+S) |
|
||||
| **Tagged QinQ** | `bridge:tagged-qinq:CVID:SVID` | LAN C-tagged, WAN double-tagged (C+S) |
|
||||
| **QinQ (All ports)** | `bridge:qinq:CVID:SVID` | All ports double-tagged |
|
||||
|
||||
### Bridge VLAN Filtering Types (Modern Approach)
|
||||
|
||||
Bridge VLAN filtering uses kernel bridge VLAN filtering instead of creating VLAN devices. **Recommended for new deployments.**
|
||||
|
||||
| Type | Syntax | Description |
|
||||
|------|--------|-------------|
|
||||
| **Tagged** | `brvlan:tagged:VID` | All ports tagged with VLAN ID (uses bridge-vlan) |
|
||||
| **WAN-Tagged** | `brvlan:wan-tagged:VID` | WAN tagged, LAN untagged (uses bridge-vlan) |
|
||||
| **Mixed** | `brvlan:mixed:VID` | Custom tagged/untagged configuration |
|
||||
|
||||
**See [BRIDGE_VLAN_FILTERING.md](BRIDGE_VLAN_FILTERING.md) for detailed documentation.**
|
||||
|
||||
### Routed Types
|
||||
|
||||
Routed types create L3 routed interfaces (with NAT/firewall).
|
||||
|
||||
| Type | Syntax | Description |
|
||||
|------|--------|-------------|
|
||||
| **VLAN Routing** | `route:vlan:VID` | Routed interface on VLAN |
|
||||
| **MACVLAN Routing** | `route:macvlan:MAC` | MACVLAN device with custom MAC (supports macros) |
|
||||
| **VLAN + MAC Routing** | `route:vlan:VID:MAC` | Routed interface on VLAN with custom MAC |
|
||||
| **Transparent Routing** | `route:transparent` | Routed interface on base device (no VLAN) |
|
||||
|
||||
### Standalone Types
|
||||
|
||||
Standalone types create VLAN interfaces without bridges or routing (proto=none by default).
|
||||
|
||||
| Type | Syntax | Description |
|
||||
|------|--------|-------------|
|
||||
| **Direct VLAN** | `direct:VID` | Standalone VLAN interface, proto=none |
|
||||
|
||||
### Device Reference Types
|
||||
|
||||
Device reference types allow multiple interfaces to share the same underlying device.
|
||||
|
||||
| Type | Syntax | Description |
|
||||
|------|--------|-------------|
|
||||
| **Device Reference** | `device-ref:INTERFACE` | References the device from another interface |
|
||||
|
||||
**Use Case**: Create separate IPv4 and IPv6 interfaces (wan and wan6) that share the same bridge or VLAN device.
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# wan creates bridge on VLAN 2501 with DHCP
|
||||
# wan6 shares the same br-wan device with DHCPv6
|
||||
interface_names='wan,wan6'
|
||||
interface_types='bridge:tagged:2501,device-ref:wan-dhcpv6'
|
||||
ports='WAN,WAN'
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- `wan`: Creates `br-wan` bridge device on VLAN 2501, proto=dhcp
|
||||
- `wan6`: Uses same `br-wan` device, proto=dhcpv6
|
||||
|
||||
**Note**: The referenced interface must be defined before the device-ref interface in the interface_names list.
|
||||
|
||||
### Modifiers
|
||||
|
||||
Modifiers can be appended to any interface type:
|
||||
|
||||
| Modifier | Effect | Example |
|
||||
|----------|--------|---------|
|
||||
| `-pppoe` | Set proto=pppoe (PPPoE authentication) | `route:vlan:101-pppoe` |
|
||||
| `-dhcpv6` | Set proto=dhcpv6 (DHCPv6 client) | `bridge:tagged:2501-dhcpv6` |
|
||||
| `-dhcp` | Set proto=dhcp (DHCP client - explicit) | `bridge:transparent-dhcp` |
|
||||
| `-static` | Set proto=static (static IP) | `bridge:transparent-static` |
|
||||
| `-none`, `-n` | Set proto=none (no IP configuration) | `bridge:tagged:100-none` or `bridge:tagged:100-n` |
|
||||
| `-iptv` | Signify that this is an iptv interface (affects firewall and mcast) | `route:vlan:200-iptv` |
|
||||
| `-inet` | Signify that this is an internet interface (affects firewall) | `route:vlan:200-inet` |
|
||||
| `-mgmt` | Signify that this is a management interface (affects firewall) | `route:vlan:200-mgmt` |
|
||||
| `-disabled`, `-d` | Create but mark as disabled | `route:vlan:200-disabled` or `route:vlan:200-d` |
|
||||
|
||||
|
||||
#### Notes
|
||||
|
||||
- The `-none` and `-n` modifiers are equivalent, as are `-disabled` and `-d`.
|
||||
- If no protocol modifier is specified, interfaces default to `proto=dhcp`.
|
||||
- Protocols and disabled can be clubbed together, and disabled should be in the last, for example: `transparent-qinq:2-n-d` will set proto as none and disable the interface, similarly other protocols can be used.
|
||||
- iptv, inet and mgmt modifier can only be used with route interfaces, and they can be clubbed with disabled modifier, but disable should be in the last.
|
||||
|
||||
#### Static IP Auto-Configuration
|
||||
|
||||
When using the `-static` modifier with an interface named `lan`, the system automatically configures:
|
||||
|
||||
**Network Configuration**:
|
||||
- IP Address: 192.168.1.1
|
||||
- Netmask: 255.255.255.0
|
||||
- IPv6 Prefix: /60
|
||||
|
||||
**DHCP Server Configuration**:
|
||||
- Start: 192.168.1.100
|
||||
- Limit: 150 addresses (100-250)
|
||||
- Lease time: 1 hour
|
||||
- DHCPv4: server
|
||||
- DHCPv6: server
|
||||
- Router Advertisement: server
|
||||
- SLAAC: enabled
|
||||
- RA flags: managed-config, other-config
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
interface_names='lan,wan'
|
||||
interface_types='bridge:transparent-static,bridge:tagged:2501'
|
||||
ports='ALL_LAN,WAN'
|
||||
```
|
||||
|
||||
For non-LAN interfaces with `-static`, only `proto=static` is set without additional configuration.
|
||||
|
||||
**Note**: Direct interfaces default to `proto=none`, so `-n` is implicit.
|
||||
|
||||
### MAC Address Assignment
|
||||
|
||||
You can assign custom MAC addresses to interfaces using the `macaddrs` parameter. This is useful when ISPs require specific MAC addresses per service or for multi-service configurations.
|
||||
|
||||
**Supported Formats:**
|
||||
|
||||
| Format | Description | Example |
|
||||
|--------|-------------|---------|
|
||||
| **Explicit MAC** | Direct MAC address assignment | `AA:BB:CC:DD:EE:FF` |
|
||||
| **BaseMACAddress** | Use base MAC from `fw_printenv -n ethaddr` | `BaseMACAddress` |
|
||||
| **BaseMACAddressP1** | Base MAC + 1 | `BaseMACAddressP1` |
|
||||
| **BaseMACAddressPN** | Base MAC + N (any number) | `BaseMACAddressP5` |
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
# If base MAC is 94:3F:0C:D5:76:00
|
||||
uci set netmode.@supported_args[3].value='BaseMACAddress,BaseMACAddressP1,AA:BB:CC:DD:EE:FF'
|
||||
# Results in:
|
||||
# Interface 1: 94:3F:0C:D5:76:00
|
||||
# Interface 2: 94:3F:0C:D5:76:01
|
||||
# Interface 3: AA:BB:CC:DD:EE:FF
|
||||
```
|
||||
|
||||
**Note**: MAC addresses are assigned to interfaces in order. If you have 3 interfaces but only specify 2 MAC addresses, the 3rd interface will use the system default.
|
||||
|
||||
---
|
||||
|
||||
## Configuration Examples
|
||||
|
||||
### Example 1: Simple Transparent Bridge
|
||||
|
||||
**Scenario**: All ports bridged together, no VLANs
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan' # interface_names
|
||||
uci set netmode.@supported_args[13].value='bridge:transparent' # interface_types
|
||||
uci set netmode.@supported_args[14].value='ALL' # ports
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**: Creates `br-wan` bridge with all LAN+WAN ports, proto=dhcp
|
||||
|
||||
---
|
||||
|
||||
### Example 2: LAN-Only Bridge with Routed WAN
|
||||
|
||||
**Scenario**: Bridge all LAN ports together, WAN as separate routed interface
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='lan,wan'
|
||||
uci set netmode.@supported_args[13].value='bridge:transparent,route:transparent'
|
||||
uci set netmode.@supported_args[14].value='ALL_LAN,WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**: Creates `br-lan` bridge with all LAN ports only, WAN routed separately
|
||||
|
||||
---
|
||||
|
||||
### Example 3: VLAN-Tagged Bridge (Managed Network)
|
||||
|
||||
**Scenario**: All ports tagged with VLAN 100
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='mgmt'
|
||||
uci set netmode.@supported_args[13].value='bridge:tagged:100'
|
||||
uci set netmode.@supported_args[14].value='ALL'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**: Creates `br-mgmt` with all ports tagged as `.100`
|
||||
|
||||
---
|
||||
|
||||
### Example 4: Multiple Service Bridges (VLAN Segregation)
|
||||
|
||||
**Scenario**: Separate bridges for Internet (VLAN 100), IPTV (VLAN 200), Management (VLAN 300)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='inet,iptv,mgmt'
|
||||
uci set netmode.@supported_args[13].value='bridge:tagged:100-n,bridge:tagged:200-n,bridge:tagged:300'
|
||||
uci set netmode.@supported_args[14].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN,WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- `br-inet`: LAN1.100 + LAN2.100 + WAN.100, proto=none
|
||||
- `br-iptv`: LAN3.200 + LAN4.200 + WAN.200, proto=none
|
||||
- `br-mgmt`: WAN.300, proto=dhcp
|
||||
|
||||
---
|
||||
|
||||
### Example 5: QinQ Configuration (Wholesale Provider)
|
||||
|
||||
**Scenario**: Customer A on C-tag 10 S-tag 100, Customer B on C-tag 20 S-tag 100
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='customer_a,customer_b'
|
||||
uci set netmode.@supported_args[13].value='bridge:qinq:10:100-n,bridge:qinq:20:100-n'
|
||||
uci set netmode.@supported_args[14].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- `br-customer_a`: All ports double-tagged (100.10)
|
||||
- `br-customer_b`: All ports double-tagged (100.20)
|
||||
|
||||
---
|
||||
|
||||
### Example 6: Routed Multi-Service with Custom MAC Addresses
|
||||
|
||||
**Scenario**: ISP requires different MAC addresses for Internet and IPTV services
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='mgmt_wan,wan,iptv_wan,lan'
|
||||
uci set netmode.@supported_args[13].value='route:macvlan:BaseMACAddressP2-mgmt,route:macvlan:BaseMACAddressP3-inet,route:macvlan:BaseMACAddressP4-iptv,bridge:transparent-static'
|
||||
uci set netmode.@supported_args[14].value='WAN,WAN,WAN,ALL_LAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- `mgmt_wan`: Routed interface on WAN with base MAC + 2(58:00:32:C0:0E:42)
|
||||
- `wan`: Routed interface on WAN with base MAC + 3 (58:00:32:C0:0E:43)
|
||||
- `iptv_wan`: Routed interface on WAN with base MAC + 4 (58:00:32:C0:0E:44)
|
||||
- `lan`: bridged interface on ALL LAN ports with base MAC (58:00:32:C0:0E:40)
|
||||
|
||||
---
|
||||
|
||||
### Example 7: Routed Multi-Service (VLAN-based)
|
||||
|
||||
**Scenario**: Internet on VLAN 100, IPTV on VLAN 200, Management on VLAN 300, all routed
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='mgmt_wan,wan,iptv_wan,lan'
|
||||
uci set netmode.@supported_args[13].value='route:vlan:300-mgmt,route:vlan:100-inet,route:vlan:200-iptv,bridge:transparent-static'
|
||||
uci set netmode.@supported_args[14].value='WAN,WAN,WAN,ALL_LAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- `wan`: Routed on WAN.100, proto=dhcp
|
||||
- `iptv`: Routed on WAN.200, proto=dhcp
|
||||
- `mgmt`: Routed on WAN.300, proto=dhcp
|
||||
|
||||
---
|
||||
|
||||
### Example 8: Routed Multi-Service (MACVLAN with Macros)
|
||||
|
||||
**Scenario**: Internet and IPTV using MACVLAN devices with MAC address macros
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan,iptv'
|
||||
uci set netmode.@supported_args[13].value='route:transparent,route:macvlan:BaseMACAddressP1'
|
||||
uci set netmode.@supported_args[14].value='WAN,WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- `wan`: Routed on WAN with default MAC (94:3F:0C:D5:76:00)
|
||||
- `iptv`: MACVLAN device on WAN with base MAC + 1 (94:3F:0C:D5:76:01)
|
||||
|
||||
**Alternative with explicit MAC:**
|
||||
```bash
|
||||
uci set netmode.@supported_args[13].value='route:transparent,route:macvlan:AA:BB:CC:DD:EE:FF'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Example 9: Routed Multi-Service (VLAN + MACVLAN)
|
||||
|
||||
**Scenario**: Internet on VLAN 100, IPTV on VLAN 200 with custom MAC
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan,iptv'
|
||||
uci set netmode.@supported_args[13].value='route:vlan:100,route:vlan:200:AA:BB:CC:DD:EE:FF'
|
||||
uci set netmode.@supported_args[14].value='WAN,WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- `wan`: Routed on WAN.100 (default MAC), proto=dhcp
|
||||
- `iptv`: Routed on WAN.200 with custom MAC, proto=dhcp
|
||||
|
||||
---
|
||||
|
||||
### Example 10: Standalone VLAN Interface (Direct)
|
||||
|
||||
**Scenario**: WAN as standalone VLAN 2501 interface (no bridge, no routing)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan'
|
||||
uci set netmode.@supported_args[13].value='direct:2501'
|
||||
uci set netmode.@supported_args[14].value='WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**: Creates WAN.2501 interface, proto=none (no DHCP)
|
||||
|
||||
---
|
||||
|
||||
### Example 11: Mixed Bridge and Routed Interfaces
|
||||
|
||||
**Scenario**: IPTV bridged on VLAN 200, Internet routed on VLAN 100
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan,iptv'
|
||||
uci set netmode.@supported_args[13].value='route:vlan:100,bridge:tagged:200-n'
|
||||
uci set netmode.@supported_args[14].value='WAN,LAN1-LAN2-WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- `wan`: Routed on WAN.100, proto=dhcp (firewall enabled)
|
||||
- `br-iptv`: Bridge on LAN1.200 + LAN2.200 + WAN.200, proto=none
|
||||
|
||||
---
|
||||
|
||||
## Use Case Scenarios
|
||||
|
||||
### Scenario 1: ISP Triple-Play Service (Routed)
|
||||
|
||||
**Requirement**: Internet on VLAN 100, IPTV on VLAN 200, VoIP on VLAN 300, all routed
|
||||
|
||||
**Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan,iptv,voip'
|
||||
uci set netmode.@supported_args[13].value='route:vlan:100,route:vlan:200,route:vlan:300'
|
||||
uci set netmode.@supported_args[14].value='WAN,WAN,WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
WAN (ae_wan)
|
||||
├── wan (VLAN 100) - Internet - Routed
|
||||
├── iptv (VLAN 200) - IPTV - Routed
|
||||
└── voip (VLAN 300) - VoIP - Routed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Scenario 2: ISP Triple-Play with MACVLAN
|
||||
|
||||
**Requirement**: Internet normal MAC, IPTV with custom MAC, VoIP with custom MAC
|
||||
|
||||
**Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan,iptv,voip'
|
||||
uci set netmode.@supported_args[13].value='route:transparent,route:macvlan:AA:BB:CC:DD:EE:01,route:macvlan:AA:BB:CC:DD:EE:02'
|
||||
uci set netmode.@supported_args[14].value='WAN,WAN,WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Scenario 3: Enterprise VLAN Segregation (Bridged)
|
||||
|
||||
**Requirement**: Guest WiFi on VLAN 100, Corporate on VLAN 200, Management on VLAN 300, all bridged
|
||||
|
||||
**Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='guest,corporate,mgmt'
|
||||
uci set netmode.@supported_args[13].value='bridge:tagged:100-n,bridge:tagged:200-n,bridge:tagged:300'
|
||||
uci set netmode.@supported_args[14].value='LAN1-WAN,LAN2-LAN3-WAN,WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
LAN1.100 ──┬── WAN.100 ──[ br-guest ] (proto=none)
|
||||
LAN2.200 ──┬── WAN.200 ──[ br-corporate ] (proto=none)
|
||||
LAN3.200 ──┘
|
||||
WAN.300 ────[ br-mgmt ] (proto=dhcp)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Scenario 4: Wholesale QinQ Provider
|
||||
|
||||
**Requirement**: Multiple customers on single fiber, S-tag 100, different C-tags
|
||||
|
||||
**Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='cust_a,cust_b,cust_c'
|
||||
uci set netmode.@supported_args[13].value='bridge:qinq:10:100-n,bridge:qinq:20:100-n,bridge:qinq:30:100-n'
|
||||
uci set netmode.@supported_args[14].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN,LAN5-LAN6-WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Scenario 5: Hybrid Bridge + Routed
|
||||
|
||||
**Requirement**: Internet routed, IPTV bridged to STBs
|
||||
|
||||
**Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan,iptv'
|
||||
uci set netmode.@supported_args[13].value='route:vlan:100,bridge:tagged:200-n'
|
||||
uci set netmode.@supported_args[14].value='WAN,LAN1-LAN2-LAN3-WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
WAN.100 ─── [ wan - routed ] (NAT, firewall enabled)
|
||||
|
||||
LAN1.200 ──┐
|
||||
LAN2.200 ──┼─ WAN.200 ──[ br-iptv ] (transparent bridge, proto=none)
|
||||
LAN3.200 ──┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Port List Specifications
|
||||
|
||||
### Port List Syntax
|
||||
|
||||
- **`ALL`**: All LAN ports + WAN port + EXT port (resolved from UCI or board.json)
|
||||
- **`ALL_LAN`**: All LAN ports only (no WAN, no EXT) - useful for LAN-only bridges
|
||||
- **`LAN`**: Single LAN port (for devices with one LAN port)
|
||||
- **`WAN`**: Only WAN port
|
||||
- **`EXT`**: Only EXT port
|
||||
- **`LAN-WAN`**: Single LAN port and WAN
|
||||
- **`LAN1-LAN2-WAN`**: LAN1, LAN2, and WAN
|
||||
- **`LAN1-LAN3-EXT`**: LAN1, LAN3, and EXT
|
||||
- **`WAN-EXT`**: WAN and EXT ports
|
||||
|
||||
**Note**: For devices with a single LAN port, use `LAN`. For devices with multiple LAN ports, use `LAN1-8`. The `ALL` and `ALL_LAN` macros automatically detect which configuration is present.
|
||||
|
||||
#### Individual untagged port
|
||||
|
||||
- Suppose we have a bridge:tagged type interface, so all the ports are going to be tagged in this case. To mark any of the ports untagged individually, ":u" modifier can be used with the port, for example, to make LAN3 untagged (transparent) here: "LAN2-LAN3:u-LAN4-WAN".
|
||||
|
||||
### Device Name Resolution
|
||||
|
||||
Port macros (LAN, LAN1-LAN8, WAN, EXT) are automatically resolved to actual device names:
|
||||
- `LAN` → `uci get network.LAN.name` → e.g., `eth1` (single LAN port devices)
|
||||
- `LAN1` → `uci get network.LAN1.name` → e.g., `eth1` (multi-port devices)
|
||||
- `WAN` → `uci get network.WAN.name` → e.g., `ae_wan`
|
||||
- `EXT` → `uci get network.EXT.name` → e.g., `eth5`
|
||||
|
||||
If UCI device section doesn't exist, the system falls back to board.json.
|
||||
|
||||
---
|
||||
|
||||
## TR-069/USP Configuration
|
||||
|
||||
### TR-181 Data Model Mapping
|
||||
|
||||
The advanced mode uses three arguments in TR-181:
|
||||
|
||||
1. **SupportedArguments.1** = `interface_names`
|
||||
2. **SupportedArguments.2** = `interface_types`
|
||||
3. **SupportedArguments.3** = `ports`
|
||||
|
||||
### Example 1: Transparent Bridge via TR-069
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>wan</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>bridge:transparent</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>ALL</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
### Example 2: Routed Multi-Service via TR-069
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>wan,iptv,mgmt</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>route:vlan:100,route:vlan:200,route:vlan:300</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>WAN,WAN,WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
### Example 3: QinQ Bridge via TR-069
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>customer_a,customer_b</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>bridge:qinq:10:100-n,bridge:qinq:20:100-n</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>LAN1-LAN2-WAN,LAN3-LAN4-WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Issue: VLANs Not Working
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check VLAN devices created
|
||||
uci show network | grep 8021q
|
||||
|
||||
# Check interface status
|
||||
ip link show
|
||||
ip addr show
|
||||
|
||||
# Verify VLAN traffic
|
||||
tcpdump -i eth4 -e -n vlan
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Ensure kernel module loaded
|
||||
modprobe 8021q
|
||||
lsmod | grep 8021
|
||||
|
||||
# Check switch configuration (if applicable)
|
||||
swconfig dev switch0 show
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: QinQ Not Working
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check for 8021ad devices
|
||||
uci show network | grep 8021ad
|
||||
|
||||
# Verify kernel support
|
||||
modprobe 8021q
|
||||
lsmod | grep 8021
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Install QinQ support
|
||||
opkg install kmod-8021q
|
||||
|
||||
# Verify S-tag ethertype (0x88a8)
|
||||
tcpdump -i eth4 -e -n -xx vlan
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: MACVLAN Interface Not Getting IP
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check MACVLAN device
|
||||
ip link show | grep macvlan
|
||||
|
||||
# Check MAC address
|
||||
ip link show <interface>_macvlan | grep ether
|
||||
|
||||
# Test DHCP
|
||||
udhcpc -i <interface>_macvlan -n
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Verify passthru mode
|
||||
uci show network | grep -A5 macvlan
|
||||
|
||||
# Ensure MAC is unique
|
||||
# Some ISPs require specific MAC format
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: Mixed Bridge/Route Not Working
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check firewall status
|
||||
uci show firewall.globals.enabled
|
||||
|
||||
# Verify interfaces
|
||||
ip addr show
|
||||
|
||||
# Check routing table
|
||||
ip route show
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
Firewall is always enabled. For debugging:
|
||||
```bash
|
||||
# Temporarily disable firewall
|
||||
uci set firewall.globals.enabled='0'
|
||||
uci commit firewall
|
||||
/etc/init.d/firewall restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: Port Not Added to Bridge
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check UCI device resolution
|
||||
uci get network.LAN1.name
|
||||
|
||||
# Check bridge ports
|
||||
brctl show
|
||||
|
||||
# Check UCI bridge configuration
|
||||
uci show network | grep -A10 "type='bridge'"
|
||||
```
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Verify device sections exist
|
||||
uci show network | grep "device="
|
||||
|
||||
# Check board.json for defaults
|
||||
cat /etc/board.json | grep -A20 network
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verification Commands
|
||||
|
||||
### Check Configuration
|
||||
|
||||
```bash
|
||||
# View current mode
|
||||
cat /etc/netmodes/.last_mode
|
||||
|
||||
# View netmode configuration
|
||||
uci show netmode
|
||||
|
||||
# View network configuration
|
||||
uci show network
|
||||
|
||||
# View environment variables (during mode switch)
|
||||
logread | grep "Interface names:"
|
||||
```
|
||||
|
||||
### Check Interface Status
|
||||
|
||||
```bash
|
||||
# All interfaces
|
||||
ip addr show
|
||||
|
||||
# Bridges
|
||||
brctl show
|
||||
bridge link show
|
||||
|
||||
# VLAN devices
|
||||
ip -d link show type vlan
|
||||
|
||||
# MACVLAN devices
|
||||
ip -d link show type macvlan
|
||||
```
|
||||
|
||||
### Check Connectivity
|
||||
|
||||
```bash
|
||||
# DHCP on interface
|
||||
udhcpc -i wan -n
|
||||
|
||||
# Ping gateway
|
||||
ping -c 3 $(ip route | grep default | awk '{print $3}')
|
||||
|
||||
# DNS resolution
|
||||
nslookup google.com
|
||||
|
||||
# VLAN traffic capture
|
||||
tcpdump -i eth4 -e -n vlan
|
||||
```
|
||||
|
||||
### Check Logs
|
||||
|
||||
```bash
|
||||
# Netmode logs
|
||||
logread | grep netmode-advanced
|
||||
|
||||
# Network logs
|
||||
logread | grep network
|
||||
|
||||
# Live monitoring
|
||||
logread -f | grep -E "(netmode|network)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Migration from Old Modes
|
||||
|
||||
### From `bridged` Mode
|
||||
|
||||
**Old Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='bridged'
|
||||
uci set netmode.@supported_args[0].value='wan'
|
||||
uci set netmode.@supported_args[1].value='transparent'
|
||||
uci set netmode.@supported_args[2].value='ALL'
|
||||
```
|
||||
|
||||
**New Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan'
|
||||
uci set netmode.@supported_args[13].value='bridge:transparent'
|
||||
uci set netmode.@supported_args[14].value='ALL'
|
||||
```
|
||||
|
||||
**Change**: Add `bridge:` prefix to interface type.
|
||||
|
||||
---
|
||||
|
||||
### From `routed-multi-service` Mode
|
||||
|
||||
**Old Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='routed-multi-service'
|
||||
uci set netmode.@supported_args[0].value='100' # inet_vlanid
|
||||
uci set netmode.@supported_args[2].value='200' # iptv_vlanid
|
||||
uci set netmode.@supported_args[4].value='300' # mgmt_vlanid
|
||||
```
|
||||
|
||||
**New Configuration**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[12].value='wan,iptv,mgmt'
|
||||
uci set netmode.@supported_args[13].value='route:vlan:100,route:vlan:200,route:vlan:300'
|
||||
uci set netmode.@supported_args[14].value='WAN,WAN,WAN'
|
||||
```
|
||||
|
||||
**Change**: Explicit interface names and unified syntax.
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **VLAN Planning**: Document all VLAN IDs before deployment
|
||||
2. **Port Assignment**: Create clear mapping of ports to services
|
||||
3. **Testing**: Test on lab environment before production
|
||||
4. **Monitoring**: Use `tcpdump` to verify VLAN tags
|
||||
5. **Firewall**: Be aware that routed interfaces enable firewall
|
||||
6. **Naming**: Use descriptive interface names (iptv, mgmt, voip)
|
||||
7. **Documentation**: Keep ISP-specific requirements documented
|
||||
8. **Backup**: Always backup configuration before major changes
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Package Version**: 1.1.11+
|
||||
**Last Updated**: 2024-12-12
|
||||
**Mode Status**: Production Ready
|
||||
567
netmode/docs/ADVANCED_MODE_IMPLEMENTATION.md
Normal file
567
netmode/docs/ADVANCED_MODE_IMPLEMENTATION.md
Normal file
@@ -0,0 +1,567 @@
|
||||
# Advanced Mode - Implementation Summary
|
||||
|
||||
## Overview
|
||||
|
||||
The **advanced** mode is a unified network configuration mode that consolidates and extends the functionality of the previous `bridged` and `routed-multi-service` modes into a single, flexible interface.
|
||||
|
||||
## Design Rationale
|
||||
|
||||
### Problems with Old Approach
|
||||
|
||||
1. **Mode Fragmentation**: Separate modes for bridged and routed scenarios
|
||||
2. **Limited Flexibility**: Couldn't mix bridges and routed interfaces
|
||||
3. **Confusing Naming**: "bridged" mode actually supported standalone interfaces too
|
||||
4. **Parameter Proliferation**: routed-multi-service had 6+ parameters for just 3 services
|
||||
5. **No Scalability**: Adding new services required new parameters
|
||||
|
||||
### New Unified Approach
|
||||
|
||||
The advanced mode uses a **declarative, array-based configuration**:
|
||||
|
||||
```
|
||||
interface_names: wan, iptv, mgmt
|
||||
interface_types: route:vlan:100, bridge:tagged:200, direct:300
|
||||
ports: WAN, LAN1-LAN2-WAN, WAN
|
||||
```
|
||||
|
||||
**Benefits**:
|
||||
- ✅ Single mode for all scenarios
|
||||
- ✅ Scalable (add N interfaces without new parameters)
|
||||
- ✅ Flexible (mix bridge/route/standalone)
|
||||
- ✅ Intuitive syntax
|
||||
- ✅ Self-documenting configuration
|
||||
|
||||
## Architecture
|
||||
|
||||
### File Structure
|
||||
|
||||
```
|
||||
netmode/
|
||||
├── files/
|
||||
│ ├── etc/netmodes/advanced/
|
||||
│ │ └── scripts/
|
||||
│ │ └── 10-advanced # Main mode script
|
||||
│ ├── lib/netmode/
|
||||
│ │ └── advanced_helper.sh # Helper library
|
||||
│ └── etc/netmodes/supported_modes.json
|
||||
└── docs/
|
||||
├── ADVANCED_MODE_GUIDE.md # Complete guide
|
||||
└── ADVANCED_MODE_QUICK_REFERENCE.md
|
||||
```
|
||||
|
||||
### Components
|
||||
|
||||
#### 1. advanced_helper.sh
|
||||
|
||||
**Purpose**: Core library for interface creation
|
||||
|
||||
**Key Functions**:
|
||||
- `parse_interface_type()` - Parse interface type specifications
|
||||
- `create_bridge()` - Create bridge interfaces with VLAN/QinQ
|
||||
- `create_routed_interface()` - Create routed interfaces with VLAN/MACVLAN
|
||||
- `create_standalone_interface()` - Create direct VLAN interfaces
|
||||
- `parse_port_list()` - Resolve port macros to device names
|
||||
- `resolve_device_name()` - Resolve LAN1/WAN to actual device names
|
||||
- `cleanup_interfaces()` - Clean up all interfaces before applying new config
|
||||
|
||||
#### 2. 10-advanced Script
|
||||
|
||||
**Purpose**: Main mode script
|
||||
|
||||
**Flow**:
|
||||
1. Parse environment variables (NETMODE_*)
|
||||
2. Split comma-separated values
|
||||
3. Loop through each interface
|
||||
4. Parse interface type
|
||||
5. Call appropriate creation function (bridge/route/direct)
|
||||
6. Configure multicast, DHCP, firewall
|
||||
7. Update service dependencies
|
||||
|
||||
#### 3. supported_modes.json
|
||||
|
||||
**Purpose**: Mode definition for UCI import
|
||||
|
||||
**Configuration**:
|
||||
```json
|
||||
{
|
||||
"name": "advanced",
|
||||
"description": "Advanced Mode - Unified configuration...",
|
||||
"supported_args": [
|
||||
{
|
||||
"name": "interface_names",
|
||||
"description": "Interface names (comma-separated...)",
|
||||
"type": "string"
|
||||
},
|
||||
...
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Interface Type Syntax
|
||||
|
||||
### Design Philosophy
|
||||
|
||||
**Format**: `MODE:SUBTYPE[:PARAMS][:MODIFIERS]`
|
||||
|
||||
Examples:
|
||||
- `bridge:transparent` - Mode=bridge, Subtype=transparent
|
||||
- `bridge:tagged:100` - Mode=bridge, Subtype=tagged, Param=VID
|
||||
- `route:vlan:100:AA:BB:CC:DD:EE:FF` - Mode=route, Subtype=vlan, Params=VID+MAC
|
||||
- `direct:2501-n` - Mode=direct, Param=VID, Modifier=proto_none
|
||||
|
||||
### Parsing Logic
|
||||
|
||||
The `parse_interface_type()` function:
|
||||
|
||||
1. **Extract modifiers** (-n, -d)
|
||||
2. **Parse mode prefix** (bridge:/route:/direct:)
|
||||
3. **Parse subtype** (transparent/tagged/vlan/macvlan)
|
||||
4. **Parse parameters** (VID, SVID, MAC address)
|
||||
5. **Export to environment variables** for caller
|
||||
|
||||
## UCI Device Resolution
|
||||
|
||||
### Problem
|
||||
|
||||
Port macros (LAN1, LAN2, WAN) are logical names that need to be mapped to actual hardware interfaces.
|
||||
|
||||
### Solution
|
||||
|
||||
```bash
|
||||
resolve_device_name() {
|
||||
local device_id="$1"
|
||||
local resolved_name=""
|
||||
|
||||
# Try UCI device section
|
||||
resolved_name="$(uci -q get network.${device_id}.name)"
|
||||
|
||||
# Fallback to input
|
||||
if [ -z "$resolved_name" ]; then
|
||||
resolved_name="$device_id"
|
||||
fi
|
||||
|
||||
echo "$resolved_name"
|
||||
}
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```
|
||||
LAN1 → uci get network.LAN1.name → eth1
|
||||
WAN → uci get network.WAN.name → ae_wan
|
||||
```
|
||||
|
||||
### Port List Resolution
|
||||
|
||||
The `parse_port_list()` function:
|
||||
|
||||
1. **Check for "ALL"** → Resolve all LAN1-8 + WAN
|
||||
2. **Parse dash-separated** → LAN1-LAN2-WAN → resolve each
|
||||
3. **Return space-separated** → "eth1 eth2 ae_wan"
|
||||
|
||||
## VLAN Device Creation
|
||||
|
||||
### 802.1Q (C-tag)
|
||||
|
||||
```bash
|
||||
create_vlan_device "eth0" "100" "8021q"
|
||||
```
|
||||
|
||||
Creates:
|
||||
```
|
||||
config device 'eth0__100'
|
||||
option type '8021q'
|
||||
option enabled '1'
|
||||
option vid '100'
|
||||
option ifname 'eth0'
|
||||
option name 'eth0.100'
|
||||
```
|
||||
|
||||
### 802.1ad (S-tag)
|
||||
|
||||
```bash
|
||||
create_vlan_device "eth0" "300" "8021ad"
|
||||
```
|
||||
|
||||
Creates:
|
||||
```
|
||||
config device 'eth0__300'
|
||||
option type '8021ad'
|
||||
option enabled '1'
|
||||
option vid '300'
|
||||
option ifname 'eth0'
|
||||
option name 'eth0.300'
|
||||
```
|
||||
|
||||
### QinQ (Double Tagging)
|
||||
|
||||
For `bridge:qinq:100:300`:
|
||||
|
||||
```bash
|
||||
# Create S-tag first
|
||||
svlan=$(create_vlan_device "eth0" "300" "8021ad") # eth0.300
|
||||
|
||||
# Create C-tag on top of S-tag
|
||||
cvlan=$(create_vlan_device "$svlan" "100" "8021q") # eth0.300.100
|
||||
```
|
||||
|
||||
Result: `eth0.300.100` (S-tag 300, C-tag 100)
|
||||
|
||||
## MACVLAN Device Creation
|
||||
|
||||
For `route:macvlan:AA:BB:CC:DD:EE:FF`:
|
||||
|
||||
```bash
|
||||
create_macvlan_device "ae_wan" "AA:BB:CC:DD:EE:FF" "iptv"
|
||||
```
|
||||
|
||||
Creates:
|
||||
```
|
||||
config device 'iptv_macvlan'
|
||||
option type 'macvlan'
|
||||
option enabled '1'
|
||||
option ifname 'ae_wan'
|
||||
option name 'iptv_macvlan'
|
||||
option macaddr 'AA:BB:CC:DD:EE:FF'
|
||||
option mode 'passthru'
|
||||
```
|
||||
|
||||
## Bridge Creation
|
||||
|
||||
### Transparent Bridge
|
||||
|
||||
For `bridge:transparent` with `ports='ALL'`:
|
||||
|
||||
```bash
|
||||
create_bridge "wan" "bridge:transparent" "ALL"
|
||||
```
|
||||
|
||||
Creates:
|
||||
```
|
||||
config interface 'wan'
|
||||
option proto 'dhcp'
|
||||
option device 'br-wan'
|
||||
|
||||
config device 'br_wan'
|
||||
option name 'br-wan'
|
||||
option type 'bridge'
|
||||
option bridge_empty '1'
|
||||
list ports 'eth1'
|
||||
list ports 'eth2'
|
||||
list ports 'ae_wan'
|
||||
```
|
||||
|
||||
### VLAN-Tagged Bridge
|
||||
|
||||
For `bridge:tagged:100` with `ports='ALL'`:
|
||||
|
||||
Creates VLAN devices on all ports first, then adds to bridge:
|
||||
```
|
||||
config device 'br_mgmt'
|
||||
option name 'br-mgmt'
|
||||
option type 'bridge'
|
||||
list ports 'eth1.100'
|
||||
list ports 'eth2.100'
|
||||
list ports 'ae_wan.100'
|
||||
```
|
||||
|
||||
## Routed Interface Creation
|
||||
|
||||
For `route:vlan:100`:
|
||||
|
||||
```bash
|
||||
create_routed_interface "wan" "vlan" "100" "" "dhcp" "ae_wan" "0"
|
||||
```
|
||||
|
||||
Creates:
|
||||
```
|
||||
config device 'ae_wan__100'
|
||||
option type '8021q'
|
||||
option vid '100'
|
||||
option ifname 'ae_wan'
|
||||
option name 'ae_wan.100'
|
||||
|
||||
config interface 'wan'
|
||||
option proto 'dhcp'
|
||||
option device 'ae_wan.100'
|
||||
```
|
||||
|
||||
## Firewall Logic
|
||||
|
||||
The advanced mode has **intelligent firewall handling**:
|
||||
|
||||
```bash
|
||||
configure_firewall() {
|
||||
local has_routed=0
|
||||
|
||||
# Check if ANY interface is routed
|
||||
for if_type in $interface_types; do
|
||||
if echo "$if_type" | grep -q "^route:"; then
|
||||
has_routed=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$has_routed" = "1" ]; then
|
||||
uci set firewall.globals.enabled="1" # Enable for routed
|
||||
else
|
||||
uci set firewall.globals.enabled="0" # Disable for bridge-only
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
**Logic**:
|
||||
- If **any** interface is routed → Enable firewall
|
||||
- If **all** interfaces are bridges → Disable firewall
|
||||
|
||||
## Environment Variable Flow
|
||||
|
||||
### Input (UCI → Environment)
|
||||
|
||||
```bash
|
||||
# In netmode init script
|
||||
export NETMODE_interface_names="wan,iptv,mgmt"
|
||||
export NETMODE_interface_types="route:vlan:100,route:vlan:200,route:vlan:300"
|
||||
export NETMODE_ports="WAN,WAN,WAN"
|
||||
```
|
||||
|
||||
### Parsing (Script)
|
||||
|
||||
```bash
|
||||
# In 10-advanced script
|
||||
local interface_names="${NETMODE_interface_names:-wan}"
|
||||
local interface_types="${NETMODE_interface_types:-bridge:transparent}"
|
||||
local ports="${NETMODE_ports:-ALL}"
|
||||
|
||||
# Split by comma
|
||||
IFS=','
|
||||
for name in $interface_names; do
|
||||
names_arr="$names_arr $name"
|
||||
done
|
||||
```
|
||||
|
||||
### Output (UCI Network Config)
|
||||
|
||||
```
|
||||
config interface 'wan'
|
||||
option proto 'dhcp'
|
||||
option device 'ae_wan.100'
|
||||
|
||||
config interface 'iptv'
|
||||
option proto 'dhcp'
|
||||
option device 'ae_wan.200'
|
||||
...
|
||||
```
|
||||
|
||||
## Cleanup Strategy
|
||||
|
||||
Before applying new configuration, all existing interfaces are cleaned up:
|
||||
|
||||
```bash
|
||||
cleanup_interfaces() {
|
||||
# Delete VLAN devices (8021q and 8021ad)
|
||||
for vlandev_sec in $(uci show network | grep -E "\.type='(8021q|8021ad)'" ...); do
|
||||
uci delete "$vlandev_sec"
|
||||
done
|
||||
|
||||
# Delete MACVLAN devices
|
||||
for macvlandev_sec in $(uci show network | grep "\.type='macvlan'" ...); do
|
||||
uci delete "$macvlandev_sec"
|
||||
done
|
||||
|
||||
# Delete bridge devices
|
||||
for brdev_sec in $(uci show network | grep "\.type='bridge'" ...); do
|
||||
uci delete "$brdev_sec"
|
||||
done
|
||||
|
||||
# Delete standard interfaces
|
||||
uci delete network.lan
|
||||
uci delete network.wan
|
||||
uci delete network.wan6
|
||||
}
|
||||
```
|
||||
|
||||
This ensures a clean slate for the new configuration.
|
||||
|
||||
## Migration Path
|
||||
|
||||
### From bridged Mode
|
||||
|
||||
**Before**:
|
||||
```bash
|
||||
mode='bridged'
|
||||
interface_names='wan,lan100'
|
||||
interface_types='transparent,tagged:100'
|
||||
ports='ALL,LAN1-LAN2'
|
||||
```
|
||||
|
||||
**After**:
|
||||
```bash
|
||||
mode='advanced'
|
||||
interface_names='wan,lan100'
|
||||
interface_types='bridge:transparent,bridge:tagged:100'
|
||||
ports='ALL,LAN1-LAN2'
|
||||
```
|
||||
|
||||
**Change**: Add `bridge:` prefix to types.
|
||||
|
||||
### From routed-multi-service Mode
|
||||
|
||||
**Before**:
|
||||
```bash
|
||||
mode='routed-multi-service'
|
||||
inet_vlanid='100'
|
||||
iptv_vlanid='200'
|
||||
mgmt_vlanid='300'
|
||||
```
|
||||
|
||||
**After**:
|
||||
```bash
|
||||
mode='advanced'
|
||||
interface_names='wan,iptv,mgmt'
|
||||
interface_types='route:vlan:100,route:vlan:200,route:vlan:300'
|
||||
ports='WAN,WAN,WAN'
|
||||
```
|
||||
|
||||
**Change**: Explicit interface names and unified syntax.
|
||||
|
||||
## Testing Approach
|
||||
|
||||
### Unit Testing
|
||||
|
||||
Test individual helper functions:
|
||||
|
||||
```bash
|
||||
# Test device resolution
|
||||
resolve_device_name "LAN1" # Should return eth1
|
||||
|
||||
# Test port parsing
|
||||
parse_port_list "LAN1-LAN2-WAN" # Should return "eth1 eth2 ae_wan"
|
||||
|
||||
# Test type parsing
|
||||
parse_interface_type "bridge:qinq:100:300-n"
|
||||
# Should set: mode=bridge, vlan_type=qinq, cvid=100, svid=300, proto=none
|
||||
```
|
||||
|
||||
### Integration Testing
|
||||
|
||||
Test complete scenarios:
|
||||
|
||||
```bash
|
||||
# Test transparent bridge
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='wan'
|
||||
uci set netmode.@supported_args[1].value='bridge:transparent'
|
||||
uci set netmode.@supported_args[2].value='ALL'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
|
||||
# Verify
|
||||
brctl show | grep br-wan
|
||||
```
|
||||
|
||||
### Validation
|
||||
|
||||
```bash
|
||||
# Check UCI output
|
||||
uci show network
|
||||
|
||||
# Check actual interfaces
|
||||
ip addr show
|
||||
brctl show
|
||||
ip -d link show type vlan
|
||||
|
||||
# Check logs
|
||||
logread | grep netmode-advanced
|
||||
```
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
### Comma Splitting Optimization
|
||||
|
||||
The script uses efficient IFS-based splitting:
|
||||
|
||||
```bash
|
||||
local OLD_IFS="$IFS"
|
||||
IFS=','
|
||||
for name in $interface_names; do
|
||||
names_arr="$names_arr $name"
|
||||
done
|
||||
IFS="$OLD_IFS"
|
||||
```
|
||||
|
||||
This is faster than using `cut` or `awk` in loops.
|
||||
|
||||
### UCI Batching
|
||||
|
||||
All UCI commands are batched, with a single `uci commit` at the end:
|
||||
|
||||
```bash
|
||||
# Multiple uci set commands
|
||||
uci set ...
|
||||
uci set ...
|
||||
uci set ...
|
||||
|
||||
# Single commit
|
||||
uci commit network
|
||||
```
|
||||
|
||||
### Logging
|
||||
|
||||
Logging is selective - info level for major steps, debug for details:
|
||||
|
||||
```bash
|
||||
_log "Creating interface $idx/$total_interfaces" # Info
|
||||
logger -s -p user.debug -t "$_log_prefix" "Adding port: $port" # Debug
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Input Validation
|
||||
|
||||
- VLANs IDs: 1-4094
|
||||
- MAC addresses: Validated format
|
||||
- Port names: Resolved through UCI (trusted source)
|
||||
|
||||
### Privilege Separation
|
||||
|
||||
- Script runs as root (required for network config)
|
||||
- No user input directly executed
|
||||
- Environment variables sanitized through UCI
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
Possible future additions:
|
||||
|
||||
1. **Static IP support**: `route:vlan:100:static:192.168.1.1`
|
||||
2. **Port roles**: `ports='LAN1(tagged),LAN2(untagged)'`
|
||||
3. **Bridge STP**: `bridge:transparent:stp`
|
||||
4. **IPv6 specific**: `route:vlan:100:ipv6`
|
||||
5. **Validation**: Pre-flight checks for VLAN conflicts
|
||||
|
||||
## Backward Compatibility
|
||||
|
||||
**Status**: ⚠️ Breaking change by design
|
||||
|
||||
The old `bridged` and `routed-multi-service` modes are **replaced** by advanced mode. This is acceptable because:
|
||||
|
||||
1. This is the **first deployment** of advanced features
|
||||
2. No existing production deployments use old syntax
|
||||
3. Cleaner architecture without legacy baggage
|
||||
4. Documentation focuses on new syntax only
|
||||
|
||||
## Summary
|
||||
|
||||
The advanced mode represents a significant architectural improvement:
|
||||
|
||||
- ✅ **Unified**: One mode for all scenarios
|
||||
- ✅ **Scalable**: Array-based configuration
|
||||
- ✅ **Flexible**: Mix bridges, routed, standalone
|
||||
- ✅ **Intuitive**: Self-documenting syntax
|
||||
- ✅ **Powerful**: VLAN, QinQ, MACVLAN support
|
||||
- ✅ **Clean**: No backward compatibility burden
|
||||
|
||||
---
|
||||
|
||||
**Implementation Version**: 1.0
|
||||
**Date**: 2024-12-12
|
||||
**Status**: Production Ready
|
||||
313
netmode/docs/ADVANCED_MODE_QUICK_REFERENCE.md
Normal file
313
netmode/docs/ADVANCED_MODE_QUICK_REFERENCE.md
Normal file
@@ -0,0 +1,313 @@
|
||||
# Advanced Mode - Quick Reference
|
||||
|
||||
## Interface Type Syntax
|
||||
|
||||
### Bridge Types (Traditional VLAN Devices)
|
||||
```
|
||||
bridge:transparent # No VLANs
|
||||
bridge:tagged:VID # All ports tagged
|
||||
bridge:wan-tagged:VID # Only WAN tagged
|
||||
bridge:transparent-qinq:SVID # LAN untagged, WAN S-tag
|
||||
bridge:transparent-qinq:C:S # LAN untagged, WAN C+S tags
|
||||
bridge:tagged-qinq:C:S # LAN C-tag, WAN C+S tags
|
||||
bridge:qinq:C:S # All ports C+S tags
|
||||
```
|
||||
|
||||
### Bridge VLAN Filtering (Modern - Recommended)
|
||||
```
|
||||
brvlan:tagged:VID # All ports tagged (bridge-vlan)
|
||||
brvlan:wan-tagged:VID # WAN tagged, LAN untagged (bridge-vlan)
|
||||
brvlan:mixed:VID # Custom tagging (bridge-vlan)
|
||||
```
|
||||
|
||||
### Routed Types
|
||||
```
|
||||
route:transparent # No VLAN, default MAC
|
||||
route:vlan:VID # VLAN routing
|
||||
route:macvlan:MAC # MACVLAN device (supports BaseMACAddress macros)
|
||||
route:vlan:VID:MAC # VLAN + custom MAC
|
||||
```
|
||||
|
||||
### Standalone Types
|
||||
```
|
||||
direct:VID # Standalone VLAN (proto=none)
|
||||
```
|
||||
|
||||
### Device Reference Types
|
||||
```
|
||||
device-ref:INTERFACE # Reference device from another interface
|
||||
# Allows multiple interfaces to share the same device
|
||||
# Example: wan6 sharing wan's device
|
||||
```
|
||||
|
||||
### Modifiers
|
||||
```
|
||||
-pppoe # proto=pppoe (PPPoE authentication)
|
||||
-dhcpv6 # proto=dhcpv6 (DHCPv6 client)
|
||||
-dhcp # proto=dhcp (DHCP client - explicit, default if no suffix)
|
||||
-static # proto=static (static IP configuration)
|
||||
-none, -n # proto=none (no IP configuration)
|
||||
-disabled, -d # disabled=1 (interface disabled)
|
||||
```
|
||||
|
||||
**Default Protocol**: If no protocol modifier is specified, the interface defaults to `-dhcp`.
|
||||
|
||||
**Note**: When using `-static` with interface name `lan`, the system automatically configures:
|
||||
- IP: 192.168.1.1/24
|
||||
- IPv6 prefix delegation: /60
|
||||
- DHCP server: 192.168.1.100-250, 1h lease
|
||||
- DHCPv6 and RA server enabled
|
||||
|
||||
### MAC Address Macros
|
||||
```
|
||||
BaseMACAddress # Base MAC from fw_printenv -n ethaddr
|
||||
BaseMACAddressP1 # Base MAC + 1
|
||||
BaseMACAddressP2 # Base MAC + 2
|
||||
BaseMACAddressPN # Base MAC + N
|
||||
AA:BB:CC:DD:EE:FF # Explicit MAC address
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Configurations
|
||||
|
||||
### 1. Transparent Bridge
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='wan'
|
||||
uci set netmode.@supported_args[1].value='bridge:transparent'
|
||||
uci set netmode.@supported_args[2].value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 2. Router Mode (LAN + WAN)
|
||||
```bash
|
||||
# LAN bridge with static IP + DHCP server, WAN bridge with DHCP client
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='lan,wan'
|
||||
uci set netmode.@supported_args[1].value='bridge:transparent-static,bridge:tagged:2501'
|
||||
uci set netmode.@supported_args[2].value='ALL_LAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 3. VLAN-Tagged Bridge
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='mgmt'
|
||||
uci set netmode.@supported_args[1].value='bridge:tagged:100'
|
||||
uci set netmode.@supported_args[2].value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 4. Multiple Service Bridges
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='inet,iptv,mgmt'
|
||||
uci set netmode.@supported_args[1].value='bridge:tagged:100-n,bridge:tagged:200-n,bridge:tagged:300'
|
||||
uci set netmode.@supported_args[2].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 5. QinQ Configuration
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='customer_a,customer_b'
|
||||
uci set netmode.@supported_args[1].value='bridge:qinq:10:100-n,bridge:qinq:20:100-n'
|
||||
uci set netmode.@supported_args[2].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 6. Routed Multi-Service (VLAN)
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='wan,iptv,mgmt'
|
||||
uci set netmode.@supported_args[1].value='route:vlan:100,route:vlan:200,route:vlan:300'
|
||||
uci set netmode.@supported_args[2].value='WAN,WAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 7. Routed Multi-Service with Custom MAC Addresses
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='wan,iptv'
|
||||
uci set netmode.@supported_args[1].value='route:transparent,route:transparent'
|
||||
uci set netmode.@supported_args[2].value='WAN,WAN'
|
||||
uci set netmode.@supported_args[3].value='BaseMACAddress,BaseMACAddressP1'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 8. IPv4 + IPv6 on Same Device (Device Reference)
|
||||
```bash
|
||||
# wan uses DHCP, wan6 uses DHCPv6 on the same bridge device
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='wan,wan6'
|
||||
uci set netmode.@supported_args[1].value='bridge:tagged:2501,device-ref:wan-dhcpv6'
|
||||
uci set netmode.@supported_args[2].value='WAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 9. Direct VLAN Interface
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='wan'
|
||||
uci set netmode.@supported_args[1].value='direct:2501'
|
||||
uci set netmode.@supported_args[2].value='WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 10. Hybrid (Routed + Bridged)
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan,iptv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='route:vlan:100,bridge:tagged:200-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='WAN,LAN1-LAN2-LAN3-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 11. Bridge VLAN Filtering (WAN Tagged)
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### 12. Multiple Services with Bridge VLAN Filtering
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet,tv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499,brvlan:wan-tagged:1510-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Port List Syntax
|
||||
|
||||
| Syntax | Description |
|
||||
|--------|-------------|
|
||||
| `ALL` | All LAN + WAN + EXT ports (from UCI/board.json) |
|
||||
| `ALL_LAN` | All LAN ports only (no WAN, no EXT) |
|
||||
| `LAN` | Single LAN port (for devices with one LAN port) |
|
||||
| `WAN` | WAN port only |
|
||||
| `EXT` | EXT port only |
|
||||
| `LAN-WAN` | Single LAN port and WAN |
|
||||
| `LAN1-LAN2-WAN` | LAN1, LAN2, and WAN |
|
||||
| `LAN1-LAN3-EXT` | LAN1, LAN3, and EXT |
|
||||
| `WAN-EXT` | WAN and EXT ports |
|
||||
|
||||
**Note**: `LAN` is used for devices with a single LAN port, while `LAN1-8` are used for devices with multiple numbered LAN ports. The system automatically detects which is present in UCI.
|
||||
|
||||
---
|
||||
|
||||
## Verification Commands
|
||||
|
||||
```bash
|
||||
# Check current mode
|
||||
cat /etc/netmodes/.last_mode
|
||||
|
||||
# View configuration
|
||||
uci show netmode
|
||||
|
||||
# View network interfaces
|
||||
ip addr show
|
||||
|
||||
# View bridges
|
||||
brctl show
|
||||
|
||||
# View VLAN devices
|
||||
ip -d link show type vlan
|
||||
|
||||
# View MACVLAN devices
|
||||
ip -d link show type macvlan
|
||||
|
||||
# View logs
|
||||
logread | grep netmode-advanced
|
||||
|
||||
# Test DHCP
|
||||
udhcpc -i wan -n
|
||||
|
||||
# Capture VLAN traffic
|
||||
tcpdump -i eth4 -e -n vlan
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Force mode reapply
|
||||
```bash
|
||||
rm /etc/netmodes/.last_mode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### Check for errors
|
||||
```bash
|
||||
logread | grep -E "(error|ERROR|failed|FAILED)"
|
||||
```
|
||||
|
||||
### Verify UCI syntax
|
||||
```bash
|
||||
uci show netmode
|
||||
uci show network
|
||||
```
|
||||
|
||||
### Reset to DHCP mode
|
||||
```bash
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## TR-181 Argument Mapping
|
||||
|
||||
```
|
||||
Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value = interface_names
|
||||
Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value = interface_types
|
||||
Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value = ports
|
||||
Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.4.Value = macaddrs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Examples by Use Case
|
||||
|
||||
### ISP Triple-Play (VLAN-based with MAC Addresses)
|
||||
```bash
|
||||
# Internet VLAN 100, IPTV VLAN 200, VoIP VLAN 300 with different MACs
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='wan,iptv,voip'
|
||||
uci set netmode.@supported_args[1].value='route:vlan:100,route:vlan:200,route:vlan:300'
|
||||
uci set netmode.@supported_args[2].value='WAN,WAN,WAN'
|
||||
uci set netmode.@supported_args[3].value='BaseMACAddress,BaseMACAddressP1,BaseMACAddressP2'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### Enterprise Guest + Corporate Networks
|
||||
```bash
|
||||
# Guest VLAN 100, Corporate VLAN 200, Management VLAN 300
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='guest,corporate,mgmt'
|
||||
uci set netmode.@supported_args[1].value='bridge:tagged:100-n,bridge:tagged:200-n,bridge:tagged:300'
|
||||
uci set netmode.@supported_args[2].value='LAN1-WAN,LAN2-LAN3-WAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### Wholesale QinQ Provider
|
||||
```bash
|
||||
# Multiple customers with different C-tags, same S-tag
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='cust_a,cust_b,cust_c'
|
||||
uci set netmode.@supported_args[1].value='bridge:qinq:10:100-n,bridge:qinq:20:100-n,bridge:qinq:30:100-n'
|
||||
uci set netmode.@supported_args[2].value='LAN1-LAN2-WAN,LAN3-LAN4-WAN,LAN5-LAN6-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Version**: 1.0
|
||||
**Last Updated**: 2024-12-12
|
||||
333
netmode/docs/BRIDGE_VLAN_FILTERING.md
Normal file
333
netmode/docs/BRIDGE_VLAN_FILTERING.md
Normal file
@@ -0,0 +1,333 @@
|
||||
# Bridge VLAN Filtering Mode
|
||||
|
||||
## Overview
|
||||
|
||||
The advanced netmode now supports **bridge VLAN filtering**, a modern approach to VLAN configuration that uses the kernel's bridge VLAN filtering feature instead of creating separate VLAN devices.
|
||||
|
||||
### Benefits
|
||||
|
||||
- **Better Performance**: No need to create multiple VLAN devices
|
||||
- **Cleaner Configuration**: Single bridge with VLAN filtering instead of multiple VLAN interfaces
|
||||
- **Hardware Offloading**: Better support for hardware VLAN acceleration
|
||||
- **Simplified Management**: All VLANs configured in one place
|
||||
|
||||
## Syntax
|
||||
|
||||
Use the `brvlan:` prefix instead of `bridge:` to enable bridge VLAN filtering:
|
||||
|
||||
| Traditional Mode | Bridge VLAN Filtering Mode |
|
||||
|------------------|---------------------------|
|
||||
| `bridge:tagged:100` | `brvlan:tagged:100` |
|
||||
| `bridge:wan-tagged:100` | `brvlan:wan-tagged:100` |
|
||||
| N/A | `brvlan:mixed:100` |
|
||||
|
||||
## Interface Types
|
||||
|
||||
### `brvlan:tagged:VID`
|
||||
|
||||
All ports are tagged with the specified VLAN ID.
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:tagged:1499'
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Resulting Configuration**:
|
||||
```
|
||||
config interface 'internet'
|
||||
option device 'br-internet.1499'
|
||||
option proto 'dhcp'
|
||||
|
||||
config device br_internet
|
||||
option name 'br-internet'
|
||||
option type 'bridge'
|
||||
option vlan_filtering '1'
|
||||
list ports 'ae_wan'
|
||||
list ports 'eth0'
|
||||
list ports 'eth1'
|
||||
|
||||
config bridge-vlan brvlan_1499_internet
|
||||
option device 'br-internet'
|
||||
option vlan '1499'
|
||||
list ports 'ae_wan:t'
|
||||
list ports 'eth0:t'
|
||||
list ports 'eth1:t'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `brvlan:wan-tagged:VID`
|
||||
|
||||
WAN port is tagged, LAN ports are untagged.
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='iptv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1510-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Resulting Configuration**:
|
||||
```
|
||||
config interface 'iptv'
|
||||
option device 'br-iptv.1510'
|
||||
option proto 'none'
|
||||
|
||||
config device br_iptv
|
||||
option name 'br-iptv'
|
||||
option type 'bridge'
|
||||
option vlan_filtering '1'
|
||||
list ports 'ae_wan'
|
||||
list ports 'eth0'
|
||||
list ports 'eth1'
|
||||
|
||||
config bridge-vlan brvlan_1510_iptv
|
||||
option device 'br-iptv'
|
||||
option vlan '1510'
|
||||
list ports 'ae_wan:t'
|
||||
list ports 'eth0:u'
|
||||
list ports 'eth1:u'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `brvlan:mixed:VID` or `brvlan:mixed:VID:TAGGED_PORTS`
|
||||
|
||||
Custom tagged/untagged configuration with flexible port-specific tagging.
|
||||
|
||||
**Syntax**:
|
||||
- `brvlan:mixed:VID` - Default behavior: WAN tagged, LAN untagged
|
||||
- `brvlan:mixed:VID:TAGGED_PORTS` - Specify which ports are tagged (e.g., `LAN1-WAN`)
|
||||
|
||||
**Example 1: Default (WAN Tagged)**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='service'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:100'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Result**: WAN tagged, LAN1 and LAN2 untagged
|
||||
|
||||
**Example 2: Custom Tagging (LAN1 and WAN Tagged)**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='corporate'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:200:LAN1-WAN'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Resulting Configuration**:
|
||||
```
|
||||
config bridge-vlan brvlan_200_corporate
|
||||
option device 'br-corporate'
|
||||
option vlan '200'
|
||||
list ports 'eth0:t' # LAN1 tagged
|
||||
list ports 'eth1:u' # LAN2 untagged
|
||||
list ports 'eth2:u' # LAN3 untagged
|
||||
list ports 'ae_wan:t' # WAN tagged
|
||||
```
|
||||
|
||||
**See [BRVLAN_MIXED_MODE_EXAMPLES.md](BRVLAN_MIXED_MODE_EXAMPLES.md) for comprehensive examples.**
|
||||
|
||||
---
|
||||
|
||||
## Comparison: Traditional vs Bridge VLAN Filtering
|
||||
|
||||
### Traditional VLAN Device Approach (`bridge:tagged:100`)
|
||||
|
||||
Creates separate VLAN devices for each port:
|
||||
|
||||
```
|
||||
config device eth0_100
|
||||
option type '8021q'
|
||||
option vid '100'
|
||||
option ifname 'eth0'
|
||||
option name 'eth0.100'
|
||||
|
||||
config device wan_100
|
||||
option type '8021q'
|
||||
option vid '100'
|
||||
option ifname 'ae_wan'
|
||||
option name 'ae_wan.100'
|
||||
|
||||
config device br_internet
|
||||
option type 'bridge'
|
||||
list ports 'eth0.100'
|
||||
list ports 'ae_wan.100'
|
||||
```
|
||||
|
||||
### Bridge VLAN Filtering Approach (`brvlan:tagged:100`)
|
||||
|
||||
Single bridge with VLAN filtering:
|
||||
|
||||
```
|
||||
config device br_internet
|
||||
option type 'bridge'
|
||||
option vlan_filtering '1'
|
||||
list ports 'eth0'
|
||||
list ports 'ae_wan'
|
||||
|
||||
config bridge-vlan brvlan_100_internet
|
||||
option device 'br-internet'
|
||||
option vlan '100'
|
||||
list ports 'eth0:t'
|
||||
list ports 'ae_wan:t'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Use Cases
|
||||
|
||||
### ISP Internet Service (VLAN 1499, WAN Tagged)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### IPTV Service (VLAN 1510, WAN Tagged, No DHCP)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='tv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1510-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN3-LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### Multiple Services (Internet + IPTV)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet,tv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499,brvlan:wan-tagged:1510-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### Corporate Network (All Ports Tagged)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='corporate'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:tagged:100'
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Modifiers
|
||||
|
||||
Bridge VLAN filtering modes support the same modifiers as traditional bridge modes:
|
||||
|
||||
| Modifier | Effect | Example |
|
||||
|----------|--------|---------|
|
||||
| `-n` | Set proto=none (no DHCP client) | `brvlan:tagged:100-n` |
|
||||
| `-d` | Create but mark as disabled | `brvlan:wan-tagged:200-d` |
|
||||
|
||||
---
|
||||
|
||||
## Verification
|
||||
|
||||
### Check Bridge VLAN Configuration
|
||||
|
||||
```bash
|
||||
# View bridge device
|
||||
uci show network | grep "vlan_filtering"
|
||||
|
||||
# View bridge-vlan sections
|
||||
uci show network | grep "bridge-vlan"
|
||||
|
||||
# View interface status
|
||||
ip addr show
|
||||
|
||||
# View bridge VLAN table
|
||||
bridge vlan show
|
||||
```
|
||||
|
||||
### Example Output
|
||||
|
||||
```bash
|
||||
root@router:~# bridge vlan show
|
||||
port vlan-id
|
||||
ae_wan 1499 Tagged
|
||||
eth0 1499 Untagged
|
||||
eth1 1499 Untagged
|
||||
br-internet 1499
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Limitations
|
||||
|
||||
1. **No QinQ Support**: Bridge VLAN filtering does not currently support 802.1ad (QinQ) double tagging
|
||||
2. **Single VLAN per Interface**: Each bridge-vlan section defines one VLAN
|
||||
3. **Kernel Support Required**: Requires kernel with bridge VLAN filtering support
|
||||
|
||||
---
|
||||
|
||||
## Migration from Traditional Bridge
|
||||
|
||||
### Before (Traditional VLAN Devices)
|
||||
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:wan-tagged:100'
|
||||
```
|
||||
|
||||
### After (Bridge VLAN Filtering)
|
||||
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:100'
|
||||
```
|
||||
|
||||
Simply change the prefix from `bridge:` to `brvlan:`.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Check if VLAN Filtering is Enabled
|
||||
|
||||
```bash
|
||||
cat /sys/class/net/br-internet/bridge/vlan_filtering
|
||||
# Should output: 1
|
||||
```
|
||||
|
||||
### View Bridge VLAN Table
|
||||
|
||||
```bash
|
||||
bridge vlan show dev br-internet
|
||||
```
|
||||
|
||||
### Check Kernel Support
|
||||
|
||||
```bash
|
||||
# Check if bridge module supports vlan_filtering
|
||||
cat /sys/module/bridge/parameters/vlan_filtering
|
||||
```
|
||||
|
||||
### Enable Debug Logging
|
||||
|
||||
```bash
|
||||
# Monitor netmode logs
|
||||
logread -f | grep netmode-advanced
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Version**: 1.0
|
||||
**Last Updated**: 2025-12-12
|
||||
**Feature Status**: Production Ready
|
||||
318
netmode/docs/BRVLAN_MIXED_MODE_EXAMPLES.md
Normal file
318
netmode/docs/BRVLAN_MIXED_MODE_EXAMPLES.md
Normal file
@@ -0,0 +1,318 @@
|
||||
# Bridge VLAN Filtering - Mixed Mode Examples
|
||||
|
||||
## Overview
|
||||
|
||||
The `brvlan:mixed` mode provides flexible control over which ports are tagged vs untagged in a bridge VLAN configuration. This is useful for complex scenarios where different ports need different VLAN tagging behavior.
|
||||
|
||||
## Syntax
|
||||
|
||||
### Basic Mixed Mode (Default Behavior)
|
||||
```
|
||||
brvlan:mixed:VID
|
||||
```
|
||||
**Behavior**: WAN tagged, LAN ports untagged (same as `brvlan:wan-tagged:VID`)
|
||||
|
||||
### Custom Mixed Mode (Specify Tagged Ports)
|
||||
```
|
||||
brvlan:mixed:VID:TAGGED_PORTS
|
||||
```
|
||||
**Behavior**: Ports listed in `TAGGED_PORTS` are tagged, all others are untagged
|
||||
|
||||
**TAGGED_PORTS Format**: Same as port list specification (`LAN1-LAN2-WAN`, `WAN`, etc.)
|
||||
|
||||
---
|
||||
|
||||
## Examples
|
||||
|
||||
### Example 1: Basic Mixed Mode (WAN Tagged by Default)
|
||||
|
||||
**Scenario**: Internet service where WAN needs VLAN 100, LAN ports untagged
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:100'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
```
|
||||
config interface 'internet'
|
||||
option device 'br-internet.100'
|
||||
option proto 'dhcp'
|
||||
|
||||
config device br_internet
|
||||
option name 'br-internet'
|
||||
option type 'bridge'
|
||||
option vlan_filtering '1'
|
||||
list ports 'eth0' # LAN1
|
||||
list ports 'eth1' # LAN2
|
||||
list ports 'ae_wan' # WAN
|
||||
|
||||
config bridge-vlan brvlan_100_internet
|
||||
option device 'br-internet'
|
||||
option vlan '100'
|
||||
list ports 'eth0:u' # LAN1 untagged
|
||||
list ports 'eth1:u' # LAN2 untagged
|
||||
list ports 'ae_wan:t' # WAN tagged
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Example 2: Only Specific LAN Ports Tagged
|
||||
|
||||
**Scenario**: Enterprise network where LAN1 and WAN are tagged, LAN2 and LAN3 are untagged
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='corporate'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:200:LAN1-WAN'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
```
|
||||
config interface 'corporate'
|
||||
option device 'br-corporate.200'
|
||||
option proto 'dhcp'
|
||||
|
||||
config device br_corporate
|
||||
option name 'br-corporate'
|
||||
option type 'bridge'
|
||||
option vlan_filtering '1'
|
||||
list ports 'eth0' # LAN1
|
||||
list ports 'eth1' # LAN2
|
||||
list ports 'eth2' # LAN3
|
||||
list ports 'ae_wan' # WAN
|
||||
|
||||
config bridge-vlan brvlan_200_corporate
|
||||
option device 'br-corporate'
|
||||
option vlan '200'
|
||||
list ports 'eth0:t' # LAN1 tagged (specified)
|
||||
list ports 'eth1:u' # LAN2 untagged
|
||||
list ports 'eth2:u' # LAN3 untagged
|
||||
list ports 'ae_wan:t' # WAN tagged (specified)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Example 3: All LAN Ports Tagged, WAN Untagged
|
||||
|
||||
**Scenario**: Reverse scenario where LAN ports carry VLAN tags but WAN doesn't
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='service'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:300:LAN1-LAN2-LAN3'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
```
|
||||
config bridge-vlan brvlan_300_service
|
||||
option device 'br-service'
|
||||
option vlan '300'
|
||||
list ports 'eth0:t' # LAN1 tagged
|
||||
list ports 'eth1:t' # LAN2 tagged
|
||||
list ports 'eth2:t' # LAN3 tagged
|
||||
list ports 'ae_wan:u' # WAN untagged
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Example 4: Only WAN Tagged (Explicit)
|
||||
|
||||
**Scenario**: Same as `wan-tagged` but using mixed mode explicitly
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='iptv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:1510:WAN-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN3-LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
```
|
||||
config interface 'iptv'
|
||||
option device 'br-iptv.1510'
|
||||
option proto 'none'
|
||||
|
||||
config bridge-vlan brvlan_1510_iptv
|
||||
option device 'br-iptv'
|
||||
option vlan '1510'
|
||||
list ports 'eth2:u' # LAN3 untagged
|
||||
list ports 'eth3:u' # LAN4 untagged
|
||||
list ports 'ae_wan:t' # WAN tagged
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Example 5: Multi-Service with Different Tagging
|
||||
|
||||
**Scenario**: Internet with LAN1+WAN tagged, IPTV with only WAN tagged
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet,tv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:1499:LAN1-WAN,brvlan:mixed:1510:WAN-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
|
||||
**Internet Service (VLAN 1499)**:
|
||||
```
|
||||
config bridge-vlan brvlan_1499_internet
|
||||
option device 'br-internet'
|
||||
option vlan '1499'
|
||||
list ports 'eth0:t' # LAN1 tagged
|
||||
list ports 'eth1:u' # LAN2 untagged
|
||||
list ports 'ae_wan:t' # WAN tagged
|
||||
```
|
||||
|
||||
**TV Service (VLAN 1510)**:
|
||||
```
|
||||
config bridge-vlan brvlan_1510_tv
|
||||
option device 'br-tv'
|
||||
option vlan '1510'
|
||||
list ports 'eth2:u' # LAN3 untagged
|
||||
list ports 'eth3:u' # LAN4 untagged
|
||||
list ports 'ae_wan:t' # WAN tagged
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Example 6: Trunk Port Configuration
|
||||
|
||||
**Scenario**: LAN1 as trunk port (tagged), others as access ports (untagged)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='vlan100'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:100:LAN1'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-LAN4'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
**Result**:
|
||||
```
|
||||
config bridge-vlan brvlan_100_vlan100
|
||||
option device 'br-vlan100'
|
||||
option vlan '100'
|
||||
list ports 'eth0:t' # LAN1 tagged (trunk port)
|
||||
list ports 'eth1:u' # LAN2 untagged (access port)
|
||||
list ports 'eth2:u' # LAN3 untagged (access port)
|
||||
list ports 'eth3:u' # LAN4 untagged (access port)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Comparison: Mixed Mode vs Other Modes
|
||||
|
||||
| Mode | Syntax | Tagged Ports | Untagged Ports |
|
||||
|------|--------|--------------|----------------|
|
||||
| **tagged** | `brvlan:tagged:100` | ALL | None |
|
||||
| **wan-tagged** | `brvlan:wan-tagged:100` | WAN only | All LAN |
|
||||
| **mixed (default)** | `brvlan:mixed:100` | WAN only | All LAN |
|
||||
| **mixed (custom)** | `brvlan:mixed:100:LAN1-WAN` | LAN1, WAN | All others |
|
||||
|
||||
---
|
||||
|
||||
## Use Cases
|
||||
|
||||
### Use Case 1: DMZ Configuration
|
||||
- **LAN1**: Tagged (DMZ network with VLAN tag)
|
||||
- **LAN2-4**: Untagged (local network)
|
||||
- **WAN**: Tagged (ISP requirement)
|
||||
|
||||
```bash
|
||||
brvlan:mixed:100:LAN1-WAN
|
||||
```
|
||||
|
||||
### Use Case 2: Guest Network
|
||||
- **LAN1-2**: Tagged (guest WiFi APs that handle VLANs)
|
||||
- **LAN3-4**: Untagged (local devices)
|
||||
- **WAN**: Untagged (local ISP connection)
|
||||
|
||||
```bash
|
||||
brvlan:mixed:50:LAN1-LAN2
|
||||
```
|
||||
|
||||
### Use Case 3: Managed Switch Uplink
|
||||
- **LAN1**: Tagged (uplink to managed switch)
|
||||
- **LAN2-4**: Untagged (end user devices)
|
||||
- **WAN**: Tagged (ISP VLAN)
|
||||
|
||||
```bash
|
||||
brvlan:mixed:200:LAN1-WAN
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Port Specification Reference
|
||||
|
||||
When specifying tagged ports in mixed mode:
|
||||
|
||||
| Specification | Resolves To | Example |
|
||||
|---------------|-------------|---------|
|
||||
| `WAN` | WAN device | `ae_wan` |
|
||||
| `LAN1` | LAN1 device from UCI | `eth0` |
|
||||
| `LAN1-LAN2` | LAN1 and LAN2 | `eth0`, `eth1` |
|
||||
| `LAN1-WAN` | LAN1 and WAN | `eth0`, `ae_wan` |
|
||||
| `ALL` | Not supported in tagged ports spec | Use `brvlan:tagged` instead |
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Verify Port Tagging
|
||||
|
||||
```bash
|
||||
# View bridge VLAN table
|
||||
bridge vlan show
|
||||
|
||||
# Expected output shows :t (tagged) or :u (untagged)
|
||||
port vlan-id
|
||||
eth0 100 Tagged
|
||||
eth1 100 Untagged
|
||||
ae_wan 100 Tagged
|
||||
```
|
||||
|
||||
### Check Configuration
|
||||
|
||||
```bash
|
||||
# View bridge-vlan sections
|
||||
uci show network | grep bridge-vlan -A5
|
||||
|
||||
# Look for ports list with :t or :u suffixes
|
||||
```
|
||||
|
||||
### Common Mistakes
|
||||
|
||||
1. **Wrong Syntax**: Must use colon between VID and port spec
|
||||
- ❌ `brvlan:mixed:100-LAN1-WAN`
|
||||
- ✅ `brvlan:mixed:100:LAN1-WAN`
|
||||
|
||||
2. **Using ALL**: Don't use ALL in tagged ports
|
||||
- ❌ `brvlan:mixed:100:ALL`
|
||||
- ✅ Use `brvlan:tagged:100` instead
|
||||
|
||||
3. **Duplicate Ports**: Port appears in both bridge port list and tagged spec
|
||||
- Ensure the port list in arg 3 includes all ports you reference in arg 2
|
||||
|
||||
---
|
||||
|
||||
## Advanced: Multiple VLANs on Same Bridge
|
||||
|
||||
While this guide focuses on single VLAN per bridge, you can create multiple bridge-vlan sections manually after netmode configuration for trunk scenarios. However, this is beyond the scope of netmode automation.
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Updated**: 2025-12-12
|
||||
**Feature**: Bridge VLAN Filtering Mixed Mode
|
||||
739
netmode/docs/CONFIGURATION_SCENARIOS.md
Normal file
739
netmode/docs/CONFIGURATION_SCENARIOS.md
Normal file
@@ -0,0 +1,739 @@
|
||||
# Advanced Mode - Configuration Scenarios
|
||||
|
||||
Complete examples for common use cases with both UCI and TR-181 configuration methods.
|
||||
|
||||
---
|
||||
|
||||
## Scenario 1: Simple Home Router (Transparent Bridge)
|
||||
|
||||
**Use Case**: All ports bridged together for simple home network
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
All LAN ports + WAN → br-wan (no VLANs)
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan'
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:transparent'
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>wan</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>bridge:transparent</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>ALL</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- Single bridge interface `br-wan`
|
||||
- All ports untagged
|
||||
- DHCP client enabled
|
||||
|
||||
---
|
||||
|
||||
## Scenario 2: Traditional LAN Bridge with Routed WAN
|
||||
|
||||
**Use Case**: Classic router setup with LAN bridge and separate routed WAN
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
All LAN ports → br-lan (bridge)
|
||||
WAN port → wan (routed interface)
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='lan,wan'
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:transparent,route:transparent'
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL_LAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>lan,wan</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>bridge:transparent,route:transparent</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>ALL_LAN,WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- Bridge interface `br-lan` with all LAN ports only
|
||||
- Routed interface `wan` on WAN port
|
||||
- Traditional router topology
|
||||
|
||||
---
|
||||
|
||||
## Scenario 3: ISP Internet Service (Single VLAN)
|
||||
|
||||
**Use Case**: ISP requires VLAN 100 on WAN port for internet access
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
WAN.100 (tagged) + LAN1-4 (untagged) → br-internet.100
|
||||
```
|
||||
|
||||
### UCI Configuration (Bridge VLAN Filtering - Recommended)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:100'
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### UCI Configuration (Traditional VLAN Devices)
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet'
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:wan-tagged:100'
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>internet</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>brvlan:wan-tagged:100</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>ALL</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- WAN port tagged with VLAN 100
|
||||
- LAN ports untagged
|
||||
- DHCP client enabled
|
||||
|
||||
---
|
||||
|
||||
## Scenario 4: ISP Dual Service (Internet + IPTV)
|
||||
|
||||
**Use Case**: ISP provides Internet on VLAN 1499 and IPTV on VLAN 1510
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
Internet: WAN.1499 (tagged) + LAN1-2 (untagged) → br-internet.1499
|
||||
IPTV: WAN.1510 (tagged) + LAN3-4 (untagged) → br-tv.1510
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet,tv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:1499,brvlan:wan-tagged:1510-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>internet,tv</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>brvlan:wan-tagged:1499,brvlan:wan-tagged:1510-n</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>LAN1-LAN2-WAN,LAN3-LAN4-WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- Internet bridge on VLAN 1499 with LAN1-2
|
||||
- IPTV bridge on VLAN 1510 with LAN3-4 (proto=none, no DHCP)
|
||||
- Both services use WAN port with respective VLANs
|
||||
|
||||
---
|
||||
|
||||
## Scenario 5: ISP Triple-Play (Internet + IPTV + VoIP)
|
||||
|
||||
**Use Case**: Full triple-play service with Internet, IPTV, and VoIP
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
Internet: WAN.100 (tagged) + LAN1-2 (untagged) → br-internet.100
|
||||
IPTV: WAN.200 (tagged) + LAN3 (untagged) → br-tv.200
|
||||
VoIP: WAN.300 (tagged) + LAN4 (untagged) → br-voip.300
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='internet,tv,voip'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:100,brvlan:wan-tagged:200-n,brvlan:wan-tagged:300-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-WAN,LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>internet,tv,voip</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>brvlan:wan-tagged:100,brvlan:wan-tagged:200-n,brvlan:wan-tagged:300-n</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>LAN1-LAN2-WAN,LAN3-WAN,LAN4-WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- Internet on VLAN 100 with DHCP (LAN1-2)
|
||||
- IPTV on VLAN 200 without DHCP (LAN3)
|
||||
- VoIP on VLAN 300 without DHCP (LAN4)
|
||||
|
||||
---
|
||||
|
||||
## Scenario 6: Routed Multi-Service (Internet + IPTV + Management)
|
||||
|
||||
**Use Case**: Multiple routed services on different VLANs with NAT/firewall
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
WAN.100 → wan (routed, DHCP, firewall)
|
||||
WAN.200 → iptv (routed, DHCP, firewall)
|
||||
WAN.300 → mgmt (routed, DHCP, firewall)
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan,iptv,mgmt'
|
||||
uci set netmode.mode_4_supprted_args_2.value='route:vlan:100,route:vlan:200,route:vlan:300'
|
||||
uci set netmode.mode_4_supprted_args_3.value='WAN,WAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>wan,iptv,mgmt</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>route:vlan:100,route:vlan:200,route:vlan:300</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>WAN,WAN,WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- Three separate routed interfaces
|
||||
- Each with own firewall zone
|
||||
- All with DHCP clients enabled
|
||||
|
||||
---
|
||||
|
||||
## Scenario 7: Hybrid Setup (Routed Internet + Bridged IPTV)
|
||||
|
||||
**Use Case**: Internet needs routing/NAT, but IPTV needs transparent bridge to STBs
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
WAN.100 → wan (routed, firewall)
|
||||
WAN.200 + LAN1-3 → br-iptv.200 (bridged, transparent)
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan,iptv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='route:vlan:100,brvlan:wan-tagged:200-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='WAN,LAN1-LAN2-LAN3-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>wan,iptv</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>route:vlan:100,brvlan:wan-tagged:200-n</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>WAN,LAN1-LAN2-LAN3-WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- WAN interface routed with firewall
|
||||
- IPTV bridged transparently to LAN ports
|
||||
- Firewall enabled (because of routed interface)
|
||||
|
||||
---
|
||||
|
||||
## Scenario 8: Corporate Network with Trunk Port
|
||||
|
||||
**Use Case**: LAN1 is trunk port to managed switch, other ports are access ports
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
VLAN 200: LAN1 (tagged) + WAN (tagged) + LAN2-3 (untagged) → br-corporate.200
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='corporate'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:mixed:200:LAN1-WAN'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-LAN3-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>corporate</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>brvlan:mixed:200:LAN1-WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>LAN1-LAN2-LAN3-WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- LAN1 and WAN tagged (trunk ports)
|
||||
- LAN2-3 untagged (access ports)
|
||||
- All on VLAN 200
|
||||
|
||||
---
|
||||
|
||||
## Scenario 9: Enterprise Multi-VLAN (Separate Networks)
|
||||
|
||||
**Use Case**: Separate networks for guest, corporate, and management
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
Guest: WAN.100 (tagged) + LAN1 (untagged) → br-guest.100
|
||||
Corporate: WAN.200 (tagged) + LAN2-3 (untagged) → br-corporate.200
|
||||
Management: WAN.300 (tagged) + LAN4 (untagged) → br-mgmt.300
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='guest,corporate,mgmt'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:wan-tagged:100-n,brvlan:wan-tagged:200-n,brvlan:wan-tagged:300'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-WAN,LAN2-LAN3-WAN,LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>guest,corporate,mgmt</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>brvlan:wan-tagged:100-n,brvlan:wan-tagged:200-n,brvlan:wan-tagged:300</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>LAN1-WAN,LAN2-LAN3-WAN,LAN4-WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- Guest network on VLAN 100 (no DHCP)
|
||||
- Corporate network on VLAN 200 (no DHCP)
|
||||
- Management network on VLAN 300 (DHCP enabled)
|
||||
|
||||
---
|
||||
|
||||
## Scenario 10: Wholesale QinQ Provider
|
||||
|
||||
**Use Case**: Service provider supporting multiple customers with QinQ (802.1ad)
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
Customer A: All ports double-tagged (S-tag 100, C-tag 10)
|
||||
Customer B: All ports double-tagged (S-tag 100, C-tag 20)
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='customer_a,customer_b'
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:qinq:10:100-n,bridge:qinq:20:100-n'
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2-WAN,LAN3-LAN4-WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>customer_a,customer_b</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>bridge:qinq:10:100-n,bridge:qinq:20:100-n</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>LAN1-LAN2-WAN,LAN3-LAN4-WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- Customer A bridge with C-tag 10, S-tag 100
|
||||
- Customer B bridge with C-tag 20, S-tag 100
|
||||
- Both without DHCP (proto=none)
|
||||
|
||||
**Note**: QinQ requires traditional `bridge:` mode, not available with `brvlan:` mode.
|
||||
|
||||
---
|
||||
|
||||
## Scenario 11: MACVLAN Multi-Service (Different MAC Addresses)
|
||||
|
||||
**Use Case**: ISP requires different MAC addresses for Internet and IPTV services
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
WAN (default MAC) → wan (routed)
|
||||
WAN (custom MAC) → iptv (routed)
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan,iptv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='route:transparent,route:macvlan:AA:BB:CC:DD:EE:FF'
|
||||
uci set netmode.mode_4_supprted_args_3.value='WAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>wan,iptv</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>route:transparent,route:macvlan:AA:BB:CC:DD:EE:FF</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>WAN,WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- WAN interface with default MAC
|
||||
- IPTV interface with custom MAC (AA:BB:CC:DD:EE:FF)
|
||||
- Both routed with firewall
|
||||
|
||||
---
|
||||
|
||||
## Scenario 12: Standalone VLAN Interface
|
||||
|
||||
**Use Case**: WAN as standalone VLAN interface (no bridge, no routing, for custom protocols)
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
WAN.2501 → wan (standalone, proto=none)
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan'
|
||||
uci set netmode.mode_4_supprted_args_2.value='direct:2501'
|
||||
uci set netmode.mode_4_supprted_args_3.value='WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>wan</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>direct:2501</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>WAN</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- WAN.2501 VLAN device created
|
||||
- No bridge, no routing layer
|
||||
- proto=none (manual configuration needed)
|
||||
|
||||
---
|
||||
|
||||
## Scenario 13: All Ports Tagged (Managed Network)
|
||||
|
||||
**Use Case**: All ports need VLAN tags for managed switch environment
|
||||
|
||||
**Network Topology**:
|
||||
```
|
||||
VLAN 100: All ports tagged → br-mgmt.100
|
||||
```
|
||||
|
||||
### UCI Configuration
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.mode_4_supprted_args_1.value='mgmt'
|
||||
uci set netmode.mode_4_supprted_args_2.value='brvlan:tagged:100'
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
### TR-181 Configuration
|
||||
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>advanced</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.1.Value</Name>
|
||||
<Value>mgmt</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.2.Value</Name>
|
||||
<Value>brvlan:tagged:100</Value>
|
||||
</ParameterValueStruct>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.SupportedModes.4.SupportedArguments.3.Value</Name>
|
||||
<Value>ALL</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
**Result**:
|
||||
- All ports (LAN + WAN) tagged with VLAN 100
|
||||
- Single bridge with VLAN filtering
|
||||
- DHCP client enabled
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference: Configuration Cheat Sheet
|
||||
|
||||
### Interface Types
|
||||
|
||||
| Type | Syntax | When to Use |
|
||||
|------|--------|-------------|
|
||||
| Transparent Bridge | `bridge:transparent` | Simple home network, no VLANs |
|
||||
| Bridge VLAN Filtering (Tagged) | `brvlan:tagged:VID` | All ports need VLAN tags, modern approach |
|
||||
| Bridge VLAN Filtering (WAN Tagged) | `brvlan:wan-tagged:VID` | ISP VLAN on WAN, LAN untagged (recommended) |
|
||||
| Bridge VLAN Filtering (Mixed) | `brvlan:mixed:VID:PORTS` | Custom trunk/access port setup |
|
||||
| Traditional Tagged Bridge | `bridge:tagged:VID` | Legacy systems, all ports tagged |
|
||||
| Traditional WAN Tagged | `bridge:wan-tagged:VID` | Legacy ISP VLAN setup |
|
||||
| QinQ Bridge | `bridge:qinq:CVID:SVID` | Wholesale provider, double tagging |
|
||||
| Routed VLAN | `route:vlan:VID` | Need routing/NAT per service |
|
||||
| Routed MACVLAN | `route:macvlan:MAC` | Different MAC per service |
|
||||
| Direct VLAN | `direct:VID` | Standalone VLAN for custom protocols |
|
||||
|
||||
### Modifiers
|
||||
|
||||
| Modifier | Effect | Example |
|
||||
|----------|--------|---------|
|
||||
| `-n` | Disable DHCP client (proto=none) | `brvlan:wan-tagged:100-n` |
|
||||
| `-d` | Disable interface | `route:vlan:200-d` |
|
||||
|
||||
### Port Specifications
|
||||
|
||||
| Syntax | Meaning |
|
||||
|--------|---------|
|
||||
| `ALL` | All LAN + WAN ports |
|
||||
| `WAN` | WAN port only |
|
||||
| `LAN1-LAN2-WAN` | LAN1, LAN2, and WAN |
|
||||
| `LAN1-LAN3` | LAN1 and LAN3 only |
|
||||
|
||||
### MAC Address Macros
|
||||
|
||||
| Macro | Description | Example Result |
|
||||
|-------|-------------|----------------|
|
||||
| `BaseMACAddress` | Base MAC from `fw_printenv -n ethaddr` | `94:3F:0C:D5:76:00` |
|
||||
| `BaseMACAddressP1` | Base MAC + 1 | `94:3F:0C:D5:76:01` |
|
||||
| `BaseMACAddressP2` | Base MAC + 2 | `94:3F:0C:D5:76:02` |
|
||||
| `BaseMACAddressPN` | Base MAC + N | `BaseMACAddressP5` → `94:3F:0C:D5:76:05` |
|
||||
| Explicit MAC | Direct assignment | `AA:BB:CC:DD:EE:FF` |
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Updated**: 2025-12-12
|
||||
1220
netmode/docs/DEVELOPER_GUIDE.md
Normal file
1220
netmode/docs/DEVELOPER_GUIDE.md
Normal file
File diff suppressed because it is too large
Load Diff
1038
netmode/docs/IMPLEMENTATION_GUIDE.md
Normal file
1038
netmode/docs/IMPLEMENTATION_GUIDE.md
Normal file
File diff suppressed because it is too large
Load Diff
422
netmode/docs/README.md
Normal file
422
netmode/docs/README.md
Normal file
@@ -0,0 +1,422 @@
|
||||
# Netmode - Network Mode Switching for OpenWrt/iopsys
|
||||
|
||||
**Version**: 1.1.11
|
||||
**License**: GPL-2.0-only
|
||||
**Maintainer**: iopsys
|
||||
|
||||
## Overview
|
||||
|
||||
Netmode is a network configuration management package for OpenWrt/iopsys-based routers that enables seamless switching between different WAN connection types. It provides a unified interface for managing network modes including DHCP, PPPoE, Static IP, and Bridge configurations.
|
||||
|
||||
### Key Features
|
||||
|
||||
- **Simple Mode Switching**: Change WAN connection type with a single command
|
||||
- **Multiple Mode Support**: DHCP, PPPoE, Static IP, and Bridged mode
|
||||
- **Automatic Configuration**: Handles network, firewall, DHCP, and multicast settings
|
||||
- **TR-069/USP Integration**: Remote management via BBF data model
|
||||
- **Extensible Architecture**: Easy to add custom network modes
|
||||
- **Safe Transitions**: Proper cleanup and validation during mode switches
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
# Install via opkg
|
||||
opkg update
|
||||
opkg install netmode
|
||||
|
||||
# Or build from source
|
||||
make package/feeds/iopsys/netmode/compile
|
||||
```
|
||||
|
||||
### Basic Usage
|
||||
|
||||
```bash
|
||||
# Check current mode
|
||||
cat /etc/netmodes/.last_mode
|
||||
|
||||
# Switch to DHCP mode
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
|
||||
# Switch to PPPoE mode
|
||||
uci set netmode.global.mode='routed-pppoe'
|
||||
uci set netmode.@supported_args[2].value='username@isp.com'
|
||||
uci set netmode.@supported_args[3].value='password'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
## Supported Modes
|
||||
|
||||
| Mode | Description | Use Case |
|
||||
|------|-------------|----------|
|
||||
| **routed-dhcp** | Router with DHCP WAN | Cable/Fiber internet with automatic IP |
|
||||
| **routed-pppoe** | Router with PPPoE WAN | DSL internet with authentication |
|
||||
| **routed-static** | Router with Static IP WAN | Business connections with fixed IP |
|
||||
| **advanced** ⭐ | **Unified Advanced Mode** | Bridges, routed interfaces, VLAN, QinQ, MACVLAN - all in one |
|
||||
|
||||
### Advanced Mode (v1.1.11+) - Recommended
|
||||
|
||||
The **advanced** mode is a unified, powerful configuration mode that replaces both `bridged` and `routed-multi-service` modes. It supports:
|
||||
|
||||
✅ **Bridge interfaces** with VLAN/QinQ support (traditional VLAN devices)
|
||||
✅ **Bridge VLAN filtering** (modern kernel bridge VLAN filtering - **recommended**)
|
||||
✅ **Routed interfaces** with VLAN/MACVLAN support
|
||||
✅ **Standalone VLAN interfaces** (direct, no bridge)
|
||||
✅ **Mixed scenarios** (combine bridges and routed interfaces)
|
||||
✅ **Flexible configuration** with single, intuitive syntax
|
||||
✅ **MAC address assignment** with macros (BaseMACAddress, BaseMACAddressPNN)
|
||||
✅ **Comprehensive validation** with helpful error messages
|
||||
|
||||
**Quick Example - Triple-Play Service**:
|
||||
```bash
|
||||
uci set netmode.global.mode='advanced'
|
||||
uci set netmode.@supported_args[0].value='wan,iptv,mgmt'
|
||||
uci set netmode.@supported_args[1].value='route:vlan:100,route:vlan:200,route:vlan:300'
|
||||
uci set netmode.@supported_args[2].value='WAN,WAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
```
|
||||
|
||||
See **[ADVANCED_MODE_GUIDE.md](ADVANCED_MODE_GUIDE.md)** for complete documentation.
|
||||
|
||||
## Documentation
|
||||
|
||||
Comprehensive documentation is available in the following guides:
|
||||
|
||||
### For Users
|
||||
- **[ADVANCED_MODE_GUIDE.md](ADVANCED_MODE_GUIDE.md)** ⭐ - **Complete advanced mode guide** (RECOMMENDED)
|
||||
- All interface types (bridge, routed, standalone)
|
||||
- VLAN, QinQ, MACVLAN configurations
|
||||
- Bridge VLAN filtering (modern approach)
|
||||
- Real-world use case scenarios
|
||||
- TR-069/USP examples
|
||||
- Troubleshooting
|
||||
- **[BRIDGE_VLAN_FILTERING.md](BRIDGE_VLAN_FILTERING.md)** 🆕 - **Bridge VLAN filtering guide**
|
||||
- Modern bridge VLAN filtering feature
|
||||
- Syntax and configuration examples
|
||||
- Performance benefits
|
||||
- Migration from traditional VLAN devices
|
||||
- **[ADVANCED_MODE_QUICK_REFERENCE.md](ADVANCED_MODE_QUICK_REFERENCE.md)** - Quick reference for advanced mode
|
||||
- **[CONFIGURATION_SCENARIOS.md](CONFIGURATION_SCENARIOS.md)** - Real-world configuration examples with UCI and TR-181
|
||||
- **[VALIDATION_AND_ERROR_HANDLING.md](VALIDATION_AND_ERROR_HANDLING.md)** 🆕 - **Validation and error handling guide**
|
||||
- Input validation rules
|
||||
- Error messages and troubleshooting
|
||||
- Common validation errors
|
||||
- Testing validation
|
||||
- **[USER_GUIDE.md](USER_GUIDE.md)** - User guide for basic modes (DHCP, PPPoE, Static)
|
||||
- Getting started
|
||||
- Mode descriptions
|
||||
- Common use cases
|
||||
- FAQ
|
||||
|
||||
### For Developers
|
||||
- **[DEVELOPER_GUIDE.md](DEVELOPER_GUIDE.md)** - Developer documentation
|
||||
- Development environment setup
|
||||
- Code organization
|
||||
- API reference
|
||||
- Testing framework
|
||||
- Contributing guidelines
|
||||
|
||||
### For Implementers
|
||||
- **[IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)** - Implementation details
|
||||
- Architecture overview
|
||||
- Creating custom modes
|
||||
- Environment variables
|
||||
- Hook system
|
||||
- Data model integration
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Netmode System │
|
||||
├─────────────────────────────────────────┤
|
||||
│ UCI Config → Init Service → Mode Scripts│
|
||||
│ ↓ ↓ ↓ │
|
||||
│ Environment Pre-hooks UCI Copy │
|
||||
│ Variables ↓ ↓ │
|
||||
│ ↓ Mode Scripts Post-hooks │
|
||||
│ └──────────┴────────────┘ │
|
||||
│ Network Reconfiguration │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Components
|
||||
|
||||
- **Init Service** (`/etc/init.d/netmode`): Orchestrates mode switching
|
||||
- **Mode Scripts** (`/etc/netmodes/<mode>/scripts/`): Mode-specific configuration
|
||||
- **UCI Config** (`/etc/config/netmode`): Mode definitions and parameters
|
||||
- **Data Model** (`datamodel.json`): BBF TR-181 integration
|
||||
- **Hooks** (`/lib/netmode/{pre,post}/`): Pre/post mode switch scripts
|
||||
|
||||
## Configuration Examples
|
||||
|
||||
### DHCP with VLAN
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
uci set netmode.@supported_args[0].value='100' # VLAN ID
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### PPPoE with Custom DNS
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='routed-pppoe'
|
||||
uci set netmode.@supported_args[2].value='user@isp.com'
|
||||
uci set netmode.@supported_args[3].value='password123'
|
||||
uci set netmode.@supported_args[6].value='8.8.8.8,8.8.4.4'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### Static IP Business Connection
|
||||
|
||||
```bash
|
||||
uci set netmode.global.mode='routed-static'
|
||||
uci set netmode.@supported_args[6].value='203.0.113.10'
|
||||
uci set netmode.@supported_args[7].value='255.255.255.0'
|
||||
uci set netmode.@supported_args[8].value='203.0.113.1'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
## Creating Custom Modes
|
||||
|
||||
Custom network modes can be added by following these steps:
|
||||
|
||||
1. **Create mode directory structure**:
|
||||
```bash
|
||||
mkdir -p /etc/netmodes/my-mode/scripts
|
||||
```
|
||||
|
||||
2. **Define mode in supported_modes.json**:
|
||||
```json
|
||||
{
|
||||
"name": "my-mode",
|
||||
"description": "My Custom Mode",
|
||||
"supported_args": [...]
|
||||
}
|
||||
```
|
||||
|
||||
3. **Create mode script**:
|
||||
```bash
|
||||
cat > /etc/netmodes/my-mode/scripts/10-my-mode << 'EOF'
|
||||
#!/bin/sh
|
||||
# Configuration logic here
|
||||
EOF
|
||||
chmod +x /etc/netmodes/my-mode/scripts/10-my-mode
|
||||
```
|
||||
|
||||
4. **Import to UCI and test**:
|
||||
```bash
|
||||
sh /etc/uci-defaults/40_netmode_populated_supported_modes
|
||||
uci set netmode.global.mode='my-mode'
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
See [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md#creating-a-new-network-mode) for detailed instructions.
|
||||
|
||||
## TR-069/USP Integration
|
||||
|
||||
Netmode exposes a BBF TR-181 data model for remote management:
|
||||
|
||||
**Data Model Path**: `Device.X_IOWRT_EU_NetMode.`
|
||||
|
||||
```
|
||||
Device.X_IOWRT_EU_NetMode.
|
||||
├── Enable (boolean, r/w)
|
||||
├── Mode (string, r/w)
|
||||
├── SupportedModesNumberOfEntries (unsignedInt, r)
|
||||
└── SupportedModes.{i}.
|
||||
├── Name (string, r)
|
||||
├── Description (string, r)
|
||||
└── SupportedArguments.{i}.
|
||||
├── Name (string, r)
|
||||
├── Type (string, r)
|
||||
├── Required (boolean, r)
|
||||
└── Value (string, r/w)
|
||||
```
|
||||
|
||||
Example TR-069 operation:
|
||||
```xml
|
||||
<SetParameterValues>
|
||||
<ParameterList>
|
||||
<ParameterValueStruct>
|
||||
<Name>Device.X_IOWRT_EU_NetMode.Mode</Name>
|
||||
<Value>routed-dhcp</Value>
|
||||
</ParameterValueStruct>
|
||||
</ParameterList>
|
||||
</SetParameterValues>
|
||||
```
|
||||
|
||||
## System Requirements
|
||||
|
||||
- **Platform**: OpenWrt/iopsys
|
||||
- **Dependencies**:
|
||||
- `dm-service` (BBF data model service)
|
||||
- `uci`
|
||||
- `procd`
|
||||
- `libubox` (jshn)
|
||||
- **Recommended**:
|
||||
- `logread` for monitoring
|
||||
- `firewall`, `odhcpd`, `mcast` for full functionality
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
netmode/
|
||||
├── Makefile # Package build definition
|
||||
├── README.md # This file
|
||||
├── IMPLEMENTATION_GUIDE.md # Implementation guide
|
||||
├── DEVELOPER_GUIDE.md # Developer documentation
|
||||
├── USER_GUIDE.md # User documentation
|
||||
├── bbfdm_service.json # BBF service registration
|
||||
└── files/
|
||||
├── etc/
|
||||
│ ├── config/netmode # UCI configuration
|
||||
│ ├── init.d/netmode # Init script (START=11)
|
||||
│ ├── uci-defaults/ # First-boot scripts
|
||||
│ └── netmodes/
|
||||
│ ├── supported_modes.json # Mode definitions
|
||||
│ ├── routed-dhcp/scripts/
|
||||
│ ├── routed-pppoe/scripts/
|
||||
│ ├── routed-static/scripts/
|
||||
│ └── bridged/scripts/
|
||||
└── lib/
|
||||
├── netmode/
|
||||
│ ├── pre/ # Pre-switch hooks
|
||||
│ └── post/ # Post-switch hooks
|
||||
└── upgrade/keep.d/netmode # Sysupgrade preservation
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Mode Not Switching
|
||||
|
||||
```bash
|
||||
# Check if enabled
|
||||
uci get netmode.global.enabled
|
||||
|
||||
# Check logs
|
||||
logread | grep netmode
|
||||
|
||||
# Force mode change
|
||||
rm /etc/netmodes/.last_mode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### No Internet After Switch
|
||||
|
||||
```bash
|
||||
# Verify mode applied
|
||||
cat /etc/netmodes/.last_mode
|
||||
|
||||
# Check WAN status
|
||||
ifconfig wan
|
||||
ip route
|
||||
|
||||
# Restart network
|
||||
/etc/init.d/network restart
|
||||
```
|
||||
|
||||
### PPPoE Authentication Failed
|
||||
|
||||
```bash
|
||||
# Check credentials
|
||||
uci show network.wan | grep -E "username|password"
|
||||
|
||||
# Check logs
|
||||
logread | grep ppp
|
||||
|
||||
# Verify VLAN if required
|
||||
uci get network.wan.device
|
||||
```
|
||||
|
||||
See [USER_GUIDE.md](USER_GUIDE.md#troubleshooting) for comprehensive troubleshooting.
|
||||
|
||||
## Development
|
||||
|
||||
### Building
|
||||
|
||||
```bash
|
||||
# Clone repository
|
||||
cd feeds/iopsys/netmode
|
||||
|
||||
# Build package
|
||||
make package/feeds/iopsys/netmode/compile V=s
|
||||
|
||||
# Install on device
|
||||
scp bin/packages/*/iopsys/netmode_*.ipk root@192.168.1.1:/tmp/
|
||||
ssh root@192.168.1.1 "opkg install /tmp/netmode_*.ipk"
|
||||
```
|
||||
|
||||
### Testing
|
||||
|
||||
```bash
|
||||
# Run mode switch test
|
||||
./test-mode-switch.sh routed-dhcp
|
||||
|
||||
# Monitor logs
|
||||
logread -f | grep netmode
|
||||
|
||||
# Verify configuration
|
||||
uci show network
|
||||
cat /etc/netmodes/.last_mode
|
||||
```
|
||||
|
||||
### Contributing
|
||||
|
||||
Contributions are welcome! Please follow these steps:
|
||||
|
||||
1. Fork the repository
|
||||
2. Create a feature branch
|
||||
3. Make your changes
|
||||
4. Test thoroughly on target hardware
|
||||
5. Update documentation
|
||||
6. Submit a pull request
|
||||
|
||||
See [DEVELOPER_GUIDE.md](DEVELOPER_GUIDE.md#contributing-guidelines) for detailed guidelines.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the GNU General Public License v2.0 only.
|
||||
|
||||
See `/LICENSE` for more information.
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation**: See guides in this repository
|
||||
- **Issues**: Contact iopsys development team
|
||||
- **Community**: OpenWrt and iopsys forums
|
||||
|
||||
## Changelog
|
||||
|
||||
### Version 1.1.11
|
||||
- Current stable release
|
||||
- Support for DHCP, PPPoE, Static IP, and Bridge modes
|
||||
- BBF TR-181 data model integration
|
||||
- Comprehensive documentation
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
- OpenWrt project for the underlying platform
|
||||
- iopsys for development and maintenance
|
||||
- Contributors and testers
|
||||
|
||||
## Related Projects
|
||||
|
||||
- [OpenWrt](https://openwrt.org/) - Linux operating system for embedded devices
|
||||
- [iopsys](https://www.iopsys.eu/) - Broadband device management
|
||||
- [BBF](https://www.broadband-forum.org/) - Broadband Forum standards
|
||||
|
||||
---
|
||||
|
||||
**For detailed information, please refer to the specific guides:**
|
||||
- Users: [USER_GUIDE.md](USER_GUIDE.md)
|
||||
- Developers: [DEVELOPER_GUIDE.md](DEVELOPER_GUIDE.md)
|
||||
- Implementers: [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)
|
||||
887
netmode/docs/USER_GUIDE.md
Normal file
887
netmode/docs/USER_GUIDE.md
Normal file
@@ -0,0 +1,887 @@
|
||||
# Netmode User Guide
|
||||
|
||||
## Table of Contents
|
||||
1. [Introduction](#introduction)
|
||||
2. [Getting Started](#getting-started)
|
||||
3. [Available Network Modes](#available-network-modes)
|
||||
4. [Configuration Methods](#configuration-methods)
|
||||
5. [Common Use Cases](#common-use-cases)
|
||||
6. [Troubleshooting](#troubleshooting)
|
||||
7. [FAQ](#faq)
|
||||
8. [Glossary](#glossary)
|
||||
|
||||
---
|
||||
|
||||
## Introduction
|
||||
|
||||
### What is Netmode?
|
||||
|
||||
Netmode is a network configuration management system for iopsys-based routers that allows you to easily switch between different WAN (Wide Area Network) connection types without manual configuration.
|
||||
|
||||
### Why Use Netmode?
|
||||
|
||||
- **Simplicity**: Switch network modes with a single command
|
||||
- **Flexibility**: Support for multiple WAN connection types
|
||||
- **Consistency**: Ensures proper configuration of all related network services
|
||||
- **Remote Management**: Can be controlled via TR-069/USP protocols
|
||||
- **Safety**: Automatically handles complex network reconfigurations
|
||||
|
||||
### Supported Connection Types
|
||||
|
||||
- **DHCP**: Automatic IP configuration (most common for cable/fiber connections)
|
||||
- **PPPoE**: Username/password authentication (common for DSL connections)
|
||||
- **Static IP**: Manual IP configuration (business connections)
|
||||
- **Bridged Mode**: Bridge/modem mode (disable routing)
|
||||
|
||||
---
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Checking if Netmode is Installed
|
||||
|
||||
```bash
|
||||
# Check if netmode package is installed
|
||||
opkg list-installed | grep netmode
|
||||
|
||||
# Check netmode service status
|
||||
service netmode status
|
||||
```
|
||||
|
||||
Expected output:
|
||||
```
|
||||
netmode - 1.1.11-1 - Network Modes and Utils
|
||||
```
|
||||
|
||||
### Checking Current Mode
|
||||
|
||||
```bash
|
||||
# View current configuration
|
||||
uci show netmode.global
|
||||
|
||||
# Check active mode
|
||||
cat /etc/netmodes/.last_mode
|
||||
```
|
||||
|
||||
Example output:
|
||||
```
|
||||
netmode.global=netmode
|
||||
netmode.global.enabled='1'
|
||||
netmode.global.mode='routed-dhcp'
|
||||
```
|
||||
|
||||
### Viewing Available Modes
|
||||
|
||||
```bash
|
||||
# List all supported modes
|
||||
uci show netmode | grep "supported_modes.*name"
|
||||
```
|
||||
|
||||
Example output:
|
||||
```
|
||||
netmode.@supported_modes[0].name='routed-dhcp'
|
||||
netmode.@supported_modes[1].name='routed-pppoe'
|
||||
netmode.@supported_modes[2].name='routed-static'
|
||||
netmode.@supported_modes[3].name='bridged'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Available Network Modes
|
||||
|
||||
### 1. Routed DHCP Mode
|
||||
|
||||
**Mode Name**: `routed-dhcp`
|
||||
|
||||
**When to Use**:
|
||||
- Cable internet connection
|
||||
- Fiber internet connection
|
||||
- Any ISP that automatically provides IP configuration
|
||||
|
||||
**Features**:
|
||||
- Automatic IP address assignment
|
||||
- Built-in router (NAT)
|
||||
- Firewall enabled
|
||||
- DHCP server for local devices
|
||||
- IPv4 and IPv6 support
|
||||
|
||||
**Configuration Parameters**:
|
||||
- `vlanid` (optional): VLAN ID if required by ISP
|
||||
- `dns_servers` (optional): Custom DNS servers (comma-separated)
|
||||
|
||||
**Example Configuration**:
|
||||
```bash
|
||||
# Basic DHCP mode
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
|
||||
# DHCP with VLAN ID 100
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
# Find VLAN argument and set value
|
||||
uci set netmode.@supported_args[0].value='100'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Routed PPPoE Mode
|
||||
|
||||
**Mode Name**: `routed-pppoe`
|
||||
|
||||
**When to Use**:
|
||||
- DSL internet connection
|
||||
- ISP requires username and password authentication
|
||||
- Connection uses PPPoE protocol
|
||||
|
||||
**Features**:
|
||||
- Username/password authentication
|
||||
- Built-in router (NAT)
|
||||
- Firewall enabled
|
||||
- DHCP server for local devices
|
||||
- Automatic MTU optimization
|
||||
|
||||
**Required Parameters**:
|
||||
- `username`: PPPoE username (provided by ISP)
|
||||
- `password`: PPPoE password (provided by ISP)
|
||||
|
||||
**Optional Parameters**:
|
||||
- `vlanid`: VLAN ID if required by ISP
|
||||
- `mtu`: Maximum transmission unit (default: 1492 for PPPoE)
|
||||
- `dns_servers`: Custom DNS servers (comma-separated)
|
||||
|
||||
**Example Configuration**:
|
||||
```bash
|
||||
# Set mode
|
||||
uci set netmode.global.mode='routed-pppoe'
|
||||
|
||||
# Set username (find correct argument index)
|
||||
uci set netmode.@supported_args[2].value='myuser@isp.com'
|
||||
|
||||
# Set password
|
||||
uci set netmode.@supported_args[3].value='mypassword'
|
||||
|
||||
# Optional: Set VLAN
|
||||
uci set netmode.@supported_args[4].value='100'
|
||||
|
||||
# Optional: Set MTU
|
||||
uci set netmode.@supported_args[5].value='1492'
|
||||
|
||||
# Apply configuration
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Important Notes**:
|
||||
- Device will reboot after configuration
|
||||
- Keep ISP credentials safe
|
||||
- Most DSL connections use VLAN ID 7 or 100 (check with ISP)
|
||||
- MTU typically 1492 for PPPoE (auto-configured)
|
||||
|
||||
---
|
||||
|
||||
### 3. Routed Static IP Mode
|
||||
|
||||
**Mode Name**: `routed-static`
|
||||
|
||||
**When to Use**:
|
||||
- Business internet connection with static IP
|
||||
- ISP provided specific IP address, subnet mask, and gateway
|
||||
- Fixed IP address required for services (web server, VPN, etc.)
|
||||
|
||||
**Features**:
|
||||
- Manual IP configuration
|
||||
- Built-in router (NAT)
|
||||
- Firewall enabled
|
||||
- DHCP server for local devices
|
||||
- Fixed WAN IP address
|
||||
|
||||
**Required Parameters**:
|
||||
- `ipaddr`: Static IP address (e.g., 93.21.0.104)
|
||||
- `netmask`: Subnet mask (e.g., 255.255.255.0)
|
||||
- `gateway`: Default gateway IP (e.g., 93.21.0.1)
|
||||
|
||||
**Optional Parameters**:
|
||||
- `vlanid`: VLAN ID if required
|
||||
- `dns_servers`: DNS servers (comma-separated, e.g., 8.8.8.8,8.8.4.4)
|
||||
|
||||
**Example Configuration**:
|
||||
```bash
|
||||
# Set mode
|
||||
uci set netmode.global.mode='routed-static'
|
||||
|
||||
# Set IP address
|
||||
uci set netmode.@supported_args[6].value='93.21.0.104'
|
||||
|
||||
# Set subnet mask
|
||||
uci set netmode.@supported_args[7].value='255.255.255.0'
|
||||
|
||||
# Set gateway
|
||||
uci set netmode.@supported_args[8].value='93.21.0.1'
|
||||
|
||||
# Optional: Set DNS servers
|
||||
uci set netmode.@supported_args[9].value='8.8.8.8,8.8.4.4'
|
||||
|
||||
# Apply configuration
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Important Notes**:
|
||||
- Use exact IP settings provided by ISP
|
||||
- Incorrect settings will result in no internet connectivity
|
||||
- DNS servers are optional but recommended
|
||||
- Device will reboot after configuration
|
||||
|
||||
---
|
||||
|
||||
### 4. Bridged Mode
|
||||
|
||||
**Mode Name**: `bridged`
|
||||
|
||||
**When to Use**:
|
||||
- Using router as a bridge/modem only
|
||||
- Another router handles routing and DHCP
|
||||
- ISP requires bridge mode
|
||||
- Cascading routers (not recommended, prefer this mode on upstream device)
|
||||
- Advanced VLAN configurations (multiple bridges, QinQ)
|
||||
|
||||
**Features**:
|
||||
- Supports multiple bridge configurations
|
||||
- VLAN tagging and QinQ support
|
||||
- Can create standalone VLAN interfaces (no bridge)
|
||||
- No routing (NAT disabled)
|
||||
- Firewall disabled
|
||||
- DHCP server disabled
|
||||
- Device acts as transparent bridge
|
||||
|
||||
**Configuration Parameters**:
|
||||
- `interface_names` (optional): Comma-separated interface names (default: wan)
|
||||
- `interface_types` (optional): Comma-separated types (transparent, tagged:VID, direct:VID, qinq:C:S, etc.)
|
||||
- `ports` (optional): Comma-separated port lists (default: ALL)
|
||||
|
||||
**Basic Configuration**:
|
||||
```bash
|
||||
# Simple transparent bridge
|
||||
uci set netmode.global.mode='bridged'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Advanced Configuration Examples**:
|
||||
```bash
|
||||
# Multiple VLANs as separate bridges
|
||||
uci set netmode.global.mode='bridged'
|
||||
uci set netmode.@supported_args[0].value='lan100,lan200' # interface_names
|
||||
uci set netmode.@supported_args[1].value='tagged:100,tagged:200' # interface_types
|
||||
uci set netmode.@supported_args[2].value='LAN1-LAN2,LAN3-LAN4' # ports
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
|
||||
# Standalone VLAN interface (no bridge)
|
||||
uci set netmode.global.mode='bridged'
|
||||
uci set netmode.@supported_args[0].value='wan'
|
||||
uci set netmode.@supported_args[1].value='direct:2501' # Direct VLAN interface
|
||||
uci set netmode.@supported_args[2].value='WAN'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
**Important Notes**:
|
||||
- Device will obtain IP from upstream router/ISP
|
||||
- Web interface may be inaccessible until device gets IP
|
||||
- To access device: connect directly and check DHCP leases on upstream router
|
||||
- Device will reboot after configuration
|
||||
- Use this mode carefully - you may lose access to the device
|
||||
- For advanced VLAN scenarios, see ADVANCED_BRIDGE_GUIDE.md
|
||||
|
||||
**Parameter Naming Note**:
|
||||
As of version 1.1.11, parameters were renamed for clarity:
|
||||
- `bridge_names` → `interface_names` (old name still works)
|
||||
- `bridge_types` → `interface_types` (old name still works)
|
||||
|
||||
**Reverting from Bridge Mode**:
|
||||
If you lose access, connect via serial console or perform factory reset.
|
||||
|
||||
---
|
||||
|
||||
## Configuration Methods
|
||||
|
||||
### Method 1: UCI Command Line (SSH/Console)
|
||||
|
||||
**Step-by-step procedure**:
|
||||
|
||||
```bash
|
||||
# 1. Connect to device
|
||||
ssh root@192.168.1.1
|
||||
|
||||
# 2. View current configuration
|
||||
uci show netmode
|
||||
|
||||
# 3. Set desired mode
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
|
||||
# 4. Set any required parameters (example for PPPoE)
|
||||
uci set netmode.@supported_args[2].value='username@isp.com'
|
||||
uci set netmode.@supported_args[3].value='password123'
|
||||
|
||||
# 5. Save configuration
|
||||
uci commit netmode
|
||||
|
||||
# 6. Apply changes
|
||||
service netmode restart
|
||||
|
||||
# 7. Monitor logs (optional)
|
||||
logread -f | grep netmode
|
||||
```
|
||||
|
||||
### Method 2: TR-069/CWMP (Remote Management)
|
||||
|
||||
If your device is managed by an ACS (Auto Configuration Server):
|
||||
|
||||
**Get current mode**:
|
||||
```xml
|
||||
GetParameterValues
|
||||
Device.X_IOWRT_EU_NetMode.Mode
|
||||
```
|
||||
|
||||
**Set PPPoE mode**:
|
||||
```xml
|
||||
SetParameterValues
|
||||
Device.X_IOWRT_EU_NetMode.Mode = "routed-pppoe"
|
||||
Device.X_IOWRT_EU_NetMode.SupportedModes.2.SupportedArguments.1.Value = "username@isp.com"
|
||||
Device.X_IOWRT_EU_NetMode.SupportedModes.2.SupportedArguments.2.Value = "password123"
|
||||
```
|
||||
|
||||
**Trigger mode change**:
|
||||
```bash
|
||||
# On device (via TR-069 script)
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### Method 3: Web Interface (if available)
|
||||
|
||||
Some firmware may provide a web interface for netmode configuration.
|
||||
|
||||
Typical location: **Network → WAN → Connection Type**
|
||||
|
||||
---
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
### Use Case 1: Switching from DHCP to PPPoE
|
||||
|
||||
**Scenario**: ISP changed from cable to DSL connection
|
||||
|
||||
```bash
|
||||
# 1. Connect to router
|
||||
ssh root@192.168.1.1
|
||||
|
||||
# 2. Find username and password argument indices
|
||||
uci show netmode | grep -A3 "name='username'"
|
||||
# Note the index numbers
|
||||
|
||||
# 3. Set mode and credentials
|
||||
uci set netmode.global.mode='routed-pppoe'
|
||||
uci set netmode.@supported_args[2].value='newuser@dsl-isp.com'
|
||||
uci set netmode.@supported_args[3].value='newpassword'
|
||||
|
||||
# 4. If ISP requires VLAN (e.g., VLAN 7)
|
||||
uci set netmode.@supported_args[4].value='7'
|
||||
|
||||
# 5. Apply
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
|
||||
# Device will reboot
|
||||
```
|
||||
|
||||
### Use Case 2: Adding Custom DNS Servers
|
||||
|
||||
**Scenario**: Want to use Google DNS or Cloudflare DNS
|
||||
|
||||
```bash
|
||||
# For DHCP mode
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
|
||||
# Find dns_servers argument index
|
||||
uci show netmode | grep -B2 "name='dns_servers'"
|
||||
|
||||
# Set custom DNS (Google DNS example)
|
||||
uci set netmode.@supported_args[1].value='8.8.8.8,8.8.4.4'
|
||||
|
||||
# Or Cloudflare DNS
|
||||
uci set netmode.@supported_args[1].value='1.1.1.1,1.0.0.1'
|
||||
|
||||
# Apply
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### Use Case 3: Configuring VLAN for ISP
|
||||
|
||||
**Scenario**: ISP requires VLAN tagging (common for fiber)
|
||||
|
||||
```bash
|
||||
# Identify your mode (example: DHCP)
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
|
||||
# Find VLAN argument
|
||||
uci show netmode | grep -B2 "name='vlanid'"
|
||||
|
||||
# Set VLAN ID (ISP will provide this, commonly 100, 7, or other)
|
||||
uci set netmode.@supported_args[0].value='100'
|
||||
|
||||
# Apply
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### Use Case 4: Setting Up Bridge Mode for Secondary Router
|
||||
|
||||
**Scenario**: Using dedicated router behind ISP modem
|
||||
|
||||
```bash
|
||||
# Configure device as bridge
|
||||
uci set netmode.global.mode='bridged'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
|
||||
# After reboot, device will be in bridge mode
|
||||
# Connect to it via the IP it receives from upstream
|
||||
```
|
||||
|
||||
### Use Case 5: Business Static IP Setup
|
||||
|
||||
**Scenario**: ISP provided static IP configuration
|
||||
|
||||
**ISP Information**:
|
||||
- IP Address: 203.0.113.10
|
||||
- Subnet Mask: 255.255.255.248
|
||||
- Gateway: 203.0.113.9
|
||||
- DNS: 203.0.113.1, 203.0.113.2
|
||||
|
||||
```bash
|
||||
# Set mode
|
||||
uci set netmode.global.mode='routed-static'
|
||||
|
||||
# Configure IP settings (find argument indices first)
|
||||
uci show netmode | grep -B2 "name='ipaddr'"
|
||||
uci show netmode | grep -B2 "name='netmask'"
|
||||
uci show netmode | grep -B2 "name='gateway'"
|
||||
|
||||
# Set values
|
||||
uci set netmode.@supported_args[6].value='203.0.113.10'
|
||||
uci set netmode.@supported_args[7].value='255.255.255.248'
|
||||
uci set netmode.@supported_args[8].value='203.0.113.9'
|
||||
uci set netmode.@supported_args[9].value='203.0.113.1,203.0.113.2'
|
||||
|
||||
# Apply
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Problem: No Internet After Mode Switch
|
||||
|
||||
**Symptoms**:
|
||||
- Cannot access websites
|
||||
- No WAN IP address
|
||||
- Local network works but no internet
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check WAN interface status
|
||||
ifconfig wan
|
||||
|
||||
# Check if WAN has IP
|
||||
ip addr show wan
|
||||
|
||||
# Check routing table
|
||||
ip route
|
||||
|
||||
# Check DNS resolution
|
||||
nslookup google.com
|
||||
|
||||
# Check mode applied correctly
|
||||
cat /etc/netmodes/.last_mode
|
||||
uci show netmode.global.mode
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
|
||||
1. **For DHCP mode**:
|
||||
```bash
|
||||
# Restart network
|
||||
/etc/init.d/network restart
|
||||
|
||||
# Release and renew DHCP
|
||||
udhcpc -i wan -n
|
||||
```
|
||||
|
||||
2. **For PPPoE mode**:
|
||||
```bash
|
||||
# Check credentials
|
||||
uci show network.wan.username
|
||||
uci show network.wan.password
|
||||
|
||||
# Check PPPoE connection
|
||||
logread | grep pppd
|
||||
|
||||
# Restart PPPoE
|
||||
ifdown wan
|
||||
ifup wan
|
||||
```
|
||||
|
||||
3. **For Static IP mode**:
|
||||
```bash
|
||||
# Verify settings
|
||||
uci show network.wan
|
||||
|
||||
# Check if gateway is reachable
|
||||
ping -c 3 $(uci get network.wan.gateway)
|
||||
```
|
||||
|
||||
### Problem: Cannot Access Router After Mode Change
|
||||
|
||||
**Symptoms**:
|
||||
- Cannot reach router web interface
|
||||
- Cannot SSH to router
|
||||
- Router appears offline
|
||||
|
||||
**Solutions**:
|
||||
|
||||
1. **Check router IP address**:
|
||||
- Routed modes: Router should be at `192.168.1.1`
|
||||
- Bridged mode: Router gets IP from upstream device
|
||||
|
||||
2. **For bridged mode**:
|
||||
```bash
|
||||
# Connect to upstream router
|
||||
# Check DHCP leases for your device MAC address
|
||||
# Or connect via serial console
|
||||
```
|
||||
|
||||
3. **Factory reset** (last resort):
|
||||
- Hold reset button for 10 seconds
|
||||
- Device will reset to default configuration
|
||||
|
||||
### Problem: Mode Not Switching
|
||||
|
||||
**Symptoms**:
|
||||
- `.last_mode` not updated
|
||||
- Old configuration still active
|
||||
- No changes after restart
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check if netmode is enabled
|
||||
uci get netmode.global.enabled
|
||||
|
||||
# Check logs
|
||||
logread | grep netmode
|
||||
|
||||
# Check if mode exists
|
||||
ls /etc/netmodes/*/scripts/
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Enable netmode if disabled
|
||||
uci set netmode.global.enabled='1'
|
||||
uci commit netmode
|
||||
|
||||
# Force mode change by removing last_mode
|
||||
rm /etc/netmodes/.last_mode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### Problem: PPPoE Authentication Failure
|
||||
|
||||
**Symptoms**:
|
||||
- WAN interface shows "connecting" but never connects
|
||||
- Logs show authentication errors
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check PPPoE logs
|
||||
logread | grep ppp
|
||||
|
||||
# Common errors:
|
||||
# - "authentication failed"
|
||||
# - "LCP timeout"
|
||||
# - "CHAP authentication failed"
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Verify credentials (double-check with ISP)
|
||||
uci show network.wan.username
|
||||
uci show network.wan.password
|
||||
|
||||
# Some ISPs require VLAN tagging
|
||||
uci set netmode.@supported_args[4].value='7' # or ISP-specific VLAN
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
|
||||
# Check if service name is required (rare)
|
||||
uci set network.wan.service='ISP-SERVICE-NAME'
|
||||
uci commit network
|
||||
```
|
||||
|
||||
### Problem: Slow Internet After Mode Switch
|
||||
|
||||
**Symptoms**:
|
||||
- Internet works but very slow
|
||||
- High latency
|
||||
|
||||
**Solutions**:
|
||||
|
||||
1. **Check MTU settings** (especially for PPPoE):
|
||||
```bash
|
||||
# Set MTU for PPPoE
|
||||
uci set netmode.@supported_args[5].value='1492'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
2. **Check for DNS issues**:
|
||||
```bash
|
||||
# Test DNS resolution speed
|
||||
time nslookup google.com
|
||||
|
||||
# Use faster DNS
|
||||
uci set netmode.@supported_args[X].value='1.1.1.1,1.0.0.1'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
3. **Check WAN speed**:
|
||||
```bash
|
||||
# Install iperf3 and test
|
||||
opkg update
|
||||
opkg install iperf3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## FAQ
|
||||
|
||||
### General Questions
|
||||
|
||||
**Q: Will I lose my configuration when switching modes?**
|
||||
|
||||
A: Netmode preserves most router settings (WiFi, firewall rules, etc.), but WAN-specific settings are reconfigured. Local network settings remain unchanged.
|
||||
|
||||
**Q: How long does a mode switch take?**
|
||||
|
||||
A: The mode switch itself takes a few seconds, but the device will reboot, which takes 1-2 minutes total.
|
||||
|
||||
**Q: Can I switch modes remotely?**
|
||||
|
||||
A: Yes, via SSH or TR-069/USP if configured. However, be careful with bridge mode as you may lose connectivity.
|
||||
|
||||
**Q: Do I need to reboot manually?**
|
||||
|
||||
A: No, the system automatically reboots after applying a new mode.
|
||||
|
||||
**Q: Can I schedule a mode switch?**
|
||||
|
||||
A: Yes, using cron:
|
||||
```bash
|
||||
# Switch to bridged mode at 2 AM
|
||||
echo "0 2 * * * uci set netmode.global.mode='bridged' && uci commit && service netmode restart" | crontab -
|
||||
```
|
||||
|
||||
### Mode-Specific Questions
|
||||
|
||||
**Q: Which mode should I use?**
|
||||
|
||||
A: Depends on your ISP:
|
||||
- Cable/Fiber without login: **routed-dhcp**
|
||||
- DSL with username/password: **routed-pppoe**
|
||||
- Static IP business connection: **routed-static**
|
||||
- Using as bridge only: **bridged**
|
||||
|
||||
**Q: Can I use PPPoE with VLAN?**
|
||||
|
||||
A: Yes, set both the mode and VLAN ID:
|
||||
```bash
|
||||
uci set netmode.global.mode='routed-pppoe'
|
||||
uci set netmode.@supported_args[4].value='100'
|
||||
```
|
||||
|
||||
**Q: What's the difference between routed and bridged mode?**
|
||||
|
||||
A:
|
||||
- **Routed modes**: Router performs NAT, runs firewall, provides DHCP to local network
|
||||
- **Bridged mode**: Router acts as transparent bridge, no NAT, no firewall, no DHCP
|
||||
|
||||
**Q: Can I customize the LAN IP in routed modes?**
|
||||
|
||||
A: Yes, but not through netmode. After mode switch, manually configure:
|
||||
```bash
|
||||
uci set network.lan.ipaddr='192.168.2.1'
|
||||
uci commit network
|
||||
/etc/init.d/network restart
|
||||
```
|
||||
|
||||
### Technical Questions
|
||||
|
||||
**Q: Where are my credentials stored?**
|
||||
|
||||
A: In `/etc/config/netmode` (UCI configuration). They are cleared from memory after mode application for security.
|
||||
|
||||
**Q: Can I create custom modes?**
|
||||
|
||||
A: Yes, advanced users can create custom modes. See the IMPLEMENTATION_GUIDE.md and DEVELOPER_GUIDE.md.
|
||||
|
||||
**Q: Does netmode support IPv6?**
|
||||
|
||||
A: Yes, routed-dhcp and routed-pppoe modes support IPv6 (DHCPv6).
|
||||
|
||||
**Q: What happens to firewall rules?**
|
||||
|
||||
A: Firewall is enabled for routed modes and disabled for bridged mode. Custom rules are preserved.
|
||||
|
||||
**Q: Can I use multiple WAN connections?**
|
||||
|
||||
A: Netmode manages the primary WAN. For multi-WAN setups, configure secondary WANs manually after netmode configuration.
|
||||
|
||||
---
|
||||
|
||||
## Glossary
|
||||
|
||||
**Bridge Mode**: Operating mode where the router acts as a transparent network bridge without routing or NAT.
|
||||
|
||||
**DHCP (Dynamic Host Configuration Protocol)**: Automatic IP address assignment protocol.
|
||||
|
||||
**DMZ (Demilitarized Zone)**: Network segment that sits between internal network and external network.
|
||||
|
||||
**DNS (Domain Name System)**: Service that translates domain names to IP addresses.
|
||||
|
||||
**Gateway**: Router IP address that connects local network to the internet.
|
||||
|
||||
**ISP (Internet Service Provider)**: Company providing internet access.
|
||||
|
||||
**LAN (Local Area Network)**: Internal network (devices in your home/office).
|
||||
|
||||
**MTU (Maximum Transmission Unit)**: Largest packet size that can be transmitted. PPPoE typically uses 1492.
|
||||
|
||||
**NAT (Network Address Translation)**: Technology allowing multiple devices to share one public IP address.
|
||||
|
||||
**PPPoE (Point-to-Point Protocol over Ethernet)**: Authentication protocol commonly used for DSL connections.
|
||||
|
||||
**Static IP**: Fixed IP address that doesn't change (opposite of DHCP).
|
||||
|
||||
**Subnet Mask**: Defines the network portion of an IP address (e.g., 255.255.255.0).
|
||||
|
||||
**TR-069/CWMP**: Remote management protocol for network devices.
|
||||
|
||||
**UCI (Unified Configuration Interface)**: OpenWrt configuration system.
|
||||
|
||||
**USP (User Services Platform)**: Next-generation device management protocol.
|
||||
|
||||
**VLAN (Virtual LAN)**: Network segmentation using VLAN tags (802.1Q).
|
||||
|
||||
**WAN (Wide Area Network)**: External network connection (internet).
|
||||
|
||||
---
|
||||
|
||||
## Getting Help
|
||||
|
||||
### Log Collection
|
||||
|
||||
When reporting issues, collect these logs:
|
||||
|
||||
```bash
|
||||
# System logs
|
||||
logread > /tmp/system.log
|
||||
|
||||
# Network configuration
|
||||
uci export network > /tmp/network.conf
|
||||
uci export netmode > /tmp/netmode.conf
|
||||
|
||||
# Interface status
|
||||
ifconfig > /tmp/interfaces.txt
|
||||
ip route > /tmp/routes.txt
|
||||
|
||||
# Copy to external system
|
||||
scp /tmp/*.{log,conf,txt} user@external-host:/path/
|
||||
```
|
||||
|
||||
### Support Resources
|
||||
|
||||
- **Documentation**: Check IMPLEMENTATION_GUIDE.md and DEVELOPER_GUIDE.md
|
||||
- **Community Forums**: OpenWrt and iopsys community forums
|
||||
- **Issue Tracker**: Report bugs to iopsys development team
|
||||
- **ISP Support**: Contact ISP for connection-specific parameters (VLAN, credentials, etc.)
|
||||
|
||||
### Before Contacting Support
|
||||
|
||||
Please have ready:
|
||||
1. Current mode: `cat /etc/netmodes/.last_mode`
|
||||
2. Netmode version: `opkg info netmode | grep Version`
|
||||
3. Error logs: `logread | grep netmode`
|
||||
4. Network configuration: `uci export netmode`
|
||||
5. What you're trying to achieve
|
||||
6. What you've already tried
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference Card
|
||||
|
||||
### Common Commands
|
||||
|
||||
```bash
|
||||
# View current mode
|
||||
cat /etc/netmodes/.last_mode
|
||||
|
||||
# List available modes
|
||||
uci show netmode | grep "supported_modes.*name"
|
||||
|
||||
# Switch to DHCP
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
uci commit netmode && service netmode restart
|
||||
|
||||
# Switch to PPPoE
|
||||
uci set netmode.global.mode='routed-pppoe'
|
||||
uci set netmode.@supported_args[2].value='username'
|
||||
uci set netmode.@supported_args[3].value='password'
|
||||
uci commit netmode && service netmode restart
|
||||
|
||||
# Switch to Bridge
|
||||
uci set netmode.global.mode='bridged'
|
||||
uci commit netmode && service netmode restart
|
||||
|
||||
# View logs
|
||||
logread | grep netmode
|
||||
|
||||
# Reset to last mode
|
||||
rm /etc/netmodes/.last_mode
|
||||
service netmode restart
|
||||
```
|
||||
|
||||
### Emergency Recovery
|
||||
|
||||
```bash
|
||||
# If locked out after bridge mode
|
||||
# Connect via serial console and run:
|
||||
uci set netmode.global.mode='routed-dhcp'
|
||||
uci commit netmode
|
||||
service netmode restart
|
||||
|
||||
# Factory reset (hold reset button 10 seconds)
|
||||
# Or via console:
|
||||
firstboot -y && reboot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Package Version**: 1.1.11
|
||||
**Last Updated**: 2024
|
||||
**License**: GPL-2.0-only
|
||||
294
netmode/docs/VALIDATION_AND_ERROR_HANDLING.md
Normal file
294
netmode/docs/VALIDATION_AND_ERROR_HANDLING.md
Normal file
@@ -0,0 +1,294 @@
|
||||
# Advanced Mode - Validation and Error Handling
|
||||
|
||||
## Overview
|
||||
|
||||
The advanced mode includes comprehensive input validation and error handling to ensure configuration correctness and provide helpful error messages when issues occur.
|
||||
|
||||
## Validation Functions
|
||||
|
||||
### 1. VLAN ID Validation
|
||||
|
||||
**Function**: `validate_vlan_id()`
|
||||
|
||||
**Validates**:
|
||||
- VLAN ID is a number
|
||||
- VLAN ID is in valid range (1-4094)
|
||||
|
||||
**Example Error**:
|
||||
```
|
||||
ERROR: VLAN ID in type 'bridge:tagged:5000' out of range (must be 1-4094): 5000
|
||||
```
|
||||
|
||||
### 2. MAC Address Validation
|
||||
|
||||
**Function**: `validate_mac_address()`
|
||||
|
||||
**Validates**:
|
||||
- MAC address format (XX:XX:XX:XX:XX:XX)
|
||||
- MAC address macros (BaseMACAddress, BaseMACAddressPNN)
|
||||
- Hexadecimal characters only
|
||||
|
||||
**Example Errors**:
|
||||
```
|
||||
ERROR: Invalid MAC address format: 'ZZ:BB:CC:DD:EE:FF' (expected XX:XX:XX:XX:XX:XX)
|
||||
ERROR: Invalid MAC macro format: 'BaseMACAddressP' (expected BaseMACAddressPNN)
|
||||
```
|
||||
|
||||
### 3. Interface Name Validation
|
||||
|
||||
**Function**: `validate_interface_name()`
|
||||
|
||||
**Validates**:
|
||||
- Interface name is not empty
|
||||
- Only alphanumeric characters and underscore allowed
|
||||
- Reserved names not used (loopback, lo, globals)
|
||||
|
||||
**Example Errors**:
|
||||
```
|
||||
ERROR: Interface name 'wan-interface' invalid (only alphanumeric and underscore allowed)
|
||||
ERROR: Interface name 'loopback' is reserved
|
||||
```
|
||||
|
||||
### 4. Port Specification Validation
|
||||
|
||||
**Function**: `validate_port_spec()`
|
||||
|
||||
**Validates**:
|
||||
- Port specification is not empty
|
||||
- Valid port identifiers (LAN1-8, WAN, or interface names)
|
||||
- Format is correct (dash-separated)
|
||||
|
||||
**Example Error**:
|
||||
```
|
||||
ERROR: Invalid port identifier in 'LAN1-LAN9-WAN': 'LAN9'
|
||||
```
|
||||
|
||||
### 5. Interface Type Validation
|
||||
|
||||
**Function**: `validate_interface_type()`
|
||||
|
||||
**Validates**:
|
||||
- Interface type syntax is correct
|
||||
- VLAN IDs in types are valid
|
||||
- MAC addresses in types are valid
|
||||
- Type is recognized
|
||||
|
||||
**Example Errors**:
|
||||
```
|
||||
ERROR: Unknown interface type: 'bridge:unknown:100'
|
||||
Valid types: bridge:transparent, bridge:tagged:VID, brvlan:wan-tagged:VID, route:vlan:VID, route:macvlan:MAC, direct:VID
|
||||
|
||||
ERROR: VLAN ID in type 'route:vlan:9999' out of range (must be 1-4094): 9999
|
||||
```
|
||||
|
||||
## Configuration Validation
|
||||
|
||||
### Parameter Count Matching
|
||||
|
||||
The system validates that all configuration parameters have matching element counts:
|
||||
|
||||
```bash
|
||||
# This is VALID (3 interfaces, 3 types, 3 port lists)
|
||||
interface_names='wan,iptv,voip'
|
||||
interface_types='route:vlan:100,route:vlan:200,route:vlan:300'
|
||||
ports='WAN,WAN,WAN'
|
||||
|
||||
# This is INVALID (3 interfaces but only 2 types)
|
||||
interface_names='wan,iptv,voip'
|
||||
interface_types='route:vlan:100,route:vlan:200' # ERROR!
|
||||
ports='WAN,WAN,WAN'
|
||||
```
|
||||
|
||||
**Error Message**:
|
||||
```
|
||||
ERROR: Number of interface names (3) does not match number of interface types (2)
|
||||
interface_names: wan,iptv,voip
|
||||
interface_types: route:vlan:100,route:vlan:200
|
||||
```
|
||||
|
||||
### MAC Address Count Warning
|
||||
|
||||
If MAC addresses are provided but don't match interface count, a warning is issued:
|
||||
|
||||
```
|
||||
WARNING: Number of MAC addresses (2) does not match number of interfaces (3)
|
||||
Some interfaces will use default MAC addresses
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
### MAC Address Operations
|
||||
|
||||
#### Base MAC Not Found
|
||||
```
|
||||
WARNING: Base MAC address not found or invalid, using default
|
||||
```
|
||||
|
||||
#### MAC Increment Overflow
|
||||
```
|
||||
WARNING: MAC address overflow after increment, wrapping around
|
||||
```
|
||||
|
||||
#### Invalid Increment Value
|
||||
```
|
||||
ERROR: MAC increment must be a number: 'ABC'
|
||||
```
|
||||
|
||||
### Port Resolution
|
||||
|
||||
#### WAN Port Not Found
|
||||
```
|
||||
ERROR: WAN port not found in board.json or UCI
|
||||
```
|
||||
|
||||
### Validation Failure Behavior
|
||||
|
||||
When validation fails:
|
||||
1. **Error is logged** to syslog with severity `user.err`
|
||||
2. **Configuration is aborted** - no changes are applied
|
||||
3. **Exit code 1** is returned
|
||||
4. **Helpful error message** indicates what went wrong
|
||||
|
||||
## Debugging Validation Issues
|
||||
|
||||
### View Validation Logs
|
||||
|
||||
```bash
|
||||
# Check recent netmode logs
|
||||
logread | grep netmode-advanced
|
||||
|
||||
# Filter for errors only
|
||||
logread | grep -E "netmode-advanced.*ERROR"
|
||||
|
||||
# Watch logs in real-time
|
||||
logread -f | grep netmode-advanced
|
||||
```
|
||||
|
||||
### Common Validation Errors
|
||||
|
||||
#### 1. Mismatched Parameter Counts
|
||||
|
||||
**Problem**:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan,iptv'
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:transparent' # Only 1!
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL,LAN1-LAN2-WAN'
|
||||
```
|
||||
|
||||
**Solution**: Ensure all parameters have same number of comma-separated values:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:transparent,brvlan:wan-tagged:100'
|
||||
```
|
||||
|
||||
#### 2. Invalid VLAN ID
|
||||
|
||||
**Problem**:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:tagged:5000' # > 4094
|
||||
```
|
||||
|
||||
**Solution**: Use valid VLAN ID (1-4094):
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:tagged:100'
|
||||
```
|
||||
|
||||
#### 3. Invalid MAC Address Format
|
||||
|
||||
**Problem**:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_4.value='AA-BB-CC-DD-EE-FF' # Wrong separator
|
||||
```
|
||||
|
||||
**Solution**: Use colon separator:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_4.value='AA:BB:CC:DD:EE:FF'
|
||||
```
|
||||
|
||||
#### 4. Invalid Interface Name
|
||||
|
||||
**Problem**:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan-interface' # Dash not allowed
|
||||
```
|
||||
|
||||
**Solution**: Use underscore instead:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan_interface'
|
||||
```
|
||||
|
||||
#### 5. Invalid Port Specification
|
||||
|
||||
**Problem**:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1,LAN2' # Wrong separator
|
||||
```
|
||||
|
||||
**Solution**: Use dash separator:
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_3.value='LAN1-LAN2'
|
||||
```
|
||||
|
||||
## Testing Validation
|
||||
|
||||
### Test Invalid VLAN ID
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_1.value='test'
|
||||
uci set netmode.mode_4_supprted_args_2.value='bridge:tagged:9999'
|
||||
uci set netmode.mode_4_supprted_args_3.value='ALL'
|
||||
uci commit netmode && service netmode restart
|
||||
|
||||
# Check logs
|
||||
logread | tail -20 | grep netmode-advanced
|
||||
# Should show: ERROR: VLAN ID in type 'bridge:tagged:9999' out of range (must be 1-4094): 9999
|
||||
```
|
||||
|
||||
### Test Mismatched Counts
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_1.value='wan,iptv,voip'
|
||||
uci set netmode.mode_4_supprted_args_2.value='route:vlan:100,route:vlan:200' # Only 2!
|
||||
uci set netmode.mode_4_supprted_args_3.value='WAN,WAN,WAN'
|
||||
uci commit netmode && service netmode restart
|
||||
|
||||
# Check logs
|
||||
logread | tail -20 | grep netmode-advanced
|
||||
# Should show: ERROR: Number of interface names (3) does not match number of interface types (2)
|
||||
```
|
||||
|
||||
### Test Invalid MAC Address
|
||||
```bash
|
||||
uci set netmode.mode_4_supprted_args_4.value='INVALID-MAC'
|
||||
uci commit netmode && service netmode restart
|
||||
|
||||
# Check logs
|
||||
logread | tail -20 | grep netmode-advanced
|
||||
# Should show: ERROR: Invalid MAC address format: 'INVALID-MAC' (expected XX:XX:XX:XX:XX:XX)
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Always check logs** after configuration changes
|
||||
2. **Test configurations** in a development environment first
|
||||
3. **Use validation** to catch errors early
|
||||
4. **Read error messages** - they indicate exactly what's wrong
|
||||
5. **Keep backup** of working configuration
|
||||
|
||||
## Exit Codes
|
||||
|
||||
| Exit Code | Meaning |
|
||||
|-----------|---------|
|
||||
| 0 | Success - configuration applied |
|
||||
| 1 | Failure - validation error or configuration error |
|
||||
|
||||
## Integration with Management Systems
|
||||
|
||||
When using TR-181 or other management systems:
|
||||
|
||||
1. **Check exit code** of netmode service
|
||||
2. **Parse error logs** to provide user feedback
|
||||
3. **Validate before applying** using the same validation rules
|
||||
4. **Provide helpful error messages** to end users
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Updated**: 2025-12-13
|
||||
@@ -58,7 +58,7 @@
|
||||
"name": "mode"
|
||||
}
|
||||
},
|
||||
"linker_obj": "Device.{BBF_VENDOR_PREFIX}NetMode.SupportedModes.[Name==@key]."
|
||||
"linker_obj": "Device.{BBF_VENDOR_PREFIX}NetMode.SupportedModes.*.Name"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -87,55 +87,84 @@ configure_env_vars() {
|
||||
config_foreach _set_env_args supported_args
|
||||
}
|
||||
|
||||
cleanup_arg_values() {
|
||||
local dm_parent
|
||||
|
||||
config_get dm_parent ${1} dm_parent ""
|
||||
if [ "${dm_parent}" = "${SUPP_MODES_SEC}" ]; then
|
||||
uci -q set netmode.${1}.value=""
|
||||
fi
|
||||
}
|
||||
|
||||
cleanup_env_vars() {
|
||||
for e in $(env); do
|
||||
if echo ${e} |grep -q "^NETMODE_"; then
|
||||
unset ${e}
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "${SUPP_MODES_SEC}" ]; then
|
||||
config_load "netmode"
|
||||
config_foreach cleanup_arg_values supported_args
|
||||
uci commit netmode
|
||||
fi
|
||||
}
|
||||
|
||||
start_service() {
|
||||
[ -f /etc/config/netmode ] || return
|
||||
|
||||
config_load netmode
|
||||
config_get_bool enabled global enabled '0'
|
||||
[ $enabled -eq 0 ] && return
|
||||
|
||||
[ -d $MODEDIR ] || mkdir -p $MODEDIR
|
||||
# Get the desired netmode from config
|
||||
config_get mode global mode ""
|
||||
# Check if netmode is set as boot environment parameter
|
||||
[ -n "$mode" ] || mode="$(fw_printenv -n netmode 2>/dev/null)"
|
||||
# Return if mode is not set
|
||||
[ -n "$mode" ] || return
|
||||
|
||||
# Get the last saved mode
|
||||
lastmode="$(cat $MODEDIR/.last_mode 2>/dev/null)"
|
||||
# Return if desired mode is same as last saved mode
|
||||
if [ "$mode" = "$lastmode" ]; then
|
||||
_log "Not switching mode[${mode}], lastmode[${lastmode}]"
|
||||
if [ ! -f /etc/config/netmode ]; then
|
||||
_log "/etc/config/netmode not found, returning"
|
||||
return
|
||||
fi
|
||||
|
||||
_log "Switching to [${mode}] Mode"
|
||||
config_load netmode
|
||||
config_get_bool enabled global enabled '0'
|
||||
|
||||
# Configure env variables
|
||||
if [ "$enabled" -eq 0 ]; then
|
||||
_log "netmode service disabled, returning"
|
||||
return
|
||||
fi
|
||||
|
||||
[ -d $MODEDIR ] || mkdir -p $MODEDIR
|
||||
|
||||
# Get the desired netmode from config
|
||||
config_get mode global mode ""
|
||||
|
||||
# Check if netmode is set as boot environment parameter
|
||||
if [ -z "$mode" ]; then
|
||||
_log "mode not set in UCI, checking bootenv"
|
||||
mode="$(fw_printenv -n netmode 2>/dev/null)"
|
||||
fi
|
||||
|
||||
# Return if mode is not set
|
||||
if [ -z "$mode" ]; then
|
||||
_log "mode still empty, returning"
|
||||
return
|
||||
fi
|
||||
|
||||
|
||||
# Build configuration signature from UCI values directly
|
||||
# This ensures parameter changes trigger reconfiguration
|
||||
SUPP_MODES_SEC=""
|
||||
config_foreach _get_modes_sec_name supported_modes "${mode}"
|
||||
|
||||
local config_signature="${mode}"
|
||||
if [ -n "${SUPP_MODES_SEC}" ]; then
|
||||
# Get all arguments for this mode, sorted by section name for consistency
|
||||
for arg_sec in $(uci show netmode | grep "=supported_args" | cut -d'.' -f2 | cut -d'=' -f1 | sort); do
|
||||
local dm_parent=$(uci -q get "netmode.${arg_sec}.dm_parent")
|
||||
if [ "${dm_parent}" = "${SUPP_MODES_SEC}" ]; then
|
||||
local arg_name=$(uci -q get "netmode.${arg_sec}.name")
|
||||
local arg_value=$(uci -q get "netmode.${arg_sec}.value")
|
||||
if [ -n "${arg_name}" -a -n "${arg_value}" ]; then
|
||||
config_signature="${config_signature}:${arg_name}=${arg_value}"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
else
|
||||
_log "Could not find supported mode section"
|
||||
fi
|
||||
|
||||
# Get the last saved configuration signature
|
||||
local last_config_signature="$(cat $MODEDIR/.last_mode 2>/dev/null)"
|
||||
|
||||
# Return if configuration hasn't changed
|
||||
if [ "${config_signature}" = "${last_config_signature}" ]; then
|
||||
_log "Not reconfiguring, configuration unchanged"
|
||||
return
|
||||
fi
|
||||
|
||||
_log "Configuration changed, applying [${mode}] mode"
|
||||
if [ -n "${last_config_signature}" ]; then
|
||||
_log "Previous config: ${last_config_signature}"
|
||||
fi
|
||||
_log "Current config: ${config_signature}"
|
||||
|
||||
# Configure env variables (needed by mode scripts)
|
||||
configure_env_vars ${mode}
|
||||
# Execute netmode generic pre-mode-switch scripts
|
||||
libnetmode_exec "pre"
|
||||
@@ -150,19 +179,32 @@ start_service() {
|
||||
libnetmode_exec
|
||||
|
||||
# Execute mode specific scripts
|
||||
local script_exit_code=0
|
||||
if [ -d $MODEDIR/$mode/scripts ]; then
|
||||
for script in $(ls $MODEDIR/$mode/scripts/); do
|
||||
_log "Executing [${mode}], script [${script}]"
|
||||
sh $MODEDIR/$mode/scripts/$script
|
||||
script_exit_code=$?
|
||||
if [ $script_exit_code -ne 0 ]; then
|
||||
_log "ERROR: Mode script [${script}] failed with exit code ${script_exit_code}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Save mode as last mode
|
||||
echo "$mode" > $MODEDIR/.last_mode
|
||||
_log "Switching to Mode [${mode}] done, last mode updated"
|
||||
# Only save configuration if scripts succeeded
|
||||
if [ $script_exit_code -eq 0 ]; then
|
||||
# Save configuration signature as last mode
|
||||
echo "$config_signature" > $MODEDIR/.last_mode
|
||||
_log "Switching to Mode [${mode}] done, configuration saved"
|
||||
|
||||
# Execute netmode generic post-mode-switch scripts
|
||||
libnetmode_exec "post"
|
||||
else
|
||||
_log "ERROR: Mode switch to [${mode}] FAILED - configuration NOT saved"
|
||||
_log "The system will retry on next netmode restart"
|
||||
fi
|
||||
|
||||
# Execute netmode generic post-mode-switch scripts
|
||||
libnetmode_exec "post"
|
||||
cleanup_env_vars "${mode}"
|
||||
}
|
||||
|
||||
|
||||
577
netmode/files/etc/netmodes/advanced/scripts/10-advanced
Executable file
577
netmode/files/etc/netmodes/advanced/scripts/10-advanced
Executable file
@@ -0,0 +1,577 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Advanced Mode Script
|
||||
# Unified configuration for bridges, routed interfaces, and standalone interfaces
|
||||
# Replaces: bridged mode and routed-multi-service mode
|
||||
#
|
||||
|
||||
. /lib/functions.sh
|
||||
. /usr/share/libubox/jshn.sh
|
||||
. /lib/netmode/advanced_helper.sh
|
||||
|
||||
[ -f /etc/device_info ] && source "/etc/device_info"
|
||||
|
||||
_log() {
|
||||
logger -s -p user.info -t "netmode-advanced" "$*"
|
||||
}
|
||||
|
||||
IPTV_IFACES=""
|
||||
MGMT_IFACES=""
|
||||
INET_IFACES=""
|
||||
IPTV_DEVS=""
|
||||
WAN_PORT=""
|
||||
MACVLAN_PRESENT=0
|
||||
BRIDGE_VLAN_PRESENT=0
|
||||
|
||||
#
|
||||
# Main Interface Configuration
|
||||
#
|
||||
configure_interfaces() {
|
||||
_log "Starting advanced interface configuration"
|
||||
|
||||
# Get configuration from environment variables
|
||||
local interface_names="${NETMODE_interface_names:-wan}"
|
||||
local interface_types="${NETMODE_interface_types:-bridge:transparent}"
|
||||
local ports="${NETMODE_ports:-ALL}"
|
||||
local mac_addrs="${NETMODE_macaddrs:-}"
|
||||
|
||||
_log "Interface names: $interface_names"
|
||||
_log "Interface types: $interface_types"
|
||||
_log "Ports: $ports"
|
||||
_log "MAC addresses: $mac_addrs"
|
||||
|
||||
# Validate configuration before proceeding
|
||||
_log "Validating configuration..."
|
||||
|
||||
# Count elements in each parameter
|
||||
local name_count=$(echo "$interface_names" | tr ',' '\n' | wc -l)
|
||||
local type_count=$(echo "$interface_types" | tr ',' '\n' | wc -l)
|
||||
local port_count=$(echo "$ports" | tr ',' '\n' | wc -l)
|
||||
local mac_count=0
|
||||
[ -n "$mac_addrs" ] && mac_count=$(echo "$mac_addrs" | tr ',' '\n' | wc -l)
|
||||
|
||||
_log "Element counts: names=$name_count, types=$type_count, ports=$port_count, macs=$mac_count"
|
||||
|
||||
# Validate counts match
|
||||
if [ "$name_count" != "$type_count" ]; then
|
||||
_log "ERROR: Number of interface names ($name_count) does not match number of interface types ($type_count)"
|
||||
_log "interface_names: $interface_names"
|
||||
_log "interface_types: $interface_types"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ "$name_count" != "$port_count" ]; then
|
||||
_log "ERROR: Number of interface names ($name_count) does not match number of ports ($port_count)"
|
||||
_log "interface_names: $interface_names"
|
||||
_log "ports: $ports"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ "$mac_count" -gt 0 -a "$mac_count" != "$name_count" ]; then
|
||||
_log "WARNING: Number of MAC addresses ($mac_count) does not match number of interfaces ($name_count)"
|
||||
_log "Some interfaces will use default MAC addresses"
|
||||
fi
|
||||
|
||||
# Validate each parameter
|
||||
local idx=1
|
||||
local OLD_IFS="$IFS"
|
||||
IFS=','
|
||||
|
||||
for name in $interface_names; do
|
||||
validate_interface_name "$name" || {
|
||||
IFS="$OLD_IFS"
|
||||
return 1
|
||||
}
|
||||
done
|
||||
|
||||
for type in $interface_types; do
|
||||
validate_interface_type "$type" || {
|
||||
IFS="$OLD_IFS"
|
||||
return 1
|
||||
}
|
||||
done
|
||||
|
||||
for port_spec in $ports; do
|
||||
validate_port_spec "$port_spec" || {
|
||||
IFS="$OLD_IFS"
|
||||
return 1
|
||||
}
|
||||
done
|
||||
|
||||
if [ -n "$mac_addrs" ]; then
|
||||
for mac in $mac_addrs; do
|
||||
validate_mac_address "$mac" "1" || {
|
||||
IFS="$OLD_IFS"
|
||||
return 1
|
||||
}
|
||||
done
|
||||
fi
|
||||
|
||||
IFS="$OLD_IFS"
|
||||
|
||||
_log "Configuration validation passed"
|
||||
|
||||
# Clean up existing configuration
|
||||
cleanup_interfaces
|
||||
|
||||
# Split comma-separated values into arrays
|
||||
local names_arr=""
|
||||
local types_arr=""
|
||||
local ports_arr=""
|
||||
local macs_arr=""
|
||||
|
||||
# Save and set IFS for comma splitting
|
||||
local OLD_IFS="$IFS"
|
||||
IFS=','
|
||||
|
||||
for name in $interface_names; do
|
||||
names_arr="$names_arr $name"
|
||||
done
|
||||
|
||||
for type in $interface_types; do
|
||||
types_arr="$types_arr $type"
|
||||
done
|
||||
|
||||
for port_spec in $ports; do
|
||||
ports_arr="$ports_arr $port_spec"
|
||||
done
|
||||
|
||||
for mac in $mac_addrs; do
|
||||
macs_arr="$macs_arr $mac"
|
||||
done
|
||||
|
||||
# Restore IFS
|
||||
IFS="$OLD_IFS"
|
||||
|
||||
# Convert to arrays for indexing
|
||||
set -- $names_arr
|
||||
local total_interfaces=$#
|
||||
|
||||
_log "Total interfaces to create: $total_interfaces"
|
||||
|
||||
# Get WAN port for routed interfaces
|
||||
local wan_port=$(get_wan_port)
|
||||
WAN_PORT="$wan_port"
|
||||
_log "WAN port: $WAN_PORT"
|
||||
|
||||
# Create each interface
|
||||
local idx=1
|
||||
for if_name in $names_arr; do
|
||||
# Get corresponding type, ports, and MAC address
|
||||
local type_idx=$idx
|
||||
local ports_idx=$idx
|
||||
local mac_idx=$idx
|
||||
|
||||
set -- $types_arr
|
||||
shift $((type_idx - 1))
|
||||
local if_type="${1:-bridge:transparent}"
|
||||
|
||||
set -- $ports_arr
|
||||
shift $((ports_idx - 1))
|
||||
local port_list="${1:-ALL}"
|
||||
|
||||
set -- $macs_arr
|
||||
shift $((mac_idx - 1))
|
||||
local if_mac="${1:-}"
|
||||
|
||||
_log "Creating interface $idx/$total_interfaces: name=$if_name, type=$if_type, ports=$port_list, mac=$if_mac"
|
||||
|
||||
# Parse interface type
|
||||
parse_interface_type "$if_type"
|
||||
|
||||
local mode="$PARSE_MODE"
|
||||
local vlan_type="$PARSE_VLAN_TYPE"
|
||||
local cvid="$PARSE_CVID"
|
||||
local svid="$PARSE_SVID"
|
||||
local mac_addr="$PARSE_MAC_ADDR"
|
||||
local proto="$PARSE_PROTO"
|
||||
local disabled="$PARSE_DISABLED"
|
||||
local purpose="$PARSE_PURPOSE"
|
||||
|
||||
if [ "$purpose" = "iptv" ]; then
|
||||
IPTV_IFACES="$IPTV_IFACES $if_name"
|
||||
elif [ "$purpose" = "inet" ]; then
|
||||
INET_IFACES="$INET_IFACES $if_name"
|
||||
elif [ "$purpose" = "mgmt" ]; then
|
||||
MGMT_IFACES="$MGMT_IFACES $if_name"
|
||||
fi
|
||||
|
||||
if [ "$vlan_type" = "macvlan" ] && [ "$mac_count" -gt 0 ]; then
|
||||
MACVLAN_PRESENT=1
|
||||
fi
|
||||
|
||||
_log "Parsed: mode=$mode, vlan_type=$vlan_type, cvid=$cvid, svid=$svid, mac=$mac_addr, proto=$proto, purpose=$purpose"
|
||||
|
||||
case "$mode" in
|
||||
bridge)
|
||||
# Create bridge using helper function
|
||||
create_bridge "$if_name" "$if_type" "$port_list" "$if_mac"
|
||||
;;
|
||||
|
||||
brvlan)
|
||||
# Create bridge with VLAN filtering
|
||||
BRIDGE_VLAN_PRESENT=1
|
||||
create_bridge_vlan_filtering "$if_name" "$if_type" "$port_list" "$if_mac"
|
||||
;;
|
||||
|
||||
device-ref)
|
||||
# Create interface that references device from another interface
|
||||
# cvid contains the reference interface name
|
||||
local ref_if_name="$cvid"
|
||||
local ref_device=$(uci -q get "network.${ref_if_name}.device")
|
||||
|
||||
if [ -z "$ref_device" ]; then
|
||||
_log "ERROR: Reference interface '$ref_if_name' not found or has no device"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
_log "Creating interface $if_name referencing device $ref_device from interface $ref_if_name"
|
||||
|
||||
# Create interface using the same device as reference interface
|
||||
uci -q delete "network.${if_name}"
|
||||
uci -q set "network.${if_name}=interface"
|
||||
uci -q set "network.${if_name}.proto=${proto}"
|
||||
uci -q set "network.${if_name}.device=${ref_device}"
|
||||
|
||||
# Set MAC address if provided
|
||||
if [ -n "$if_mac" ]; then
|
||||
local resolved_mac=$(resolve_mac_address "$if_mac")
|
||||
uci -q set "network.${if_name}.macaddr=${resolved_mac}"
|
||||
_log "Setting MAC address: $if_mac -> $resolved_mac"
|
||||
fi
|
||||
|
||||
[ "$disabled" = "1" ] && uci -q set "network.${if_name}.disabled=1"
|
||||
;;
|
||||
|
||||
route)
|
||||
# Create routed interface
|
||||
port_list="${port_list//:u/}"
|
||||
local base_device=""
|
||||
if [ "$port_list" = "WAN" -o "$port_list" = "wan" ]; then
|
||||
base_device="$wan_port"
|
||||
else
|
||||
# Use first port from list
|
||||
local actual_ports=$(parse_port_list "$port_list")
|
||||
base_device=$(echo "$actual_ports" | awk '{print $1}')
|
||||
fi
|
||||
|
||||
create_routed_interface "$if_name" "$vlan_type" "$cvid" "$mac_addr" "$proto" "$base_device" "$disabled" "$purpose"
|
||||
;;
|
||||
|
||||
direct)
|
||||
# Create standalone VLAN interface
|
||||
port_list="${port_list//:u/}"
|
||||
local base_device=""
|
||||
if [ "$port_list" = "WAN" -o "$port_list" = "wan" ]; then
|
||||
base_device="$wan_port"
|
||||
else
|
||||
local actual_ports=$(parse_port_list "$port_list")
|
||||
base_device=$(echo "$actual_ports" | awk '{print $1}')
|
||||
fi
|
||||
|
||||
create_standalone_interface "$if_name" "$cvid" "$proto" "$base_device" "$disabled" "$if_mac"
|
||||
;;
|
||||
esac
|
||||
|
||||
idx=$((idx + 1))
|
||||
done
|
||||
|
||||
if [ "$BRIDGE_VLAN_PRESENT" -eq 1 ]; then
|
||||
# create the shared bridge once with all collected ports from bridge-vlan interfaces
|
||||
create_shared_bridge
|
||||
fi
|
||||
|
||||
# Commit network changes
|
||||
uci -q commit network
|
||||
|
||||
IPTV_IFACES="$(echo "$IPTV_IFACES" | xargs)"
|
||||
INET_IFACES="$(echo "$INET_IFACES" | xargs)"
|
||||
MGMT_IFACES="$(echo "$MGMT_IFACES" | xargs)"
|
||||
|
||||
_log "Interface configuration completed"
|
||||
}
|
||||
|
||||
#
|
||||
# Configure L3 Multicast (Proxy)
|
||||
#
|
||||
configure_l3_mcast() {
|
||||
_log "Configuring L3 multicast (Proxy) for $IPTV_DEVS"
|
||||
|
||||
# Remove proxy sections
|
||||
uci -q delete mcast.igmp_proxy_1
|
||||
uci -q delete mcast.mc_proxy_MLD
|
||||
uci -q delete mcast.igmp_snooping_1
|
||||
uci -q delete mcast.mld_snooping_1
|
||||
|
||||
IPTV_DEVS="$(echo "$IPTV_DEVS" | xargs | tr ' ' '\n' | sort -u)"
|
||||
|
||||
uci add mcast proxy
|
||||
uci rename mcast.@proxy[-1]="mc_proxy_MLD"
|
||||
uci set mcast.@proxy[-1].enable="1"
|
||||
uci set mcast.@proxy[-1].proto="mld"
|
||||
uci set mcast.@proxy[-1].version="2"
|
||||
uci set mcast.@proxy[-1].robustness="2"
|
||||
uci set mcast.@proxy[-1].query_interval="125"
|
||||
uci set mcast.@proxy[-1].query_response_interval="100"
|
||||
uci set mcast.@proxy[-1].last_member_query_interval="10"
|
||||
uci set mcast.@proxy[-1].fast_leave="1"
|
||||
uci set mcast.@proxy[-1].snooping_mode="2"
|
||||
uci add_list mcast.@proxy[-1].downstream_interface="br-lan"
|
||||
|
||||
IFS=" "
|
||||
for itf in $IPTV_DEVS; do
|
||||
uci add_list mcast.@proxy[-1].upstream_interface="$itf"
|
||||
done
|
||||
|
||||
|
||||
uci add mcast proxy
|
||||
uci rename mcast.@proxy[-1]="igmp_proxy_1"
|
||||
uci set mcast.@proxy[-1].enable="1"
|
||||
uci set mcast.@proxy[-1].proto="igmp"
|
||||
uci set mcast.@proxy[-1].version="2"
|
||||
uci set mcast.@proxy[-1].robustness="2"
|
||||
uci set mcast.@proxy[-1].query_interval="125"
|
||||
uci set mcast.@proxy[-1].query_response_interval="100"
|
||||
uci set mcast.@proxy[-1].last_member_query_interval="10"
|
||||
uci set mcast.@proxy[-1].fast_leave="1"
|
||||
uci set mcast.@proxy[-1].snooping_mode="2"
|
||||
uci add_list mcast.@proxy[-1].downstream_interface="br-lan"
|
||||
|
||||
IFS=" "
|
||||
for itf in $IPTV_DEVS; do
|
||||
uci add_list mcast.@proxy[-1].upstream_interface="$itf"
|
||||
done
|
||||
|
||||
uci add_list mcast.@proxy[-1].filter="239.0.0.0/8"
|
||||
|
||||
uci -q commit mcast
|
||||
|
||||
_log "L3 multicast configuration complete"
|
||||
}
|
||||
|
||||
#
|
||||
# Configure L2 Multicast (Snooping)
|
||||
#
|
||||
configure_l2_mcast() {
|
||||
_log "Configuring L2 multicast (snooping)"
|
||||
# Remove proxy sections
|
||||
uci -q delete mcast.igmp_proxy_1
|
||||
uci -q delete mcast.mc_proxy_MLD
|
||||
|
||||
# Get all bridge names from network UCI
|
||||
local bridge_list=""
|
||||
local bridge_names=""
|
||||
local br_device=""
|
||||
|
||||
# Query all network sections and filter for bridge type
|
||||
bridge_list=$(uci -q show network | grep "\.type='bridge'" | cut -d'.' -f2)
|
||||
|
||||
# Convert to space-separated list
|
||||
for bridge in $bridge_list; do
|
||||
br_device="$(uci -q get network.${bridge}.name)"
|
||||
if [ -z "$bridge_names" ]; then
|
||||
[ -n "$br_device" ] && bridge_names="$br_device"
|
||||
else
|
||||
[ -n "$br_device" ] && bridge_names="$bridge_names $br_device"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$bridge_names" ]; then
|
||||
_log "No bridges found for multicast configuration"
|
||||
return
|
||||
fi
|
||||
|
||||
_log "Found bridges: $bridge_names"
|
||||
|
||||
# Add IGMP snooping
|
||||
uci -q set mcast.igmp_snooping_1=snooping
|
||||
uci -q set mcast.igmp_snooping_1.enable='1'
|
||||
uci -q set mcast.igmp_snooping_1.proto='igmp'
|
||||
uci -q set mcast.igmp_snooping_1.version='2'
|
||||
uci -q set mcast.igmp_snooping_1.robustness='2'
|
||||
uci -q set mcast.igmp_snooping_1.query_interval='125'
|
||||
uci -q set mcast.igmp_snooping_1.query_response_interval='100'
|
||||
uci -q set mcast.igmp_snooping_1.last_member_query_interval='10'
|
||||
uci -q set mcast.igmp_snooping_1.fast_leave='1'
|
||||
uci -q set mcast.igmp_snooping_1.snooping_mode='2'
|
||||
uci -q set mcast.igmp_snooping_1.interface="$bridge_names"
|
||||
# to avoid multiple additions over the course of netmode reloads
|
||||
uci -q del_list mcast.igmp_snooping_1.filter='239.0.0.0/8'
|
||||
uci -q add_list mcast.igmp_snooping_1.filter='239.0.0.0/8'
|
||||
|
||||
# Add MLD snooping
|
||||
uci -q set mcast.mld_snooping_1=snooping
|
||||
uci -q set mcast.mld_snooping_1.enable='1'
|
||||
uci -q set mcast.mld_snooping_1.proto='mld'
|
||||
uci -q set mcast.mld_snooping_1.version='2'
|
||||
uci -q set mcast.mld_snooping_1.robustness='2'
|
||||
uci -q set mcast.mld_snooping_1.query_interval='125'
|
||||
uci -q set mcast.mld_snooping_1.query_response_interval='100'
|
||||
uci -q set mcast.mld_snooping_1.last_member_query_interval='10'
|
||||
uci -q set mcast.mld_snooping_1.fast_leave='1'
|
||||
uci -q set mcast.mld_snooping_1.snooping_mode='2'
|
||||
uci -q set mcast.mld_snooping_1.interface="$bridge_names"
|
||||
|
||||
uci -q commit mcast
|
||||
_log "L2 multicast configuration complete"
|
||||
}
|
||||
|
||||
#
|
||||
# Configure DHCP
|
||||
#
|
||||
configure_dhcp() {
|
||||
_log "Configuring DHCP"
|
||||
|
||||
# Check if we have any static interfaces (will be configured by post-hook)
|
||||
local interface_names="${NETMODE_interface_names:-wan}"
|
||||
local interface_types="${NETMODE_interface_types:-bridge:transparent}"
|
||||
local has_static_lan=0
|
||||
|
||||
local OLD_IFS="$IFS"
|
||||
IFS=','
|
||||
local idx=1
|
||||
for if_name in $interface_names; do
|
||||
# Get corresponding type
|
||||
local type_idx=$idx
|
||||
set -- $interface_types
|
||||
shift $((type_idx - 1))
|
||||
local if_type="${1:-bridge:transparent}"
|
||||
|
||||
# Check if this is lan interface with static proto
|
||||
if [ "$if_name" = "lan" ] && echo "$if_type" | grep -q -- '-static$'; then
|
||||
has_static_lan=1
|
||||
break
|
||||
fi
|
||||
|
||||
idx=$((idx + 1))
|
||||
done
|
||||
IFS="$OLD_IFS"
|
||||
|
||||
uci -q get network.lan && has_static_lan="1"
|
||||
|
||||
if [ "$has_static_lan" = "1" ]; then
|
||||
_log "LAN interface with static IP detected - DHCP server will be configured by post-hook"
|
||||
# Don't disable DHCP for LAN, it will be configured by 15-static_lan.sh
|
||||
# Only disable DHCP on WAN
|
||||
uci -q set dhcp.wan.ignore=1 2>/dev/null
|
||||
/etc/init.d/odhcpd enable
|
||||
else
|
||||
# Disable DHCP server on LAN (advanced mode without static LAN)
|
||||
uci -q set dhcp.lan.ignore=1
|
||||
# Disable DHCP on WAN if it exists
|
||||
uci -q set dhcp.wan.ignore=1 2>/dev/null
|
||||
/etc/init.d/odhcpd disable
|
||||
_log "DHCP server disabled"
|
||||
fi
|
||||
|
||||
local dhcp_ifaces="$(collect_interfaces_with_wan_port)"
|
||||
|
||||
_log "Disabling DHCP server on interfaces: $dhcp_ifaces"
|
||||
for iface in $dhcp_ifaces; do
|
||||
uci -q set dhcp.$iface=dhcp
|
||||
uci -q set dhcp.$iface.interface="$iface"
|
||||
uci -q set dhcp.$iface.ignore=1
|
||||
done
|
||||
|
||||
uci -q commit dhcp
|
||||
}
|
||||
|
||||
#
|
||||
# Configure Firewall
|
||||
#
|
||||
configure_firewall() {
|
||||
_log "Configuring firewall"
|
||||
|
||||
# Check if any interface is routed
|
||||
local interface_types="${NETMODE_interface_types:-bridge:transparent}"
|
||||
local has_routed=0
|
||||
|
||||
local OLD_IFS="$IFS"
|
||||
IFS=','
|
||||
for if_type in $interface_types; do
|
||||
if echo "$if_type" | grep -q "^route:"; then
|
||||
has_routed=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS="$OLD_IFS"
|
||||
|
||||
if [ "$has_routed" = "1" ]; then
|
||||
# Enable firewall for routed interfaces
|
||||
ensure_firewall_layout
|
||||
fi
|
||||
|
||||
uci -q set firewall.globals.enabled="1"
|
||||
uci -q commit firewall
|
||||
_log "Firewall enabled"
|
||||
}
|
||||
|
||||
#
|
||||
# Update Service Dependencies
|
||||
#
|
||||
configure_services() {
|
||||
_log "Updating service configurations"
|
||||
|
||||
# Get first interface name for services
|
||||
local interface_names="${NETMODE_interface_names:-wan}"
|
||||
local IFS=','
|
||||
local first_interface=""
|
||||
|
||||
for if_name in $interface_names; do
|
||||
first_interface="$if_name"
|
||||
break
|
||||
done
|
||||
|
||||
# Update CWMP Agent WAN Interface
|
||||
uci -q set cwmp.cpe.default_wan_interface="$first_interface"
|
||||
uci -q commit cwmp
|
||||
|
||||
# Update gateway WAN Interface
|
||||
uci -q set gateway.global.wan_interface="$first_interface"
|
||||
uci -q commit gateway
|
||||
|
||||
# Disable SSDPD
|
||||
uci -q set ssdpd.ssdp.enabled="0"
|
||||
uci -q commit ssdpd
|
||||
|
||||
_log "Service configurations updated"
|
||||
}
|
||||
|
||||
#
|
||||
# Main Execution
|
||||
#
|
||||
_log "========================================="
|
||||
_log "Starting Advanced Mode Configuration"
|
||||
_log "========================================="
|
||||
|
||||
# Main execution with error handling
|
||||
if ! configure_interfaces; then
|
||||
_log "========================================="
|
||||
_log "ERROR: Advanced Mode Configuration Failed"
|
||||
_log "Please check the logs above for details"
|
||||
_log "========================================="
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$MACVLAN_PRESENT" -eq 1 ] || echo "$NETMODE_interface_types" | grep -q "BaseMACAddress"; then
|
||||
_log "Macvlan interface with mac addr present, not generating default macoffset file"
|
||||
else
|
||||
_log "Macvlan interface with mac addr not present, generating default macoffset file"
|
||||
configure_macoffset
|
||||
fi
|
||||
|
||||
if [ -n "$IPTV_DEVS" ]; then
|
||||
configure_l3_mcast
|
||||
else
|
||||
configure_l2_mcast
|
||||
fi
|
||||
|
||||
configure_dhcp
|
||||
configure_firewall
|
||||
configure_services
|
||||
|
||||
_log "========================================="
|
||||
_log "Advanced Mode Configuration Complete"
|
||||
_log "========================================="
|
||||
|
||||
exit 0
|
||||
@@ -1,118 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
. /usr/share/libubox/jshn.sh
|
||||
|
||||
source "/etc/device_info"
|
||||
|
||||
l2_mcast_config() {
|
||||
# configure L2 mcast config for snooping
|
||||
logger -s -p user.info -t "netmode" "Generating L2 mcast configuration"
|
||||
|
||||
# remove proxy sections
|
||||
uci -q delete mcast.igmp_proxy_1
|
||||
uci -q delete mcast.mc_proxy_MLD
|
||||
|
||||
# add igmp_snooping section
|
||||
uci -q set mcast.igmp_snooping_1=snooping
|
||||
uci -q set mcast.igmp_snooping_1.enable='1'
|
||||
uci -q set mcast.igmp_snooping_1.proto='igmp'
|
||||
uci -q set mcast.igmp_snooping_1.version='2'
|
||||
uci -q set mcast.igmp_snooping_1.robustness='2'
|
||||
uci -q set mcast.igmp_snooping_1.query_interval='125'
|
||||
uci -q set mcast.igmp_snooping_1.query_response_interval='100'
|
||||
uci -q set mcast.igmp_snooping_1.last_member_query_interval='10'
|
||||
uci -q set mcast.igmp_snooping_1.fast_leave='1'
|
||||
uci -q set mcast.igmp_snooping_1.snooping_mode='2'
|
||||
uci -q set mcast.igmp_snooping_1.interface='br-lan'
|
||||
uci -q add_list mcast.igmp_snooping_1.filter='239.0.0.0/8'
|
||||
|
||||
# add mld_snooping section
|
||||
uci -q set mcast.mld_snooping_1=snooping
|
||||
uci -q set mcast.mld_snooping_1.enable='1'
|
||||
uci -q set mcast.mld_snooping_1.proto='mld'
|
||||
uci -q set mcast.mld_snooping_1.version='2'
|
||||
uci -q set mcast.mld_snooping_1.robustness='2'
|
||||
uci -q set mcast.mld_snooping_1.query_interval='125'
|
||||
uci -q set mcast.mld_snooping_1.query_response_interval='100'
|
||||
uci -q set mcast.mld_snooping_1.last_member_query_interval='10'
|
||||
uci -q set mcast.mld_snooping_1.fast_leave='1'
|
||||
uci -q set mcast.mld_snooping_1.snooping_mode='2'
|
||||
uci -q set mcast.mld_snooping_1.interface='br-lan'
|
||||
|
||||
uci -q commit mcast
|
||||
}
|
||||
|
||||
l2_network_config() {
|
||||
logger -s -p user.info -t "netmode" "Generating L2 network configuration"
|
||||
|
||||
# Configure L2 Network Mode
|
||||
uci -q set network.lan=interface
|
||||
uci -q set network.lan.proto='dhcp'
|
||||
uci -q set network.lan.vendorid="$(uci -q get network.wan.vendorid)"
|
||||
uci -q set network.lan.clientid="$(uci -q get network.wan.clientid)"
|
||||
uci -q set network.lan.reqopts="$(uci -q get network.wan.reqopts)"
|
||||
uci -q set network.lan.sendopts="$(uci -q get network.wan.sendopts)"
|
||||
uci -q set network.lan.device='br-lan'
|
||||
uci -q set network.lan.force_link='1'
|
||||
|
||||
uci -q set network.lan6=interface
|
||||
uci -q set network.lan6.proto='dhcpv6'
|
||||
uci -q set network.lan6.device='@lan'
|
||||
uci -q set network.lan6.reqprefix='no'
|
||||
|
||||
uci -q delete network.wan
|
||||
uci -q delete network.wan6
|
||||
|
||||
uci -q delete network.br_lan.ports
|
||||
uci -q set network.br_lan.bridge_empty='1'
|
||||
|
||||
add_port_to_br_lan() {
|
||||
port="$1"
|
||||
[ -n "$port" -a -d /sys/class/net/$port ] || continue
|
||||
uci add_list network.br_lan.ports="$port"
|
||||
}
|
||||
|
||||
if [ -f /etc/board.json ]; then
|
||||
json_load_file /etc/board.json
|
||||
json_select network
|
||||
json_select lan
|
||||
if json_is_a ports array; then
|
||||
json_for_each_item add_port_to_br_lan ports
|
||||
else
|
||||
json_get_var device device
|
||||
[ -n "$device" ] && uci add_list network.br_lan.ports="$device"
|
||||
fi
|
||||
json_select ..
|
||||
json_select wan 2>/dev/null
|
||||
json_get_var device device
|
||||
[ -n "$device" ] && uci add_list network.br_lan.ports="$device"
|
||||
json_cleanup
|
||||
fi
|
||||
|
||||
uci -q commit network
|
||||
|
||||
# Disable DHCP Server
|
||||
uci -q set dhcp.lan.ignore=1
|
||||
uci -q commit dhcp
|
||||
/etc/init.d/odhcpd disable
|
||||
|
||||
# Disable SSDPD
|
||||
uci -q set ssdpd.ssdp.enabled="0"
|
||||
uci -q commit ssdpd
|
||||
|
||||
# Update CWMP Agent WAN Interface
|
||||
uci -q set cwmp.cpe.default_wan_interface="lan"
|
||||
uci -q commit cwmp
|
||||
|
||||
# Update gateway WAN Interface
|
||||
uci -q set gateway.global.wan_interface="lan"
|
||||
uci -q commit gateway
|
||||
|
||||
# disable firewall
|
||||
uci -q set firewall.globals.enabled="0"
|
||||
uci -q commit firewall
|
||||
}
|
||||
|
||||
l2_network_config
|
||||
l2_mcast_config
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
. /lib/functions.sh
|
||||
. /usr/share/libubox/jshn.sh
|
||||
. /lib/netmode/advanced_helper.sh
|
||||
|
||||
source "/etc/device_info"
|
||||
|
||||
@@ -15,8 +16,12 @@ l3_mcast_config() {
|
||||
}
|
||||
|
||||
l3_network_config() {
|
||||
cleanup_interfaces
|
||||
|
||||
logger -s -p user.info -t "netmode" "Generating L3 network configuration"
|
||||
|
||||
configure_macoffset
|
||||
|
||||
wandev="$(uci -q get network.WAN.ifname)"
|
||||
|
||||
# Configure L3 Network Mode
|
||||
@@ -76,28 +81,7 @@ l3_network_config() {
|
||||
done
|
||||
fi
|
||||
|
||||
uci -q delete network.br_lan.ports
|
||||
uci -q set network.br_lan.bridge_empty='1'
|
||||
|
||||
add_port_to_br_lan() {
|
||||
port="$1"
|
||||
[ -n "$port" -a -d /sys/class/net/$port ] || continue
|
||||
uci add_list network.br_lan.ports="$port"
|
||||
}
|
||||
|
||||
if [ -f /etc/board.json ]; then
|
||||
json_load_file /etc/board.json
|
||||
json_select network
|
||||
json_select lan
|
||||
if json_is_a ports array; then
|
||||
json_for_each_item add_port_to_br_lan ports
|
||||
else
|
||||
json_get_var device device
|
||||
[ -n "$device" ] && uci add_list network.br_lan.ports="$device"
|
||||
fi
|
||||
json_select ..
|
||||
json_cleanup
|
||||
fi
|
||||
create_br_lan_bridge_device
|
||||
|
||||
uci -q commit network
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
. /lib/functions.sh
|
||||
. /usr/share/libubox/jshn.sh
|
||||
. /lib/netmode/advanced_helper.sh
|
||||
|
||||
source "/etc/device_info"
|
||||
|
||||
@@ -15,8 +16,12 @@ l3_mcast_config() {
|
||||
}
|
||||
|
||||
l3_network_pppoe_config() {
|
||||
cleanup_interfaces
|
||||
|
||||
logger -s -p user.info -t "netmode" "Generating L3 network configuration"
|
||||
|
||||
configure_macoffset
|
||||
|
||||
wandev="$(uci -q get network.WAN.ifname)"
|
||||
|
||||
# Configure L3 Network Mode
|
||||
@@ -73,28 +78,7 @@ l3_network_pppoe_config() {
|
||||
done
|
||||
fi
|
||||
|
||||
uci -q delete network.br_lan.ports
|
||||
uci -q set network.br_lan.bridge_empty='1'
|
||||
|
||||
add_port_to_br_lan() {
|
||||
port="$1"
|
||||
[ -n "$port" -a -d /sys/class/net/$port ] || continue
|
||||
uci add_list network.br_lan.ports="$port"
|
||||
}
|
||||
|
||||
if [ -f /etc/board.json ]; then
|
||||
json_load_file /etc/board.json
|
||||
json_select network
|
||||
json_select lan
|
||||
if json_is_a ports array; then
|
||||
json_for_each_item add_port_to_br_lan ports
|
||||
else
|
||||
json_get_var device device
|
||||
[ -n "$device" ] && uci add_list network.br_lan.ports="$device"
|
||||
fi
|
||||
json_select ..
|
||||
json_cleanup
|
||||
fi
|
||||
create_br_lan_bridge_device
|
||||
|
||||
uci -q commit network
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
. /lib/functions.sh
|
||||
. /usr/share/libubox/jshn.sh
|
||||
. /lib/netmode/advanced_helper.sh
|
||||
|
||||
source "/etc/device_info"
|
||||
|
||||
@@ -15,8 +16,12 @@ l3_mcast_config() {
|
||||
}
|
||||
|
||||
l3_network_config() {
|
||||
cleanup_interfaces
|
||||
|
||||
logger -s -p user.info -t "netmode" "Generating L3 network configuration"
|
||||
|
||||
configure_macoffset
|
||||
|
||||
wandev="$(uci -q get network.WAN.ifname)"
|
||||
|
||||
# Configure L3 Network Mode
|
||||
@@ -74,28 +79,7 @@ l3_network_config() {
|
||||
done
|
||||
fi
|
||||
|
||||
uci -q delete network.br_lan.ports
|
||||
uci -q set network.br_lan.bridge_empty='1'
|
||||
|
||||
add_port_to_br_lan() {
|
||||
port="$1"
|
||||
[ -n "$port" -a -d /sys/class/net/$port ] || continue
|
||||
uci add_list network.br_lan.ports="$port"
|
||||
}
|
||||
|
||||
if [ -f /etc/board.json ]; then
|
||||
json_load_file /etc/board.json
|
||||
json_select network
|
||||
json_select lan
|
||||
if json_is_a ports array; then
|
||||
json_for_each_item add_port_to_br_lan ports
|
||||
else
|
||||
json_get_var device device
|
||||
[ -n "$device" ] && uci add_list network.br_lan.ports="$device"
|
||||
fi
|
||||
json_select ..
|
||||
json_cleanup
|
||||
fi
|
||||
create_br_lan_bridge_device
|
||||
|
||||
uci -q commit network
|
||||
|
||||
|
||||
@@ -95,6 +95,40 @@
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "advanced",
|
||||
"description": "Advanced Mode - Unified configuration for bridges, routed interfaces, and standalone VLANs",
|
||||
"supported_args": [
|
||||
{
|
||||
"name": "interface_names",
|
||||
"description": "Interface names (comma-separated, e.g., wan,iptv,mgmt,lan100)",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"#value": "wan"
|
||||
},
|
||||
{
|
||||
"name": "interface_types",
|
||||
"description": "Interface types (comma-separated). Bridge: bridge:transparent, bridge:tagged:VID, bridge:wan-tagged:VID, bridge:qinq:C:S. Routed: route:vlan:VID, route:macvlan:MAC, route:vlan:VID:MAC. Standalone: direct:VID. Modifiers: -n (proto none), -d (disabled)",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"#value": "bridge:transparent"
|
||||
},
|
||||
{
|
||||
"name": "ports",
|
||||
"description": "Port lists for each interface (comma-separated, use '-' to separate ports, e.g., ALL, ALL_LAN, LAN1-LAN2-WAN, WAN)",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"#value": "ALL"
|
||||
},
|
||||
{
|
||||
"name": "macaddrs",
|
||||
"description": "MAC addresses for each interface (comma-separated). Use explicit MAC (AA:BB:CC:DD:EE:FF) or macros: BaseMACAddress, BaseMACAddressP1, BaseMACAddressP2, etc.",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"#value": "BaseMACAddress,BaseMACAddressP1,BaseMACAddressP2"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
1584
netmode/files/lib/netmode/advanced_helper.sh
Normal file
1584
netmode/files/lib/netmode/advanced_helper.sh
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user