Skip to content

Instantly share code, notes, and snippets.

Last active August 7, 2019 02:13
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
xdp test
# vm1 hostip, the XDP prog is attached on enp0s9
# vm2 hostip
# exchange id and remoteid vm2
brctl addbr br1
ip l set br1 up
ip a add 172.19.$id.1/24 dev br1
ip netns add $ctn
ip l add dev vhost type veth peer name vsbx
ip l set dev vsbx netns $ctn
ip netns exec $ctn ip ad add $ip dev vsbx
ip netns exec $ctn ip link set dev vsbx up
ip netns exec $ctn ip route add default via 172.19.$id.1 dev vsbx onlink
ip link set dev vhost up
brctl addif br1 vhost
ip r add 172.19.$remoteid.0/24 via$remoteid dev enp0s9
sysctl -w net.ipv4.ip_forward=1
iptables -t filter -P FORWARD ACCEPT
# make sure network setup success before attach XDP prog
ip netns exec ns1 ping 172.19.$remoteid.2
int SEC("xdp/prog1") xdp_dummy(struct xdp_md *ctx) {
void* data_end = (void*)(long)ctx->data_end;
void* data = (void*)(long)ctx->data;
struct ethhdr *eth = data;
__u32 nh_off = sizeof(*eth);
if (data+nh_off > data_end){
return XDP_DROP;
__be16 eth_proto = eth->h_proto;
if (eth_proto != BE_ETH_P_IP){
return XDP_PASS;
struct iphdr *iph = data+nh_off;
if (iph + 1 > data_end){
return XDP_DROP;
__u32 iph_len = iph->ihl<<2;
struct dev *cdev;
__be32 daddr = iph->daddr;
cdev = bpf_map_lookup_elem(&local_ips, &daddr);
if (cdev) {
memcpy(eth->h_dest, cdev->mac, ETH_ALEN); // mac addr of vsbx
int res = bpf_redirect_map(&dev_map, cdev->dev_idx, 0); // dev_idx is vhost or br1(both failed)
if (res == XDP_REDIRECT) {
bpf_debug("redirect success to %d\n", cdev->dev_idx); // I can see this message in trace_pipe
} else {
bpf_debug("redirect failed %d\n", res);
return res;
} else {
bpf_debug("no dev for %x found\n", daddr);
return XDP_PASS;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment