[doc] egress works with table on NetFPGA
This commit is contained in:
parent
77d1f770c2
commit
bcc039cb31
|
@ -4,3 +4,10 @@ Description of the theory/software/hardware that you designed.
|
||||||
% the architecture
|
% the architecture
|
||||||
|
|
||||||
Maybe figures here? controller,
|
Maybe figures here? controller,
|
||||||
|
|
||||||
|
\section{\label{Design:NetPFGA}NetFPGA}
|
||||||
|
|
||||||
|
Netpfga live,
|
||||||
|
Vivado
|
||||||
|
SDNET
|
||||||
|
xx k lines of supporting code
|
||||||
|
|
|
@ -18,11 +18,27 @@ test framework openvswitch
|
||||||
|
|
||||||
|
|
||||||
\section{\label{Results:NetPFGA}NetFPGA}
|
\section{\label{Results:NetPFGA}NetFPGA}
|
||||||
\subsection{\label{Results:NetPFGA:challenges}Challenges}
|
General result: limited NAT64 is working, however
|
||||||
|
|
||||||
|
\subsection{\label{Results:NetPFGA:challenge-checksum}No Payload checksumming}
|
||||||
|
\subsection{\label{Results:NetPFGA:challenges}Other Challenges}
|
||||||
Many workarounds
|
Many workarounds
|
||||||
|
|
||||||
Table size 63, table size 64,
|
Table size 63, table size 64,
|
||||||
|
|
||||||
|
Table entries require arguments of all possible actions, not only used
|
||||||
|
one.
|
||||||
|
|
||||||
|
Compile time hours
|
||||||
|
|
||||||
|
Silent errors
|
||||||
|
|
||||||
|
Unclear errors: broken board
|
||||||
|
|
||||||
|
Due to the very fragile nature of the build framework from the
|
||||||
|
NetFPGA-Live repository,
|
||||||
|
|
||||||
|
Reproducibility:
|
||||||
|
|
||||||
\section{\label{Results:P4}P4}
|
\section{\label{Results:P4}P4}
|
||||||
|
|
||||||
|
|
107
doc/appendix.tex
107
doc/appendix.tex
|
@ -1,5 +1,6 @@
|
||||||
\chapter{\label{appendixA}Test descriptions}
|
\chapter{\label{appendixA}Test descriptions}
|
||||||
|
\section{\label{chapterA:netpfga-setup}NetFPGA Setup}
|
||||||
|
Description of installation, commit of netpfga-live
|
||||||
|
|
||||||
\section{\label{chapterA:section1}NetFPGA NAT64 Test cases}
|
\section{\label{chapterA:section1}NetFPGA NAT64 Test cases}
|
||||||
todo: add graphic of nsg <-> esprimo cabling
|
todo: add graphic of nsg <-> esprimo cabling
|
||||||
|
@ -13,7 +14,24 @@ ip neigh add 10.0.0.42 lladdr f8:f2:1e:09:62:d1 dev enp2s0f0
|
||||||
|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
\subsection{Test 1: do IPv4 egress settings work}
|
For all test cases the following network settings on esprimo:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
12: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
|
||||||
|
link/ether f8:f2:1e:09:62:d0 brd ff:ff:ff:ff:ff:ff
|
||||||
|
inet 10.0.0.42/24 scope global enp2s0f0
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
inet6 fe80::faf2:1eff:fe09:62d0/64 scope link
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
13: enp2s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
|
||||||
|
link/ether f8:f2:1e:09:62:d1 brd ff:ff:ff:ff:ff:ff
|
||||||
|
inet6 2001:db8:42::42/64 scope global
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
inet6 fe80::faf2:1eff:fe09:62d1/64 scope link
|
||||||
|
valid_lft forever preferred_lft forever
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\subsection{Test 1: IPv4 egress settings work}
|
||||||
Scenario: simple egress port setting
|
Scenario: simple egress port setting
|
||||||
|
|
||||||
Step 1: getting correct values for table entries from python:
|
Step 1: getting correct values for table entries from python:
|
||||||
|
@ -74,7 +92,7 @@ root@ESPRIMO-P956:~# ip neigh add 10.0.0.4 lladdr f8:f2:1e:09:62:d1 dev enp2s0f0
|
||||||
Step 3: generating test packets, expecting 4 packets to show up on
|
Step 3: generating test packets, expecting 4 packets to show up on
|
||||||
enp2s0f0:
|
enp2s0f0:
|
||||||
|
|
||||||
\begin{tiny}
|
%\tvb
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
nico@ESPRIMO-P956:~$ sudo tcpdump -ni enp2s0f0
|
nico@ESPRIMO-P956:~$ sudo tcpdump -ni enp2s0f0
|
||||||
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
|
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
|
||||||
|
@ -84,11 +102,92 @@ listening on enp2s0f0, link-type EN10MB (Ethernet), capture size 262144 bytes
|
||||||
10:49:29.222340 IP 10.0.0.42 > 10.0.0.4: ICMP echo request, id 4440, seq 2, length 64
|
10:49:29.222340 IP 10.0.0.42 > 10.0.0.4: ICMP echo request, id 4440, seq 2, length 64
|
||||||
10:49:29.222418 IP 10.0.0.42 > 10.0.0.4: ICMP echo request, id 4440, seq 2, length 64
|
10:49:29.222418 IP 10.0.0.42 > 10.0.0.4: ICMP echo request, id 4440, seq 2, length 64
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
\end{tiny}
|
%\tve
|
||||||
|
|
||||||
Result: sucess
|
Result: sucess
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Test 2: IPv6 egress}
|
||||||
|
Similar to the IPv4 setting before, just for IPv6.
|
||||||
|
|
||||||
|
Step 1: getting IP address values
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
>>> int(ipaddress.IPv6Address(u"2001:db8:42::4"))
|
||||||
|
42540766411362381960998550477184434180L
|
||||||
|
>>> int(ipaddress.IPv6Address(u"2001:db8:42::6"))
|
||||||
|
42540766411362381960998550477184434182L
|
||||||
|
>>> int(ipaddress.IPv6Address(u"2001:db8:42::42"))
|
||||||
|
42540766411362381960998550477184434242L
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Step 2: setting table entries
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
>> table_cam_add_entry realmain_v6_networks_0 realmain.set_egress_port 42540766411362381960998550477184434182 => 64 0 0 0 0
|
||||||
|
fields = [(u'hit', 1), (u'action_run', 3), (u'out_port', 8), (u'out_port', 8), (u'mac_addr', 48), (u'task', 16), (u'table_id', 16)]
|
||||||
|
action_name = TopPipe.realmain.set_egress_port
|
||||||
|
field_vals = [1, '64', '0', '0', '0', '0']
|
||||||
|
CAM_Init_ValidateContext() - done
|
||||||
|
WROTE 0x44020350 = 0x0006
|
||||||
|
WROTE 0x44020354 = 0x0000
|
||||||
|
WROTE 0x44020358 = 0x420000
|
||||||
|
WROTE 0x4402035c = 0x20010db8
|
||||||
|
WROTE 0x44020380 = 0x0000
|
||||||
|
WROTE 0x44020384 = 0x0000
|
||||||
|
WROTE 0x44020388 = 0x40000000
|
||||||
|
WROTE 0x4402038c = 0x0001
|
||||||
|
READ 0x44020344 = 0x0001
|
||||||
|
WROTE 0x44020340 = 0x0001
|
||||||
|
READ 0x44020344 = 0x0001
|
||||||
|
READ 0x44020344 = 0x0001
|
||||||
|
success
|
||||||
|
>> table_cam_add_entry realmain_v6_networks_0 realmain.set_egress_port 42540766411362381960998550477184434242 => 64 0 0 0 0
|
||||||
|
fields = [(u'hit', 1), (u'action_run', 3), (u'out_port', 8), (u'out_port', 8), (u'mac_addr', 48), (u'task', 16), (u'table_id', 16)]
|
||||||
|
action_name = TopPipe.realmain.set_egress_port
|
||||||
|
field_vals = [1, '64', '0', '0', '0', '0']
|
||||||
|
CAM_Init_ValidateContext() - done
|
||||||
|
WROTE 0x44020350 = 0x0042
|
||||||
|
WROTE 0x44020354 = 0x0000
|
||||||
|
WROTE 0x44020358 = 0x420000
|
||||||
|
WROTE 0x4402035c = 0x20010db8
|
||||||
|
WROTE 0x44020380 = 0x0000
|
||||||
|
WROTE 0x44020384 = 0x0000
|
||||||
|
WROTE 0x44020388 = 0x40000000
|
||||||
|
WROTE 0x4402038c = 0x0001
|
||||||
|
READ 0x44020344 = 0x0001
|
||||||
|
WROTE 0x44020340 = 0x0001
|
||||||
|
READ 0x44020344 = 0x0001
|
||||||
|
READ 0x44020344 = 0x0001
|
||||||
|
success
|
||||||
|
>>
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Step 3: setting neighbor entries
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
nico@ESPRIMO-P956:~$ sudo ip -6 neigh add 2001:db8:42::6 lladdr f8:f2:1e:09:62:d0 dev enp2s0f1
|
||||||
|
nico@ESPRIMO-P956:~$ sudo ip -6 neigh add 2001:db8:42::4 lladdr f8:f2:1e:09:62:d0 dev enp2s0f1
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Step 4: generating test packets
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
nico@ESPRIMO-P956:~$ ping6 -c2 2001:db8:42::6
|
||||||
|
PING 2001:db8:42::6(2001:db8:42::6) 56 data bytes
|
||||||
|
|
||||||
|
|
||||||
|
nico@ESPRIMO-P956:~$ sudo tcpdump -ni enp2s0f1
|
||||||
|
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
|
||||||
|
listening on enp2s0f1, link-type EN10MB (Ethernet), capture size 262144 bytes
|
||||||
|
11:30:17.287577 IP6 2001:db8:42::42 > 2001:db8:42::6: ICMP6, echo request, seq 1, length 64
|
||||||
|
11:30:17.287599 IP6 2001:db8:42::42 > 2001:db8:42::6: ICMP6, echo request, seq 1, length 64
|
||||||
|
11:30:18.310178 IP6 2001:db8:42::42 > 2001:db8:42::6: ICMP6, echo request, seq 2, length 64
|
||||||
|
11:30:18.310258 IP6 2001:db8:42::42 > 2001:db8:42::6: ICMP6, echo request, seq 2, length 64
|
||||||
|
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Result: success, packet is seen twice.
|
||||||
|
|
||||||
\chapter{\label{appendixB}Appendix B?}
|
\chapter{\label{appendixB}Appendix B?}
|
||||||
|
|
||||||
|
|
61
doc/plan.org
61
doc/plan.org
|
@ -7267,7 +7267,7 @@ success
|
||||||
*** DONE 2019-07-28: ping6 test for getting packet: failure
|
*** DONE 2019-07-28: ping6 test for getting packet: failure
|
||||||
CLOSED: [2019-07-28 Sun 12:43]
|
CLOSED: [2019-07-28 Sun 12:43]
|
||||||
|
|
||||||
*** TODO 2019-07-28: !!!!!!! NETPFGA PORT MAPPINGS
|
*** TODO 2019-07-28: *NETPFGA PORT MAPPINGS*
|
||||||
nf_port_map = {
|
nf_port_map = {
|
||||||
"nf0":0b00000001,
|
"nf0":0b00000001,
|
||||||
"nf1":0b00000100,
|
"nf1":0b00000100,
|
||||||
|
@ -7283,8 +7283,6 @@ nf_port_map = {
|
||||||
| port 1 | 0b00000100 | 4 | |
|
| port 1 | 0b00000100 | 4 | |
|
||||||
| port 2 | 0b00010000 | 16 | esprimo enp2s0f0 |
|
| port 2 | 0b00010000 | 16 | esprimo enp2s0f0 |
|
||||||
| port 3 | 0b01000000 | 64 | esprimo enp2s0f1 |
|
| port 3 | 0b01000000 | 64 | esprimo enp2s0f1 |
|
||||||
| | | | |
|
|
||||||
|
|
||||||
*** DONE 2019-07-28: testing with port = 64 (first or last in theory): LAST! WORKS!
|
*** DONE 2019-07-28: testing with port = 64 (first or last in theory): LAST! WORKS!
|
||||||
CLOSED: [2019-07-28 Sun 13:19]
|
CLOSED: [2019-07-28 Sun 13:19]
|
||||||
#+BEGIN_CENTER
|
#+BEGIN_CENTER
|
||||||
|
@ -8064,7 +8062,8 @@ listening on enp2s0f1, link-type EN10MB (Ethernet), capture size 262144 bytes
|
||||||
- eth1 on nsg: seeing ipv4 and ipv6
|
- eth1 on nsg: seeing ipv4 and ipv6
|
||||||
- eth1 on nsg: seeing icmp (ipv4)
|
- eth1 on nsg: seeing icmp (ipv4)
|
||||||
- enp2s0f0 SEES icmp6!
|
- enp2s0f0 SEES icmp6!
|
||||||
*** TODO 2019-07-29: test table entries for moving to different port
|
*** DONE 2019-07-29: test table entries for moving to different port
|
||||||
|
CLOSED: [2019-07-31 Wed 10:04]
|
||||||
#+BEGIN_CENTER
|
#+BEGIN_CENTER
|
||||||
>> table_cam_add_entry realmain_dummy_table_for_netpfga_0 realmain.set_egress_port 34525 => 64
|
>> table_cam_add_entry realmain_dummy_table_for_netpfga_0 realmain.set_egress_port 34525 => 64
|
||||||
fields = [(u'hit', 1), (u'action_run', 2), (u'out_port', 8)]
|
fields = [(u'hit', 1), (u'action_run', 2), (u'out_port', 8)]
|
||||||
|
@ -8092,6 +8091,60 @@ It works!!!!!
|
||||||
|
|
||||||
*** DONE 2019-07-29: documentation: `portland.sty' not found: removed include
|
*** DONE 2019-07-29: documentation: `portland.sty' not found: removed include
|
||||||
CLOSED: [2019-07-29 Mon 20:27]
|
CLOSED: [2019-07-29 Mon 20:27]
|
||||||
|
*** TODO 2019-07-31: Test final NAT64 code: v6 egress
|
||||||
|
#+BEGIN_CENTER
|
||||||
|
>>> int(ipaddress.IPv6Address(u"2001:db8:42::70b4"))
|
||||||
|
42540766411362381960998550477184463028L
|
||||||
|
|
||||||
|
>>> int(ipaddress.IPv6Address(u"2001:db8:42::6"))
|
||||||
|
42540766411362381960998550477184434182L
|
||||||
|
|
||||||
|
>>> int(ipaddress.IPv4Address(u"10.0.0.42"))
|
||||||
|
167772202
|
||||||
|
|
||||||
|
>>> int(ipaddress.IPv4Address(u"10.0.0.42"))
|
||||||
|
167772202
|
||||||
|
|
||||||
|
>> table_cam_add_entry realmain_v4_networks_0 realmain.set_egress_port 167772202 => 16 0 0 0 0
|
||||||
|
fields = [(u'hit', 1), (u'action_run', 3), (u'out_port', 8), (u'out_port', 8), (u'mac_addr', 48), (u'task', 16), (u'table_id', 16)]
|
||||||
|
action_name = TopPipe.realmain.set_egress_port
|
||||||
|
field_vals = [1, '16', '0', '0', '0', '0']
|
||||||
|
CAM_Init_ValidateContext() - done
|
||||||
|
WROTE 0x44020250 = 0xa00002a
|
||||||
|
WROTE 0x44020280 = 0x0000
|
||||||
|
WROTE 0x44020284 = 0x0000
|
||||||
|
WROTE 0x44020288 = 0x10000000
|
||||||
|
WROTE 0x4402028c = 0x0001
|
||||||
|
READ 0x44020244 = 0x0001
|
||||||
|
WROTE 0x44020240 = 0x0001
|
||||||
|
READ 0x44020244 = 0x0001
|
||||||
|
READ 0x44020244 = 0x0001
|
||||||
|
success
|
||||||
|
>>
|
||||||
|
|
||||||
|
>>> int(ipaddress.IPv4Address(u"10.0.0.4"))
|
||||||
|
167772164
|
||||||
|
>> table_cam_add_entry realmain_v4_networks_0 realmain.set_egress_port 167772164 => 16 0 0 0 0
|
||||||
|
fields = [(u'hit', 1), (u'action_run', 3), (u'out_port', 8), (u'out_port', 8), (u'mac_addr', 48), (u'task', 16), (u'table_id', 16)]
|
||||||
|
action_name = TopPipe.realmain.set_egress_port
|
||||||
|
field_vals = [1, '16', '0', '0', '0', '0']
|
||||||
|
CAM_Init_ValidateContext() - done
|
||||||
|
WROTE 0x44020250 = 0xa000004
|
||||||
|
WROTE 0x44020280 = 0x0000
|
||||||
|
WROTE 0x44020284 = 0x0000
|
||||||
|
WROTE 0x44020288 = 0x10000000
|
||||||
|
WROTE 0x4402028c = 0x0001
|
||||||
|
READ 0x44020244 = 0x0001
|
||||||
|
WROTE 0x44020240 = 0x0001
|
||||||
|
READ 0x44020244 = 0x0001
|
||||||
|
READ 0x44020244 = 0x0001
|
||||||
|
success
|
||||||
|
>>
|
||||||
|
|
||||||
|
|
||||||
|
#+END_CENTER
|
||||||
|
*** 2019-07-31: reading about \verb vs. \texttt
|
||||||
|
- probably want \verb, but cannot use in \newcommand
|
||||||
** The NetPFGA saga
|
** The NetPFGA saga
|
||||||
Problems encountered:
|
Problems encountered:
|
||||||
- The logfile for a compile run is 10k+ lines
|
- The logfile for a compile run is 10k+ lines
|
||||||
|
|
|
@ -74,7 +74,6 @@ control RealMain(
|
||||||
|
|
||||||
#include "netpfga_nat64.p4"
|
#include "netpfga_nat64.p4"
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,61 +2,61 @@ bool apply_v6networks = false;
|
||||||
bool apply_v4networks = false;
|
bool apply_v4networks = false;
|
||||||
|
|
||||||
if(hdr.ipv6.isValid()) {
|
if(hdr.ipv6.isValid()) {
|
||||||
apply_v6networks = true;
|
apply_v6networks = true;
|
||||||
|
|
||||||
if(nat64.apply().hit) { /* generic / static nat64 done */
|
if(nat64.apply().hit) { /* generic / static nat64 done */
|
||||||
if(hdr.icmp6.isValid()) {
|
if(hdr.icmp6.isValid()) {
|
||||||
nat64_icmp6_generic();
|
nat64_icmp6_generic();
|
||||||
|
|
||||||
if(hdr.icmp6.type == ICMP6_ECHO_REPLY) {
|
if(hdr.icmp6.type == ICMP6_ECHO_REPLY) {
|
||||||
hdr.icmp.type = ICMP_ECHO_REPLY;
|
hdr.icmp.type = ICMP_ECHO_REPLY;
|
||||||
hdr.icmp.code = 0;
|
hdr.icmp.code = 0;
|
||||||
}
|
|
||||||
if(hdr.icmp6.type == ICMP6_ECHO_REQUEST) {
|
|
||||||
hdr.icmp.type = ICMP_ECHO_REQUEST;
|
|
||||||
hdr.icmp.code = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(hdr.udp.isValid()) {
|
|
||||||
delta_udp_from_v6_to_v4
|
|
||||||
}
|
|
||||||
|
|
||||||
if(hdr.tcp.isValid()) {
|
|
||||||
delta_tcp_from_v6_to_v4
|
|
||||||
}
|
|
||||||
apply_v4networks = false;
|
|
||||||
apply_v6networks = true;
|
|
||||||
}
|
}
|
||||||
} else if(hdr.ipv4.isValid()) {
|
if(hdr.icmp6.type == ICMP6_ECHO_REQUEST) {
|
||||||
apply_v4networks = true;
|
hdr.icmp.type = ICMP_ECHO_REQUEST;
|
||||||
|
hdr.icmp.code = 0;
|
||||||
if(nat46.apply().hit) {
|
|
||||||
if(hdr.icmp.isValid()) {
|
|
||||||
nat46_icmp_generic();
|
|
||||||
|
|
||||||
if(hdr.icmp.type == ICMP_ECHO_REPLY) {
|
|
||||||
hdr.icmp6.type = ICMP6_ECHO_REPLY;
|
|
||||||
}
|
|
||||||
if(hdr.icmp.type == ICMP_ECHO_REQUEST) {
|
|
||||||
hdr.icmp6.type = ICMP6_ECHO_REQUEST;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(hdr.udp.isValid()) {
|
|
||||||
delta_udp_from_v4_to_v6
|
|
||||||
}
|
|
||||||
if(hdr.tcp.isValid()) {
|
|
||||||
delta_tcp_from_v4_to_v6
|
|
||||||
}
|
|
||||||
apply_v4networks = true;
|
|
||||||
apply_v6networks = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(apply_v4networks == true) {
|
if(hdr.udp.isValid()) {
|
||||||
v4_networks.apply();
|
delta_udp_from_v6_to_v4
|
||||||
}
|
}
|
||||||
|
|
||||||
if(apply_v6networks == true) {
|
if(hdr.tcp.isValid()) {
|
||||||
v6_networks.apply();
|
delta_tcp_from_v6_to_v4
|
||||||
}
|
}
|
||||||
|
apply_v4networks = false;
|
||||||
|
apply_v6networks = true;
|
||||||
|
}
|
||||||
|
} else if(hdr.ipv4.isValid()) {
|
||||||
|
apply_v4networks = true;
|
||||||
|
|
||||||
|
if(nat46.apply().hit) {
|
||||||
|
if(hdr.icmp.isValid()) {
|
||||||
|
nat46_icmp_generic();
|
||||||
|
|
||||||
|
if(hdr.icmp.type == ICMP_ECHO_REPLY) {
|
||||||
|
hdr.icmp6.type = ICMP6_ECHO_REPLY;
|
||||||
|
}
|
||||||
|
if(hdr.icmp.type == ICMP_ECHO_REQUEST) {
|
||||||
|
hdr.icmp6.type = ICMP6_ECHO_REQUEST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(hdr.udp.isValid()) {
|
||||||
|
delta_udp_from_v4_to_v6
|
||||||
|
}
|
||||||
|
if(hdr.tcp.isValid()) {
|
||||||
|
delta_tcp_from_v4_to_v6
|
||||||
|
}
|
||||||
|
apply_v4networks = true;
|
||||||
|
apply_v6networks = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(apply_v4networks == true) {
|
||||||
|
v4_networks.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(apply_v6networks == true) {
|
||||||
|
v6_networks.apply();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue