0001
0002
0003
0004 ALL_TESTS="ping_ipv4"
0005 NUM_NETIFS=6
0006 source lib.sh
0007
0008 h1_create()
0009 {
0010 vrf_create "vrf-h1"
0011 ip link set dev $h1 master vrf-h1
0012
0013 ip link set dev vrf-h1 up
0014 ip link set dev $h1 up
0015
0016 ip address add 192.0.2.2/24 dev $h1
0017
0018 ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
0019 ip route add 198.51.200.0/24 vrf vrf-h1 nexthop via 192.0.2.1
0020 }
0021
0022 h1_destroy()
0023 {
0024 ip route del 198.51.200.0/24 vrf vrf-h1
0025 ip route del 198.51.100.0/24 vrf vrf-h1
0026
0027 ip address del 192.0.2.2/24 dev $h1
0028
0029 ip link set dev $h1 down
0030 vrf_destroy "vrf-h1"
0031 }
0032
0033 h2_create()
0034 {
0035 vrf_create "vrf-h2"
0036 ip link set dev $h2 master vrf-h2
0037
0038 ip link set dev vrf-h2 up
0039 ip link set dev $h2 up
0040
0041 ip address add 198.51.100.2/24 dev $h2
0042
0043 ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
0044 ip route add 198.51.200.0/24 vrf vrf-h2 nexthop via 198.51.100.1
0045 }
0046
0047 h2_destroy()
0048 {
0049 ip route del 198.51.200.0/24 vrf vrf-h2
0050 ip route del 192.0.2.0/24 vrf vrf-h2
0051
0052 ip address del 198.51.100.2/24 dev $h2
0053
0054 ip link set dev $h2 down
0055 vrf_destroy "vrf-h2"
0056 }
0057
0058 h3_create()
0059 {
0060 vrf_create "vrf-h3"
0061 ip link set dev $h3 master vrf-h3
0062
0063 ip link set dev vrf-h3 up
0064 ip link set dev $h3 up
0065
0066 ip address add 198.51.200.2/24 dev $h3
0067
0068 ip route add 192.0.2.0/24 vrf vrf-h3 nexthop via 198.51.200.1
0069 ip route add 198.51.100.0/24 vrf vrf-h3 nexthop via 198.51.200.1
0070 }
0071
0072 h3_destroy()
0073 {
0074 ip route del 198.51.100.0/24 vrf vrf-h3
0075 ip route del 192.0.2.0/24 vrf vrf-h3
0076
0077 ip address del 198.51.200.2/24 dev $h3
0078
0079 ip link set dev $h3 down
0080 vrf_destroy "vrf-h3"
0081 }
0082
0083 router_create()
0084 {
0085 ip link set dev $rp1 up
0086 ip link set dev $rp2 up
0087 ip link set dev $rp3 up
0088
0089 ip address add 192.0.2.1/24 dev $rp1
0090
0091 ip address add 198.51.100.1/24 dev $rp2
0092 ip address add 198.51.200.1/24 dev $rp3
0093 }
0094
0095 router_destroy()
0096 {
0097 ip address del 198.51.200.1/24 dev $rp3
0098 ip address del 198.51.100.1/24 dev $rp2
0099
0100 ip address del 192.0.2.1/24 dev $rp1
0101
0102 ip link set dev $rp3 down
0103 ip link set dev $rp2 down
0104 ip link set dev $rp1 down
0105 }
0106
0107 setup_prepare()
0108 {
0109 h1=${NETIFS[p1]}
0110 rp1=${NETIFS[p2]}
0111
0112 rp2=${NETIFS[p3]}
0113 h2=${NETIFS[p4]}
0114
0115 rp3=${NETIFS[p5]}
0116 h3=${NETIFS[p6]}
0117
0118 vrf_prepare
0119
0120 h1_create
0121 h2_create
0122 h3_create
0123
0124 router_create
0125
0126 forwarding_enable
0127 }
0128
0129 cleanup()
0130 {
0131 pre_cleanup
0132
0133 forwarding_restore
0134
0135 router_destroy
0136
0137 h3_destroy
0138 h2_destroy
0139 h1_destroy
0140
0141 vrf_cleanup
0142 }
0143
0144 bc_forwarding_disable()
0145 {
0146 sysctl_set net.ipv4.conf.all.bc_forwarding 0
0147 sysctl_set net.ipv4.conf.$rp1.bc_forwarding 0
0148 sysctl_set net.ipv4.conf.$rp2.bc_forwarding 0
0149 }
0150
0151 bc_forwarding_enable()
0152 {
0153 sysctl_set net.ipv4.conf.all.bc_forwarding 1
0154 sysctl_set net.ipv4.conf.$rp1.bc_forwarding 1
0155 sysctl_set net.ipv4.conf.$rp2.bc_forwarding 1
0156 }
0157
0158 bc_forwarding_restore()
0159 {
0160 sysctl_restore net.ipv4.conf.$rp2.bc_forwarding
0161 sysctl_restore net.ipv4.conf.$rp1.bc_forwarding
0162 sysctl_restore net.ipv4.conf.all.bc_forwarding
0163 }
0164
0165 ping_test_from()
0166 {
0167 local oif=$1
0168 local dip=$2
0169 local from=$3
0170 local fail=${4:-0}
0171
0172 RET=0
0173
0174 log_info "ping $dip, expected reply from $from"
0175 ip vrf exec $(master_name_get $oif) \
0176 $PING -I $oif $dip -c 10 -i 0.1 -w $PING_TIMEOUT -b 2>&1 \
0177 | grep "bytes from $from" > /dev/null
0178 check_err_fail $fail $?
0179 }
0180
0181 ping_ipv4()
0182 {
0183 sysctl_set net.ipv4.icmp_echo_ignore_broadcasts 0
0184
0185 bc_forwarding_disable
0186 log_info "bc_forwarding disabled on r1 =>"
0187 ping_test_from $h1 198.51.100.255 192.0.2.1
0188 log_test "h1 -> net2: reply from r1 (not forwarding)"
0189 ping_test_from $h1 198.51.200.255 192.0.2.1
0190 log_test "h1 -> net3: reply from r1 (not forwarding)"
0191 ping_test_from $h1 192.0.2.255 192.0.2.1
0192 log_test "h1 -> net1: reply from r1 (not dropping)"
0193 ping_test_from $h1 255.255.255.255 192.0.2.1
0194 log_test "h1 -> 255.255.255.255: reply from r1 (not forwarding)"
0195
0196 ping_test_from $h2 192.0.2.255 198.51.100.1
0197 log_test "h2 -> net1: reply from r1 (not forwarding)"
0198 ping_test_from $h2 198.51.200.255 198.51.100.1
0199 log_test "h2 -> net3: reply from r1 (not forwarding)"
0200 ping_test_from $h2 198.51.100.255 198.51.100.1
0201 log_test "h2 -> net2: reply from r1 (not dropping)"
0202 ping_test_from $h2 255.255.255.255 198.51.100.1
0203 log_test "h2 -> 255.255.255.255: reply from r1 (not forwarding)"
0204 bc_forwarding_restore
0205
0206 bc_forwarding_enable
0207 log_info "bc_forwarding enabled on r1 =>"
0208 ping_test_from $h1 198.51.100.255 198.51.100.2
0209 log_test "h1 -> net2: reply from h2 (forwarding)"
0210 ping_test_from $h1 198.51.200.255 198.51.200.2
0211 log_test "h1 -> net3: reply from h3 (forwarding)"
0212 ping_test_from $h1 192.0.2.255 192.0.2.1 1
0213 log_test "h1 -> net1: no reply (dropping)"
0214 ping_test_from $h1 255.255.255.255 192.0.2.1
0215 log_test "h1 -> 255.255.255.255: reply from r1 (not forwarding)"
0216
0217 ping_test_from $h2 192.0.2.255 192.0.2.2
0218 log_test "h2 -> net1: reply from h1 (forwarding)"
0219 ping_test_from $h2 198.51.200.255 198.51.200.2
0220 log_test "h2 -> net3: reply from h3 (forwarding)"
0221 ping_test_from $h2 198.51.100.255 198.51.100.1 1
0222 log_test "h2 -> net2: no reply (dropping)"
0223 ping_test_from $h2 255.255.255.255 198.51.100.1
0224 log_test "h2 -> 255.255.255.255: reply from r1 (not forwarding)"
0225 bc_forwarding_restore
0226
0227 sysctl_restore net.ipv4.icmp_echo_ignore_broadcasts
0228 }
0229
0230 trap cleanup EXIT
0231
0232 setup_prepare
0233 setup_wait
0234
0235 tests_run
0236
0237 exit $EXIT_STATUS