Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: Add xdp_feature selftest for bond device

Introduce selftests to check xdp_feature support for bond driver.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Jussi Maki <joamaki@gmail.com>
Link: https://lore.kernel.org/bpf/64cb8f20e6491f5b971f8d3129335093c359aad7.1684329998.git.lorenzo@kernel.org

authored by

Lorenzo Bianconi and committed by
Daniel Borkmann
6cc385d2 18f55887

+121
+121
tools/testing/selftests/bpf/prog_tests/xdp_bonding.c
··· 18 18 #include <linux/if_bonding.h> 19 19 #include <linux/limits.h> 20 20 #include <linux/udp.h> 21 + #include <uapi/linux/netdev.h> 21 22 22 23 #include "xdp_dummy.skel.h" 23 24 #include "xdp_redirect_multi_kern.skel.h" ··· 493 492 system("ip link del bond_nest2"); 494 493 } 495 494 495 + static void test_xdp_bonding_features(struct skeletons *skeletons) 496 + { 497 + LIBBPF_OPTS(bpf_xdp_query_opts, query_opts); 498 + int bond_idx, veth1_idx, err; 499 + struct bpf_link *link = NULL; 500 + 501 + if (!ASSERT_OK(system("ip link add bond type bond"), "add bond")) 502 + goto out; 503 + 504 + bond_idx = if_nametoindex("bond"); 505 + if (!ASSERT_GE(bond_idx, 0, "if_nametoindex bond")) 506 + goto out; 507 + 508 + /* query default xdp-feature for bond device */ 509 + err = bpf_xdp_query(bond_idx, XDP_FLAGS_DRV_MODE, &query_opts); 510 + if (!ASSERT_OK(err, "bond bpf_xdp_query")) 511 + goto out; 512 + 513 + if (!ASSERT_EQ(query_opts.feature_flags, NETDEV_XDP_ACT_MASK, 514 + "bond query_opts.feature_flags")) 515 + goto out; 516 + 517 + if (!ASSERT_OK(system("ip link add veth0 type veth peer name veth1"), 518 + "add veth{0,1} pair")) 519 + goto out; 520 + 521 + if (!ASSERT_OK(system("ip link add veth2 type veth peer name veth3"), 522 + "add veth{2,3} pair")) 523 + goto out; 524 + 525 + if (!ASSERT_OK(system("ip link set veth0 master bond"), 526 + "add veth0 to master bond")) 527 + goto out; 528 + 529 + /* xdp-feature for bond device should be obtained from the single slave 530 + * device (veth0) 531 + */ 532 + err = bpf_xdp_query(bond_idx, XDP_FLAGS_DRV_MODE, &query_opts); 533 + if (!ASSERT_OK(err, "bond bpf_xdp_query")) 534 + goto out; 535 + 536 + if (!ASSERT_EQ(query_opts.feature_flags, 537 + NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | 538 + NETDEV_XDP_ACT_RX_SG, 539 + "bond query_opts.feature_flags")) 540 + goto out; 541 + 542 + veth1_idx = if_nametoindex("veth1"); 543 + if (!ASSERT_GE(veth1_idx, 0, "if_nametoindex veth1")) 544 + goto out; 545 + 546 + link = bpf_program__attach_xdp(skeletons->xdp_dummy->progs.xdp_dummy_prog, 547 + veth1_idx); 548 + if (!ASSERT_OK_PTR(link, "attach program to veth1")) 549 + goto out; 550 + 551 + /* xdp-feature for veth0 are changed */ 552 + err = bpf_xdp_query(bond_idx, XDP_FLAGS_DRV_MODE, &query_opts); 553 + if (!ASSERT_OK(err, "bond bpf_xdp_query")) 554 + goto out; 555 + 556 + if (!ASSERT_EQ(query_opts.feature_flags, 557 + NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | 558 + NETDEV_XDP_ACT_RX_SG | NETDEV_XDP_ACT_NDO_XMIT | 559 + NETDEV_XDP_ACT_NDO_XMIT_SG, 560 + "bond query_opts.feature_flags")) 561 + goto out; 562 + 563 + if (!ASSERT_OK(system("ip link set veth2 master bond"), 564 + "add veth2 to master bond")) 565 + goto out; 566 + 567 + err = bpf_xdp_query(bond_idx, XDP_FLAGS_DRV_MODE, &query_opts); 568 + if (!ASSERT_OK(err, "bond bpf_xdp_query")) 569 + goto out; 570 + 571 + /* xdp-feature for bond device should be set to the most restrict 572 + * value obtained from attached slave devices (veth0 and veth2) 573 + */ 574 + if (!ASSERT_EQ(query_opts.feature_flags, 575 + NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | 576 + NETDEV_XDP_ACT_RX_SG, 577 + "bond query_opts.feature_flags")) 578 + goto out; 579 + 580 + if (!ASSERT_OK(system("ip link set veth2 nomaster"), 581 + "del veth2 to master bond")) 582 + goto out; 583 + 584 + err = bpf_xdp_query(bond_idx, XDP_FLAGS_DRV_MODE, &query_opts); 585 + if (!ASSERT_OK(err, "bond bpf_xdp_query")) 586 + goto out; 587 + 588 + if (!ASSERT_EQ(query_opts.feature_flags, 589 + NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | 590 + NETDEV_XDP_ACT_RX_SG | NETDEV_XDP_ACT_NDO_XMIT | 591 + NETDEV_XDP_ACT_NDO_XMIT_SG, 592 + "bond query_opts.feature_flags")) 593 + goto out; 594 + 595 + if (!ASSERT_OK(system("ip link set veth0 nomaster"), 596 + "del veth0 to master bond")) 597 + goto out; 598 + 599 + err = bpf_xdp_query(bond_idx, XDP_FLAGS_DRV_MODE, &query_opts); 600 + if (!ASSERT_OK(err, "bond bpf_xdp_query")) 601 + goto out; 602 + 603 + ASSERT_EQ(query_opts.feature_flags, NETDEV_XDP_ACT_MASK, 604 + "bond query_opts.feature_flags"); 605 + out: 606 + bpf_link__destroy(link); 607 + system("ip link del veth0"); 608 + system("ip link del veth2"); 609 + system("ip link del bond"); 610 + } 611 + 496 612 static int libbpf_debug_print(enum libbpf_print_level level, 497 613 const char *format, va_list args) 498 614 { ··· 663 545 664 546 if (test__start_subtest("xdp_bonding_nested")) 665 547 test_xdp_bonding_nested(&skeletons); 548 + 549 + if (test__start_subtest("xdp_bonding_features")) 550 + test_xdp_bonding_features(&skeletons); 666 551 667 552 for (i = 0; i < ARRAY_SIZE(bond_test_cases); i++) { 668 553 struct bond_test_case *test_case = &bond_test_cases[i];