################################################################################ #
log_test()
{
local rc=$1
local expected=$2
local msg="$3"
if [ ${rc} -eq ${expected} ]; then
printf "TEST: %-60s [ OK ]\n""${msg}"
nsuccess=$((nsuccess+1)) else
ret=1
nfail=$((nfail+1))
printf "TEST: %-60s [FAIL]\n""${msg}" if [ "${PAUSE_ON_FAIL}" = "yes" ]; then echo echo"hit enter to continue, 'q' to quit"
read a
[ "$a" = "q" ] && exit 1 fi fi
}
run_cmd_host1()
{
local cmd="$*"
local out
local rc
if [ "$VERBOSE" = "1" ]; then
printf " COMMAND: $cmd\n" fi
out=$(eval ip netns exec $host1 $cmd 2>&1)
rc=$? if [ "$VERBOSE" = "1" ]; then if [ -n "$out" ]; then echo echo" $out" fi echo fi
return $rc
}
################################################################################ # create namespaces for hosts and sws
create_vrf()
{
local ns=$1
local vrf=$2
local table=$3
if [ -n "${ns}" ]; then
ns="-netns ${ns}" fi
ip ${ns} link add ${vrf} type vrf table ${table}
ip ${ns} link set ${vrf} up
ip ${ns} route add vrf ${vrf} unreachable default metric 8192
ip ${ns} -6 route add vrf ${vrf} unreachable default metric 8192
ip ${ns} addr add 127.0.0.1/8 dev ${vrf}
ip ${ns} -6 addr add ::1 dev ${vrf} nodad
ip ${ns} ru del pref 0
ip ${ns} ru add pref 32765 from all lookup local
ip ${ns} -6 ru del pref 0
ip ${ns} -6 ru add pref 32765 from all lookup local
}
create_ns()
{
local ns=$1
local addr=$2
local addr6=$3
if [ "${addr}" != "-" ]; then
ip -netns ${ns} addr add dev lo ${addr} fi if [ "${addr6}" != "-" ]; then
ip -netns ${ns} -6 addr add dev lo ${addr6} fi
ip -netns ${ns} ro add unreachable default metric 8192
ip -netns ${ns} -6 ro add unreachable default metric 8192
ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0
}
# create veth pair to connect namespaces and apply addresses.
connect_ns()
{
local ns1=$1
local ns1_dev=$2
local ns1_addr=$3
local ns1_addr6=$4
local ns2=$5
local ns2_dev=$6
local ns2_addr=$7
local ns2_addr6=$8
local ns1arg
local ns2arg
if [ -n "${ns1}" ]; then
ns1arg="-netns ${ns1}" fi if [ -n "${ns2}" ]; then
ns2arg="-netns ${ns2}" fi
ip ${ns1arg} li add ${ns1_dev} type veth peer name tmp
ip ${ns1arg} li set ${ns1_dev} up
ip ${ns1arg} li set tmp netns ${ns2} name ${ns2_dev}
ip ${ns2arg} li set ${ns2_dev} up
if [ "${ns1_addr}" != "-" ]; then
ip ${ns1arg} addr add dev ${ns1_dev} ${ns1_addr}
ip ${ns2arg} addr add dev ${ns2_dev} ${ns2_addr} fi
if [ "${ns1_addr6}" != "-" ]; then
ip ${ns1arg} addr add dev ${ns1_dev} ${ns1_addr6} nodad
ip ${ns2arg} addr add dev ${ns2_dev} ${ns2_addr6} nodad fi
}
cleanup_xfrm_dev()
{
ip -netns $host1 li del xfrm0
ip -netns $host2 addr del ${XFRM2_4}/24 dev eth0
ip -netns $host2 addr del ${XFRM2_6}/64 dev eth0
}
setup_xfrm_dev()
{
local vrfarg="vrf ${VRF}"
ip -netns $host1 li add type xfrm dev eth0 if_id ${IF_ID}
ip -netns $host1 li set xfrm0 ${vrfarg} up
ip -netns $host1 addr add ${XFRM1_4}/24 dev xfrm0
ip -netns $host1 addr add ${XFRM1_6}/64 dev xfrm0
ip -netns $host2 addr add ${XFRM2_4}/24 dev eth0
ip -netns $host2 addr add ${XFRM2_6}/64 dev eth0
# no IPsec
run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
log_test $? 0 "IPv4 no xfrm policy"
run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
log_test $? 0 "IPv6 no xfrm policy"
# xfrm without VRF in sel
setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6}
run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
log_test $? 0 "IPv4 xfrm policy based on address"
run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
log_test $? 0 "IPv6 xfrm policy based on address"
cleanup_xfrm
# xfrm with VRF in sel # Known failure: ipv4 resets the flow oif after the lookup. Fix is # not straightforward. # setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} "dev ${VRF}" # run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4} # log_test $? 0 "IPv4 xfrm policy with VRF in selector"
run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
log_test $? 0 "IPv6 xfrm policy with VRF in selector"
cleanup_xfrm
# xfrm with enslaved device in sel # Known failures: combined with the above, __xfrm{4,6}_selector_match # needs to consider both l3mdev and enslaved device index. # setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} "dev eth0" # run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4} # log_test $? 0 "IPv4 xfrm policy with enslaved device in selector" # run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6} # log_test $? 0 "IPv6 xfrm policy with enslaved device in selector" # cleanup_xfrm
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.