1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# End-to-end eBPF tunnel test suite 5# The script tests BPF network tunnel implementation. 6# 7# Topology: 8# --------- 9# root namespace | at_ns0 namespace 10# | 11# ----------- | ----------- 12# | tnl dev | | | tnl dev | (overlay network) 13# ----------- | ----------- 14# metadata-mode | native-mode 15# with bpf | 16# | 17# ---------- | ---------- 18# | veth1 | --------- | veth0 | (underlay network) 19# ---------- peer ---------- 20# 21# 22# Device Configuration 23# -------------------- 24# Root namespace with metadata-mode tunnel + BPF 25# Device names and addresses: 26# veth1 IP: 172.16.1.200, IPv6: 00::22 (underlay) 27# tunnel dev <type>11, ex: gre11, IPv4: 10.1.1.200, IPv6: 1::22 (overlay) 28# 29# Namespace at_ns0 with native tunnel 30# Device names and addresses: 31# veth0 IPv4: 172.16.1.100, IPv6: 00::11 (underlay) 32# tunnel dev <type>00, ex: gre00, IPv4: 10.1.1.100, IPv6: 1::11 (overlay) 33# 34# 35# End-to-end ping packet flow 36# --------------------------- 37# Most of the tests start by namespace creation, device configuration, 38# then ping the underlay and overlay network. When doing 'ping 10.1.1.100' 39# from root namespace, the following operations happen: 40# 1) Route lookup shows 10.1.1.100/24 belongs to tnl dev, fwd to tnl dev. 41# 2) Tnl device's egress BPF program is triggered and set the tunnel metadata, 42# with remote_ip=172.16.1.100 and others. 43# 3) Outer tunnel header is prepended and route the packet to veth1's egress 44# 4) veth0's ingress queue receive the tunneled packet at namespace at_ns0 45# 5) Tunnel protocol handler, ex: vxlan_rcv, decap the packet 46# 6) Forward the packet to the overlay tnl dev 47 48BPF_FILE="test_tunnel_kern.bpf.o" 49BPF_PIN_TUNNEL_DIR="/sys/fs/bpf/tc/tunnel" 50PING_ARG="-c 3 -w 10 -q" 51ret=0 52GREEN='\033[0;92m' 53RED='\033[0;31m' 54NC='\033[0m' # No Color 55 56config_device() 57{ 58 ip netns add at_ns0 59 ip link add veth0 type veth peer name veth1 60 ip link set veth0 netns at_ns0 61 ip netns exec at_ns0 ip addr add 172.16.1.100/24 dev veth0 62 ip netns exec at_ns0 ip link set dev veth0 up 63 ip link set dev veth1 up mtu 1500 64 ip addr add dev veth1 172.16.1.200/24 65} 66 67add_gre_tunnel() 68{ 69 # at_ns0 namespace 70 ip netns exec at_ns0 \ 71 ip link add dev $DEV_NS type $TYPE seq key 2 \ 72 local 172.16.1.100 remote 172.16.1.200 73 ip netns exec at_ns0 ip link set dev $DEV_NS up 74 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 75 76 # root namespace 77 ip link add dev $DEV type $TYPE key 2 external 78 ip link set dev $DEV up 79 ip addr add dev $DEV 10.1.1.200/24 80} 81 82add_ip6gretap_tunnel() 83{ 84 85 # assign ipv6 address 86 ip netns exec at_ns0 ip addr add ::11/96 dev veth0 87 ip netns exec at_ns0 ip link set dev veth0 up 88 ip addr add dev veth1 ::22/96 89 ip link set dev veth1 up 90 91 # at_ns0 namespace 92 ip netns exec at_ns0 \ 93 ip link add dev $DEV_NS type $TYPE seq flowlabel 0xbcdef key 2 \ 94 local ::11 remote ::22 95 96 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 97 ip netns exec at_ns0 ip addr add dev $DEV_NS fc80::100/96 98 ip netns exec at_ns0 ip link set dev $DEV_NS up 99 100 # root namespace 101 ip link add dev $DEV type $TYPE external 102 ip addr add dev $DEV 10.1.1.200/24 103 ip addr add dev $DEV fc80::200/24 104 ip link set dev $DEV up 105} 106 107add_erspan_tunnel() 108{ 109 # at_ns0 namespace 110 if [ "$1" == "v1" ]; then 111 ip netns exec at_ns0 \ 112 ip link add dev $DEV_NS type $TYPE seq key 2 \ 113 local 172.16.1.100 remote 172.16.1.200 \ 114 erspan_ver 1 erspan 123 115 else 116 ip netns exec at_ns0 \ 117 ip link add dev $DEV_NS type $TYPE seq key 2 \ 118 local 172.16.1.100 remote 172.16.1.200 \ 119 erspan_ver 2 erspan_dir egress erspan_hwid 3 120 fi 121 ip netns exec at_ns0 ip link set dev $DEV_NS up 122 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 123 124 # root namespace 125 ip link add dev $DEV type $TYPE external 126 ip link set dev $DEV up 127 ip addr add dev $DEV 10.1.1.200/24 128} 129 130add_ip6erspan_tunnel() 131{ 132 133 # assign ipv6 address 134 ip netns exec at_ns0 ip addr add ::11/96 dev veth0 135 ip netns exec at_ns0 ip link set dev veth0 up 136 ip addr add dev veth1 ::22/96 137 ip link set dev veth1 up 138 139 # at_ns0 namespace 140 if [ "$1" == "v1" ]; then 141 ip netns exec at_ns0 \ 142 ip link add dev $DEV_NS type $TYPE seq key 2 \ 143 local ::11 remote ::22 \ 144 erspan_ver 1 erspan 123 145 else 146 ip netns exec at_ns0 \ 147 ip link add dev $DEV_NS type $TYPE seq key 2 \ 148 local ::11 remote ::22 \ 149 erspan_ver 2 erspan_dir egress erspan_hwid 7 150 fi 151 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 152 ip netns exec at_ns0 ip link set dev $DEV_NS up 153 154 # root namespace 155 ip link add dev $DEV type $TYPE external 156 ip addr add dev $DEV 10.1.1.200/24 157 ip link set dev $DEV up 158} 159 160add_geneve_tunnel() 161{ 162 # at_ns0 namespace 163 ip netns exec at_ns0 \ 164 ip link add dev $DEV_NS type $TYPE \ 165 id 2 dstport 6081 remote 172.16.1.200 166 ip netns exec at_ns0 ip link set dev $DEV_NS up 167 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 168 169 # root namespace 170 ip link add dev $DEV type $TYPE dstport 6081 external 171 ip link set dev $DEV up 172 ip addr add dev $DEV 10.1.1.200/24 173} 174 175add_ip6geneve_tunnel() 176{ 177 ip netns exec at_ns0 ip addr add ::11/96 dev veth0 178 ip netns exec at_ns0 ip link set dev veth0 up 179 ip addr add dev veth1 ::22/96 180 ip link set dev veth1 up 181 182 # at_ns0 namespace 183 ip netns exec at_ns0 \ 184 ip link add dev $DEV_NS type $TYPE id 22 \ 185 remote ::22 # geneve has no local option 186 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 187 ip netns exec at_ns0 ip link set dev $DEV_NS up 188 189 # root namespace 190 ip link add dev $DEV type $TYPE external 191 ip addr add dev $DEV 10.1.1.200/24 192 ip link set dev $DEV up 193} 194 195add_ipip_tunnel() 196{ 197 # at_ns0 namespace 198 ip netns exec at_ns0 \ 199 ip link add dev $DEV_NS type $TYPE \ 200 local 172.16.1.100 remote 172.16.1.200 201 ip netns exec at_ns0 ip link set dev $DEV_NS up 202 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 203 204 # root namespace 205 ip link add dev $DEV type $TYPE external 206 ip link set dev $DEV up 207 ip addr add dev $DEV 10.1.1.200/24 208} 209 210add_ip6tnl_tunnel() 211{ 212 ip netns exec at_ns0 ip addr add ::11/96 dev veth0 213 ip netns exec at_ns0 ip link set dev veth0 up 214 ip addr add dev veth1 ::22/96 215 ip link set dev veth1 up 216 217 # at_ns0 namespace 218 ip netns exec at_ns0 \ 219 ip link add dev $DEV_NS type $TYPE \ 220 local ::11 remote ::22 221 ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 222 ip netns exec at_ns0 ip addr add dev $DEV_NS 1::11/96 223 ip netns exec at_ns0 ip link set dev $DEV_NS up 224 225 # root namespace 226 ip link add dev $DEV type $TYPE external 227 ip addr add dev $DEV 10.1.1.200/24 228 ip addr add dev $DEV 1::22/96 229 ip link set dev $DEV up 230} 231 232test_gre() 233{ 234 TYPE=gretap 235 DEV_NS=gretap00 236 DEV=gretap11 237 ret=0 238 239 check $TYPE 240 config_device 241 add_gre_tunnel 242 attach_bpf $DEV gre_set_tunnel gre_get_tunnel 243 ping $PING_ARG 10.1.1.100 244 check_err $? 245 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 246 check_err $? 247 cleanup 248 249 if [ $ret -ne 0 ]; then 250 echo -e ${RED}"FAIL: $TYPE"${NC} 251 return 1 252 fi 253 echo -e ${GREEN}"PASS: $TYPE"${NC} 254} 255 256test_ip6gre() 257{ 258 TYPE=ip6gre 259 DEV_NS=ip6gre00 260 DEV=ip6gre11 261 ret=0 262 263 check $TYPE 264 config_device 265 # reuse the ip6gretap function 266 add_ip6gretap_tunnel 267 attach_bpf $DEV ip6gretap_set_tunnel ip6gretap_get_tunnel 268 # underlay 269 ping6 $PING_ARG ::11 270 # overlay: ipv4 over ipv6 271 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 272 ping $PING_ARG 10.1.1.100 273 check_err $? 274 # overlay: ipv6 over ipv6 275 ip netns exec at_ns0 ping6 $PING_ARG fc80::200 276 check_err $? 277 cleanup 278 279 if [ $ret -ne 0 ]; then 280 echo -e ${RED}"FAIL: $TYPE"${NC} 281 return 1 282 fi 283 echo -e ${GREEN}"PASS: $TYPE"${NC} 284} 285 286test_ip6gretap() 287{ 288 TYPE=ip6gretap 289 DEV_NS=ip6gretap00 290 DEV=ip6gretap11 291 ret=0 292 293 check $TYPE 294 config_device 295 add_ip6gretap_tunnel 296 attach_bpf $DEV ip6gretap_set_tunnel ip6gretap_get_tunnel 297 # underlay 298 ping6 $PING_ARG ::11 299 # overlay: ipv4 over ipv6 300 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 301 ping $PING_ARG 10.1.1.100 302 check_err $? 303 # overlay: ipv6 over ipv6 304 ip netns exec at_ns0 ping6 $PING_ARG fc80::200 305 check_err $? 306 cleanup 307 308 if [ $ret -ne 0 ]; then 309 echo -e ${RED}"FAIL: $TYPE"${NC} 310 return 1 311 fi 312 echo -e ${GREEN}"PASS: $TYPE"${NC} 313} 314 315test_erspan() 316{ 317 TYPE=erspan 318 DEV_NS=erspan00 319 DEV=erspan11 320 ret=0 321 322 check $TYPE 323 config_device 324 add_erspan_tunnel $1 325 attach_bpf $DEV erspan_set_tunnel erspan_get_tunnel 326 ping $PING_ARG 10.1.1.100 327 check_err $? 328 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 329 check_err $? 330 cleanup 331 332 if [ $ret -ne 0 ]; then 333 echo -e ${RED}"FAIL: $TYPE"${NC} 334 return 1 335 fi 336 echo -e ${GREEN}"PASS: $TYPE"${NC} 337} 338 339test_ip6erspan() 340{ 341 TYPE=ip6erspan 342 DEV_NS=ip6erspan00 343 DEV=ip6erspan11 344 ret=0 345 346 check $TYPE 347 config_device 348 add_ip6erspan_tunnel $1 349 attach_bpf $DEV ip4ip6erspan_set_tunnel ip4ip6erspan_get_tunnel 350 ping6 $PING_ARG ::11 351 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 352 check_err $? 353 cleanup 354 355 if [ $ret -ne 0 ]; then 356 echo -e ${RED}"FAIL: $TYPE"${NC} 357 return 1 358 fi 359 echo -e ${GREEN}"PASS: $TYPE"${NC} 360} 361 362test_geneve() 363{ 364 TYPE=geneve 365 DEV_NS=geneve00 366 DEV=geneve11 367 ret=0 368 369 check $TYPE 370 config_device 371 add_geneve_tunnel 372 attach_bpf $DEV geneve_set_tunnel geneve_get_tunnel 373 ping $PING_ARG 10.1.1.100 374 check_err $? 375 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 376 check_err $? 377 cleanup 378 379 if [ $ret -ne 0 ]; then 380 echo -e ${RED}"FAIL: $TYPE"${NC} 381 return 1 382 fi 383 echo -e ${GREEN}"PASS: $TYPE"${NC} 384} 385 386test_ip6geneve() 387{ 388 TYPE=geneve 389 DEV_NS=ip6geneve00 390 DEV=ip6geneve11 391 ret=0 392 393 check $TYPE 394 config_device 395 add_ip6geneve_tunnel 396 attach_bpf $DEV ip6geneve_set_tunnel ip6geneve_get_tunnel 397 ping $PING_ARG 10.1.1.100 398 check_err $? 399 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 400 check_err $? 401 cleanup 402 403 if [ $ret -ne 0 ]; then 404 echo -e ${RED}"FAIL: ip6$TYPE"${NC} 405 return 1 406 fi 407 echo -e ${GREEN}"PASS: ip6$TYPE"${NC} 408} 409 410test_ipip() 411{ 412 TYPE=ipip 413 DEV_NS=ipip00 414 DEV=ipip11 415 ret=0 416 417 check $TYPE 418 config_device 419 add_ipip_tunnel 420 ip link set dev veth1 mtu 1500 421 attach_bpf $DEV ipip_set_tunnel ipip_get_tunnel 422 ping $PING_ARG 10.1.1.100 423 check_err $? 424 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 425 check_err $? 426 cleanup 427 428 if [ $ret -ne 0 ]; then 429 echo -e ${RED}"FAIL: $TYPE"${NC} 430 return 1 431 fi 432 echo -e ${GREEN}"PASS: $TYPE"${NC} 433} 434 435test_ipip6() 436{ 437 TYPE=ip6tnl 438 DEV_NS=ipip6tnl00 439 DEV=ipip6tnl11 440 ret=0 441 442 check $TYPE 443 config_device 444 add_ip6tnl_tunnel 445 ip link set dev veth1 mtu 1500 446 attach_bpf $DEV ipip6_set_tunnel ipip6_get_tunnel 447 # underlay 448 ping6 $PING_ARG ::11 449 # ip4 over ip6 450 ping $PING_ARG 10.1.1.100 451 check_err $? 452 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 453 check_err $? 454 cleanup 455 456 if [ $ret -ne 0 ]; then 457 echo -e ${RED}"FAIL: $TYPE"${NC} 458 return 1 459 fi 460 echo -e ${GREEN}"PASS: $TYPE"${NC} 461} 462 463test_ip6ip6() 464{ 465 TYPE=ip6tnl 466 DEV_NS=ip6ip6tnl00 467 DEV=ip6ip6tnl11 468 ret=0 469 470 check $TYPE 471 config_device 472 add_ip6tnl_tunnel 473 ip link set dev veth1 mtu 1500 474 attach_bpf $DEV ip6ip6_set_tunnel ip6ip6_get_tunnel 475 # underlay 476 ping6 $PING_ARG ::11 477 # ip6 over ip6 478 ping6 $PING_ARG 1::11 479 check_err $? 480 ip netns exec at_ns0 ping6 $PING_ARG 1::22 481 check_err $? 482 cleanup 483 484 if [ $ret -ne 0 ]; then 485 echo -e ${RED}"FAIL: ip6$TYPE"${NC} 486 return 1 487 fi 488 echo -e ${GREEN}"PASS: ip6$TYPE"${NC} 489} 490 491setup_xfrm_tunnel() 492{ 493 auth=0x$(printf '1%.0s' {1..40}) 494 enc=0x$(printf '2%.0s' {1..32}) 495 spi_in_to_out=0x1 496 spi_out_to_in=0x2 497 # at_ns0 namespace 498 # at_ns0 -> root 499 ip netns exec at_ns0 \ 500 ip xfrm state add src 172.16.1.100 dst 172.16.1.200 proto esp \ 501 spi $spi_in_to_out reqid 1 mode tunnel \ 502 auth-trunc 'hmac(sha1)' $auth 96 enc 'cbc(aes)' $enc 503 ip netns exec at_ns0 \ 504 ip xfrm policy add src 10.1.1.100/32 dst 10.1.1.200/32 dir out \ 505 tmpl src 172.16.1.100 dst 172.16.1.200 proto esp reqid 1 \ 506 mode tunnel 507 # root -> at_ns0 508 ip netns exec at_ns0 \ 509 ip xfrm state add src 172.16.1.200 dst 172.16.1.100 proto esp \ 510 spi $spi_out_to_in reqid 2 mode tunnel \ 511 auth-trunc 'hmac(sha1)' $auth 96 enc 'cbc(aes)' $enc 512 ip netns exec at_ns0 \ 513 ip xfrm policy add src 10.1.1.200/32 dst 10.1.1.100/32 dir in \ 514 tmpl src 172.16.1.200 dst 172.16.1.100 proto esp reqid 2 \ 515 mode tunnel 516 # address & route 517 ip netns exec at_ns0 \ 518 ip addr add dev veth0 10.1.1.100/32 519 ip netns exec at_ns0 \ 520 ip route add 10.1.1.200 dev veth0 via 172.16.1.200 \ 521 src 10.1.1.100 522 523 # root namespace 524 # at_ns0 -> root 525 ip xfrm state add src 172.16.1.100 dst 172.16.1.200 proto esp \ 526 spi $spi_in_to_out reqid 1 mode tunnel \ 527 auth-trunc 'hmac(sha1)' $auth 96 enc 'cbc(aes)' $enc 528 ip xfrm policy add src 10.1.1.100/32 dst 10.1.1.200/32 dir in \ 529 tmpl src 172.16.1.100 dst 172.16.1.200 proto esp reqid 1 \ 530 mode tunnel 531 # root -> at_ns0 532 ip xfrm state add src 172.16.1.200 dst 172.16.1.100 proto esp \ 533 spi $spi_out_to_in reqid 2 mode tunnel \ 534 auth-trunc 'hmac(sha1)' $auth 96 enc 'cbc(aes)' $enc 535 ip xfrm policy add src 10.1.1.200/32 dst 10.1.1.100/32 dir out \ 536 tmpl src 172.16.1.200 dst 172.16.1.100 proto esp reqid 2 \ 537 mode tunnel 538 # address & route 539 ip addr add dev veth1 10.1.1.200/32 540 ip route add 10.1.1.100 dev veth1 via 172.16.1.100 src 10.1.1.200 541} 542 543test_xfrm_tunnel() 544{ 545 config_device 546 > /sys/kernel/debug/tracing/trace 547 setup_xfrm_tunnel 548 mkdir -p ${BPF_PIN_TUNNEL_DIR} 549 bpftool prog loadall ${BPF_FILE} ${BPF_PIN_TUNNEL_DIR} 550 tc qdisc add dev veth1 clsact 551 tc filter add dev veth1 proto ip ingress bpf da object-pinned \ 552 ${BPF_PIN_TUNNEL_DIR}/xfrm_get_state 553 ip netns exec at_ns0 ping $PING_ARG 10.1.1.200 554 sleep 1 555 grep "reqid 1" /sys/kernel/debug/tracing/trace 556 check_err $? 557 grep "spi 0x1" /sys/kernel/debug/tracing/trace 558 check_err $? 559 grep "remote ip 0xac100164" /sys/kernel/debug/tracing/trace 560 check_err $? 561 cleanup 562 563 if [ $ret -ne 0 ]; then 564 echo -e ${RED}"FAIL: xfrm tunnel"${NC} 565 return 1 566 fi 567 echo -e ${GREEN}"PASS: xfrm tunnel"${NC} 568} 569 570attach_bpf() 571{ 572 DEV=$1 573 SET=$2 574 GET=$3 575 mkdir -p ${BPF_PIN_TUNNEL_DIR} 576 bpftool prog loadall ${BPF_FILE} ${BPF_PIN_TUNNEL_DIR}/ 577 tc qdisc add dev $DEV clsact 578 tc filter add dev $DEV egress bpf da object-pinned ${BPF_PIN_TUNNEL_DIR}/$SET 579 tc filter add dev $DEV ingress bpf da object-pinned ${BPF_PIN_TUNNEL_DIR}/$GET 580} 581 582cleanup() 583{ 584 rm -rf ${BPF_PIN_TUNNEL_DIR} 585 586 ip netns delete at_ns0 2> /dev/null 587 ip link del veth1 2> /dev/null 588 ip link del ipip11 2> /dev/null 589 ip link del ipip6tnl11 2> /dev/null 590 ip link del ip6ip6tnl11 2> /dev/null 591 ip link del gretap11 2> /dev/null 592 ip link del ip6gre11 2> /dev/null 593 ip link del ip6gretap11 2> /dev/null 594 ip link del geneve11 2> /dev/null 595 ip link del ip6geneve11 2> /dev/null 596 ip link del erspan11 2> /dev/null 597 ip link del ip6erspan11 2> /dev/null 598 ip xfrm policy delete dir out src 10.1.1.200/32 dst 10.1.1.100/32 2> /dev/null 599 ip xfrm policy delete dir in src 10.1.1.100/32 dst 10.1.1.200/32 2> /dev/null 600 ip xfrm state delete src 172.16.1.100 dst 172.16.1.200 proto esp spi 0x1 2> /dev/null 601 ip xfrm state delete src 172.16.1.200 dst 172.16.1.100 proto esp spi 0x2 2> /dev/null 602} 603 604cleanup_exit() 605{ 606 echo "CATCH SIGKILL or SIGINT, cleanup and exit" 607 cleanup 608 exit 0 609} 610 611check() 612{ 613 ip link help 2>&1 | grep -q "\s$1\s" 614 if [ $? -ne 0 ];then 615 echo "SKIP $1: iproute2 not support" 616 cleanup 617 return 1 618 fi 619} 620 621enable_debug() 622{ 623 echo 'file ip_gre.c +p' > /sys/kernel/debug/dynamic_debug/control 624 echo 'file ip6_gre.c +p' > /sys/kernel/debug/dynamic_debug/control 625 echo 'file geneve.c +p' > /sys/kernel/debug/dynamic_debug/control 626 echo 'file ipip.c +p' > /sys/kernel/debug/dynamic_debug/control 627} 628 629check_err() 630{ 631 if [ $ret -eq 0 ]; then 632 ret=$1 633 fi 634} 635 636bpf_tunnel_test() 637{ 638 local errors=0 639 640 echo "Testing GRE tunnel..." 641 test_gre 642 errors=$(( $errors + $? )) 643 644 echo "Testing IP6GRE tunnel..." 645 test_ip6gre 646 errors=$(( $errors + $? )) 647 648 echo "Testing IP6GRETAP tunnel..." 649 test_ip6gretap 650 errors=$(( $errors + $? )) 651 652 echo "Testing ERSPAN tunnel..." 653 test_erspan v2 654 errors=$(( $errors + $? )) 655 656 echo "Testing IP6ERSPAN tunnel..." 657 test_ip6erspan v2 658 errors=$(( $errors + $? )) 659 660 echo "Testing GENEVE tunnel..." 661 test_geneve 662 errors=$(( $errors + $? )) 663 664 echo "Testing IP6GENEVE tunnel..." 665 test_ip6geneve 666 errors=$(( $errors + $? )) 667 668 echo "Testing IPIP tunnel..." 669 test_ipip 670 errors=$(( $errors + $? )) 671 672 echo "Testing IPIP6 tunnel..." 673 test_ipip6 674 errors=$(( $errors + $? )) 675 676 echo "Testing IP6IP6 tunnel..." 677 test_ip6ip6 678 errors=$(( $errors + $? )) 679 680 echo "Testing IPSec tunnel..." 681 test_xfrm_tunnel 682 errors=$(( $errors + $? )) 683 684 return $errors 685} 686 687trap cleanup 0 3 6 688trap cleanup_exit 2 9 689 690cleanup 691bpf_tunnel_test 692 693if [ $? -ne 0 ]; then 694 echo -e "$(basename $0): ${RED}FAIL${NC}" 695 exit 1 696fi 697echo -e "$(basename $0): ${GREEN}PASS${NC}" 698exit 0 699