diff --git a/pkt-loop-filter/bpf-defs.h b/pkt-loop-filter/bpf-defs.h index dd1de0f..f1dedbb 100644 --- a/pkt-loop-filter/bpf-defs.h +++ b/pkt-loop-filter/bpf-defs.h @@ -27,6 +27,14 @@ struct net { __u64 net_cookie; } __attribute__((preserve_access_index)); +typedef struct { + __s64 counter; +} atomic64_t; + +struct net___old { + atomic64_t net_cookie; +} __attribute__((preserve_access_index)); + struct net_device { int ifindex; struct { @@ -38,4 +46,17 @@ struct netdev_notifier_info { struct net_device *dev; } __attribute__((preserve_access_index)); +static inline __u64 read_net_cookie(struct net *net) +{ + if (bpf_core_field_exists(net->net_cookie)) { + return BPF_CORE_READ(net, net_cookie); + } else { + struct net___old *n_old = (void *)net; + atomic64_t cookie_old; + + cookie_old = BPF_CORE_READ(n_old, net_cookie); + return cookie_old.counter; + } +} + #endif diff --git a/pkt-loop-filter/get-bond-active.kern.c b/pkt-loop-filter/get-bond-active.kern.c index bca35b9..e47d125 100644 --- a/pkt-loop-filter/get-bond-active.kern.c +++ b/pkt-loop-filter/get-bond-active.kern.c @@ -15,8 +15,9 @@ SEC("kprobe/bond_select_active_slave") int BPF_KPROBE(handle_select_slave, struct bonding *bond) { struct net_device *dev = BPF_PROBE_READ(bond, dev); + struct net *net = BPF_CORE_READ(dev, nd_net.net); int ifindex = BPF_CORE_READ(dev, ifindex); - __u64 cookie = BPF_CORE_READ(dev, nd_net.net, net_cookie); + __u64 cookie = read_net_cookie(net); if (cookie == netns_cookie && ifindex == bond_ifindex) { struct net_device *active_dev = BPF_PROBE_READ(bond, curr_active_slave, dev); diff --git a/pkt-loop-filter/pkt-loop-filter.kern.c b/pkt-loop-filter/pkt-loop-filter.kern.c index 2a47220..445e52a 100644 --- a/pkt-loop-filter/pkt-loop-filter.kern.c +++ b/pkt-loop-filter/pkt-loop-filter.kern.c @@ -156,8 +156,10 @@ SEC("kprobe/bond_change_active_slave") int BPF_KPROBE(handle_change_slave, struct bonding *bond, struct slave *new_active) { struct net_device *dev = BPF_PROBE_READ(bond, dev); + struct net *net = BPF_CORE_READ(dev, nd_net.net); int ifindex = BPF_CORE_READ(dev, ifindex); - __u64 cookie = BPF_CORE_READ(dev, nd_net.net, net_cookie); + __u64 cookie = read_net_cookie(net); + if (cookie == netns_cookie && ifindex == bond_ifindex && new_active) { struct net_device *new_dev;