On 7/16/24 12:13 PM, Alexis Lothoré (eBPF Foundation) wrote: [...]
+static int attach_programs_to_veth_pair(struct skeletons *skeletons, int index) +{
- struct bpf_program *local_prog, *remote_prog;
 - struct bpf_link **local_link, **remote_link;
 - struct nstoken *nstoken;
 - struct bpf_link *link;
 - int interface;
 - switch (index) {
 - case 0:
 local_prog = skeletons->xdp_redirect_maps->progs.xdp_redirect_map_0;local_link = &skeletons->xdp_redirect_maps->links.xdp_redirect_map_0;remote_prog = skeletons->xdp_dummy->progs.xdp_dummy_prog;remote_link = &skeletons->xdp_dummy->links.xdp_dummy_prog;break;- case 1:
 local_prog = skeletons->xdp_redirect_maps->progs.xdp_redirect_map_1;local_link = &skeletons->xdp_redirect_maps->links.xdp_redirect_map_1;remote_prog = skeletons->xdp_tx->progs.xdp_tx;remote_link = &skeletons->xdp_tx->links.xdp_tx;break;- case 2:
 local_prog = skeletons->xdp_redirect_maps->progs.xdp_redirect_map_2;local_link = &skeletons->xdp_redirect_maps->links.xdp_redirect_map_2;remote_prog = skeletons->xdp_dummy->progs.xdp_dummy_prog;remote_link = &skeletons->xdp_dummy->links.xdp_dummy_prog;break;- }
 - interface = if_nametoindex(config[index].local_veth);
 - if (!ASSERT_NEQ(interface, 0, "non zero interface index"))
 return -1;- link = bpf_program__attach_xdp(local_prog, interface);
 - if (!ASSERT_OK_PTR(link, "attach xdp program to local veth"))
 return -1;- *local_link = link;
 - nstoken = open_netns(config[index].namespace);
 - if (!ASSERT_OK_PTR(nstoken, "switch to remote veth namespace"))
 return -1;- interface = if_nametoindex(config[index].remote_veth);
 - if (!ASSERT_NEQ(interface, 0, "non zero interface index"))
 return -1;
Missing `close_netns(nstoken);` in error path here, otherwise looks reasonable to me.
- link = bpf_program__attach_xdp(remote_prog, interface);
 - *remote_link = link;
 - close_netns(nstoken);
 - if (!ASSERT_OK_PTR(link, "attach xdp program to remote veth"))
 return -1;- return 0;
 +}
Thanks, Daniel