/* Setup new networking namespaces, with a veth pair. */
SYS(out, "ip netns add " TX_NETNS_NAME);
SYS(out, "ip netns add " RX_NETNS_NAME);
tok = open_netns(TX_NETNS_NAME); if (!ASSERT_OK_PTR(tok, "setns")) goto out;
SYS(out, "ip link add numtxqueues 1 numrxqueues 1 " TX_NAME " type veth peer " RX_NAME " numtxqueues 1 numrxqueues 1");
SYS(out, "ip link set " RX_NAME " netns " RX_NETNS_NAME);
SYS(out, "ip link set dev " TX_NAME " address " TX_MAC);
SYS(out, "ip link set dev " TX_NAME " up");
SYS(out, "ip link add link " TX_NAME " " TX_NAME_VLAN " type vlan proto " VLAN_PROTO " id " TO_STR(VLAN_ID));
SYS(out, "ip link set dev " TX_NAME_VLAN " up");
SYS(out, "ip addr add " TX_ADDR "/" PREFIX_LEN " dev " TX_NAME_VLAN);
switch_ns_to_rx(&tok); if (!ASSERT_OK_PTR(tok, "setns rx")) goto out;
SYS(out, "ip link set dev " RX_NAME " address " RX_MAC);
SYS(out, "ip link set dev " RX_NAME " up");
SYS(out, "ip addr add " RX_ADDR "/" PREFIX_LEN " dev " RX_NAME);
rx_ifindex = if_nametoindex(RX_NAME);
/* Setup separate AF_XDP for RX interface. */
ret = open_xsk(rx_ifindex, &rx_xsk); if (!ASSERT_OK(ret, "open_xsk(RX_NAME)")) goto out;
bpf_obj = xdp_metadata__open(); if (!ASSERT_OK_PTR(bpf_obj, "open skeleton")) goto out;
/* Make sure we can load a dev-bound program that performs * XDP_REDIRECT into a devmap.
*/
new_prog = bpf_object__find_program_by_name(bpf_obj->obj, "redirect");
bpf_program__set_ifindex(new_prog, rx_ifindex);
bpf_program__set_flags(new_prog, BPF_F_XDP_DEV_BOUND_ONLY);
if (!ASSERT_OK(xdp_metadata__load(bpf_obj), "load skeleton")) goto out;
/* Make sure we can't add dev-bound programs to prog maps. */
prog_arr = bpf_object__find_map_by_name(bpf_obj->obj, "prog_arr"); if (!ASSERT_OK_PTR(prog_arr, "no prog_arr map")) goto out;
val = bpf_program__fd(prog); if (!ASSERT_ERR(bpf_map__update_elem(prog_arr, &key, sizeof(key),
&val, sizeof(val), BPF_ANY), "update prog_arr")) goto out;
/* Make sure we can't add dev-bound programs to devmaps. */
devmap = bpf_object__find_map_by_name(bpf_obj->obj, "dev_map"); if (!ASSERT_OK_PTR(devmap, "no dev_map found")) goto out;
ret = bpf_xdp_attach(rx_ifindex,
bpf_program__fd(bpf_obj->progs.rx),
XDP_FLAGS, NULL); if (!ASSERT_GE(ret, 0, "bpf_xdp_attach")) goto out;
sock_fd = xsk_socket__fd(rx_xsk.socket);
ret = bpf_map_update_elem(bpf_map__fd(bpf_obj->maps.xsk), &queue_id, &sock_fd, 0); if (!ASSERT_GE(ret, 0, "bpf_map_update_elem")) goto out;
switch_ns_to_tx(&tok); if (!ASSERT_OK_PTR(tok, "setns tx")) goto out;
/* Setup separate AF_XDP for TX interface nad send packet to the RX socket. */
tx_ifindex = if_nametoindex(TX_NAME);
ret = open_xsk(tx_ifindex, &tx_xsk); if (!ASSERT_OK(ret, "open_xsk(TX_NAME)")) goto out;
if (!ASSERT_GE(generate_packet(&tx_xsk, AF_XDP_CONSUMER_PORT), 0, "generate AF_XDP_CONSUMER_PORT")) goto out;
switch_ns_to_rx(&tok); if (!ASSERT_OK_PTR(tok, "setns rx")) goto out;
/* Verify packet sent from AF_XDP has proper metadata. */ if (!ASSERT_GE(verify_xsk_metadata(&rx_xsk, true), 0, "verify_xsk_metadata")) goto out;
switch_ns_to_tx(&tok); if (!ASSERT_OK_PTR(tok, "setns tx")) goto out;
complete_tx(&tx_xsk);
/* Now check metadata of packet, generated with network stack */ if (!ASSERT_GE(generate_packet_inet(), 0, "generate UDP packet")) goto out;
switch_ns_to_rx(&tok); if (!ASSERT_OK_PTR(tok, "setns rx")) goto out;
if (!ASSERT_GE(verify_xsk_metadata(&rx_xsk, false), 0, "verify_xsk_metadata")) goto out;
/* Make sure freplace correctly picks up original bound device * and doesn't crash.
*/
bpf_obj2 = xdp_metadata2__open(); if (!ASSERT_OK_PTR(bpf_obj2, "open skeleton")) goto out;
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.