|
37 | 37 | #
|
38 | 38 | # ping: SRC->[encap at veth2:ingress]->GRE:decap->DST
|
39 | 39 | # ping replies go DST->SRC directly
|
| 40 | +# |
| 41 | +# 2c. in an egress_md test, a bpf LWT_XMIT program is installed on a |
| 42 | +# route towards a collect_md gre{,6} device and sets the tunnel key |
| 43 | +# such that packets are encapsulated with an IP/GRE header to route |
| 44 | +# to IPv*_GRE |
| 45 | +# |
| 46 | +# ping: SRC->[encap at gre{,6}_md:xmit]->GRE:decap->DST |
| 47 | +# ping replies go DST->SRC directly |
40 | 48 |
|
41 | 49 | if [[ $EUID -ne 0 ]]; then
|
42 | 50 | echo "This script must be run as root"
|
@@ -238,15 +246,15 @@ setup()
|
238 | 246 | ip -netns ${NS3} -6 route add ${IPv6_6}/128 dev veth8 via ${IPv6_7}
|
239 | 247 |
|
240 | 248 | # configure IPv4 GRE device in NS3, and a route to it via the "bottom" route
|
241 |
| - ip -netns ${NS3} tunnel add gre_dev mode gre remote ${IPv4_1} local ${IPv4_GRE} ttl 255 |
| 249 | + ip -netns ${NS3} tunnel add gre_dev mode gre remote ${IPv4_5} local ${IPv4_GRE} ttl 255 key 0 |
242 | 250 | ip -netns ${NS3} link set gre_dev up
|
243 | 251 | ip -netns ${NS3} addr add ${IPv4_GRE} dev gre_dev
|
244 | 252 | ip -netns ${NS1} route add ${IPv4_GRE}/32 dev veth5 via ${IPv4_6} ${VRF}
|
245 | 253 | ip -netns ${NS2} route add ${IPv4_GRE}/32 dev veth7 via ${IPv4_8} ${VRF}
|
246 | 254 |
|
247 | 255 |
|
248 | 256 | # configure IPv6 GRE device in NS3, and a route to it via the "bottom" route
|
249 |
| - ip -netns ${NS3} -6 tunnel add name gre6_dev mode ip6gre remote ${IPv6_1} local ${IPv6_GRE} ttl 255 |
| 257 | + ip -netns ${NS3} -6 tunnel add name gre6_dev mode ip6gre remote ${IPv6_5} local ${IPv6_GRE} ttl 255 key 0 |
250 | 258 | ip -netns ${NS3} link set gre6_dev up
|
251 | 259 | ip -netns ${NS3} -6 addr add ${IPv6_GRE} nodad dev gre6_dev
|
252 | 260 | ip -netns ${NS1} -6 route add ${IPv6_GRE}/128 dev veth5 via ${IPv6_6} ${VRF}
|
@@ -291,13 +299,16 @@ test_ping()
|
291 | 299 | {
|
292 | 300 | local readonly PROTO=$1
|
293 | 301 | local readonly EXPECTED=$2
|
| 302 | + local readonly NOBIND=$3 |
294 | 303 | local RET=0
|
295 | 304 |
|
| 305 | + BINDTODEV=$([ -z ${NOBIND} ] && echo -I veth1) |
| 306 | + |
296 | 307 | if [ "${PROTO}" == "IPv4" ] ; then
|
297 |
| - ip netns exec ${NS1} ping -c 1 -W 1 -I veth1 ${IPv4_DST} 2>&1 > /dev/null |
| 308 | + ip netns exec ${NS1} ping -c 1 -W 1 ${BINDTODEV} ${IPv4_DST} 2>&1 > /dev/null |
298 | 309 | RET=$?
|
299 | 310 | elif [ "${PROTO}" == "IPv6" ] ; then
|
300 |
| - ip netns exec ${NS1} ping6 -c 1 -W 1 -I veth1 ${IPv6_DST} 2>&1 > /dev/null |
| 311 | + ip netns exec ${NS1} ping6 -c 1 -W 1 ${BINDTODEV} ${IPv6_DST} 2>&1 > /dev/null |
301 | 312 | RET=$?
|
302 | 313 | else
|
303 | 314 | echo " test_ping: unknown PROTO: ${PROTO}"
|
@@ -409,6 +420,70 @@ test_egress()
|
409 | 420 | process_test_results
|
410 | 421 | }
|
411 | 422 |
|
| 423 | +test_egress_md() |
| 424 | +{ |
| 425 | + local readonly ENCAP=$1 |
| 426 | + echo "starting egress_md ${ENCAP} encap test" |
| 427 | + setup |
| 428 | + |
| 429 | + # by default, pings work |
| 430 | + test_ping IPv4 0 |
| 431 | + test_ping IPv6 0 |
| 432 | + |
| 433 | + # remove NS2->DST routes, ping fails |
| 434 | + ip -netns ${NS2} route del ${IPv4_DST}/32 dev veth3 |
| 435 | + ip -netns ${NS2} -6 route del ${IPv6_DST}/128 dev veth3 |
| 436 | + test_ping IPv4 1 |
| 437 | + test_ping IPv6 1 |
| 438 | + |
| 439 | + # install replacement routes (LWT/eBPF), pings succeed |
| 440 | + if [ "${ENCAP}" == "IPv4" ] ; then |
| 441 | + ip -net ${NS1} link add gre_md type gre external |
| 442 | + ip -netns ${NS1} addr add ${IPv4_1}/24 dev gre_md |
| 443 | + ip -netns ${NS1} -6 addr add ${IPv6_1}/128 nodad dev gre_md |
| 444 | + ip -netns ${NS1} link set gre_md up |
| 445 | + |
| 446 | + ip -netns ${NS1} route add ${IPv4_DST} encap bpf xmit obj \ |
| 447 | + test_lwt_ip_encap.o sec encap_gre_md dev gre_md |
| 448 | + ip -netns ${NS1} -6 route add ${IPv6_DST} encap bpf xmit obj \ |
| 449 | + test_lwt_ip_encap.o sec encap_gre_md dev gre_md |
| 450 | + elif [ "${ENCAP}" == "IPv6" ] ; then |
| 451 | + ip -net ${NS1} link add gre6_md type ip6gre external |
| 452 | + ip -netns ${NS1} addr add ${IPv4_1}/24 dev gre6_md |
| 453 | + ip -netns ${NS1} -6 addr add ${IPv6_1}/128 nodad dev gre6_md |
| 454 | + ip -netns ${NS1} link set gre6_md up |
| 455 | + |
| 456 | + ip -netns ${NS1} route add ${IPv4_DST} encap bpf xmit obj \ |
| 457 | + test_lwt_ip_encap.o sec encap_gre6_md dev gre6_md |
| 458 | + ip -netns ${NS1} -6 route add ${IPv6_DST} encap bpf xmit obj \ |
| 459 | + test_lwt_ip_encap.o sec encap_gre6_md dev gre6_md |
| 460 | + else |
| 461 | + echo " unknown encap ${ENCAP}" |
| 462 | + TEST_STATUS=1 |
| 463 | + fi |
| 464 | + |
| 465 | + # Due to the asymmetry of the traffic flow we do not bind to device |
| 466 | + |
| 467 | + test_ping IPv4 0 nobind |
| 468 | + test_ping IPv6 0 nobind |
| 469 | + |
| 470 | + test_gso IPv4 |
| 471 | + test_gso IPv6 |
| 472 | + |
| 473 | + # a negative test: remove routes to GRE devices: ping fails |
| 474 | + remove_routes_to_gredev |
| 475 | + test_ping IPv4 1 nobind |
| 476 | + test_ping IPv6 1 nobind |
| 477 | + |
| 478 | + # another negative test |
| 479 | + add_unreachable_routes_to_gredev |
| 480 | + test_ping IPv4 1 nobind |
| 481 | + test_ping IPv6 1 nobind |
| 482 | + |
| 483 | + cleanup |
| 484 | + process_test_results |
| 485 | +} |
| 486 | + |
412 | 487 | test_ingress()
|
413 | 488 | {
|
414 | 489 | local readonly ENCAP=$1
|
@@ -465,6 +540,8 @@ test_egress IPv4
|
465 | 540 | test_egress IPv6
|
466 | 541 | test_ingress IPv4
|
467 | 542 | test_ingress IPv6
|
| 543 | +test_egress_md IPv4 |
| 544 | +test_egress_md IPv6 |
468 | 545 |
|
469 | 546 | VRF="vrf red"
|
470 | 547 | test_egress IPv4
|
|
0 commit comments