1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Copyright (c) 2020 Facebook */ |
3 | #include "bpf_iter.h" |
4 | #include "bpf_tracing_net.h" |
5 | #include <bpf/bpf_helpers.h> |
6 | |
7 | char _license[] SEC("license" ) = "GPL" ; |
8 | |
9 | extern bool CONFIG_IPV6_SUBTREES __kconfig __weak; |
10 | |
11 | SEC("iter/ipv6_route" ) |
12 | int dump_ipv6_route(struct bpf_iter__ipv6_route *ctx) |
13 | { |
14 | struct seq_file *seq = ctx->meta->seq; |
15 | struct fib6_info *rt = ctx->rt; |
16 | const struct net_device *dev; |
17 | struct fib6_nh *fib6_nh; |
18 | unsigned int flags; |
19 | struct nexthop *nh; |
20 | |
21 | if (rt == (void *)0) |
22 | return 0; |
23 | |
24 | fib6_nh = &rt->fib6_nh[0]; |
25 | flags = rt->fib6_flags; |
26 | |
27 | /* FIXME: nexthop_is_multipath is not handled here. */ |
28 | nh = rt->nh; |
29 | if (rt->nh) |
30 | fib6_nh = &nh->nh_info->fib6_nh; |
31 | |
32 | BPF_SEQ_PRINTF(seq, "%pi6 %02x " , &rt->fib6_dst.addr, rt->fib6_dst.plen); |
33 | |
34 | if (CONFIG_IPV6_SUBTREES) |
35 | BPF_SEQ_PRINTF(seq, "%pi6 %02x " , &rt->fib6_src.addr, |
36 | rt->fib6_src.plen); |
37 | else |
38 | BPF_SEQ_PRINTF(seq, "00000000000000000000000000000000 00 " ); |
39 | |
40 | if (fib6_nh->fib_nh_gw_family) { |
41 | flags |= RTF_GATEWAY; |
42 | BPF_SEQ_PRINTF(seq, "%pi6 " , &fib6_nh->fib_nh_gw6); |
43 | } else { |
44 | BPF_SEQ_PRINTF(seq, "00000000000000000000000000000000 " ); |
45 | } |
46 | |
47 | dev = fib6_nh->fib_nh_dev; |
48 | if (dev) |
49 | BPF_SEQ_PRINTF(seq, "%08x %08x %08x %08x %8s\n" , rt->fib6_metric, |
50 | rt->fib6_ref.refs.counter, 0, flags, dev->name); |
51 | else |
52 | BPF_SEQ_PRINTF(seq, "%08x %08x %08x %08x\n" , rt->fib6_metric, |
53 | rt->fib6_ref.refs.counter, 0, flags); |
54 | |
55 | return 0; |
56 | } |
57 | |