If program is bound to a device, print the name of the relevant interface or unknown if the netdev has since been removed.
Unified · Split
| @@ -41,6 +41,7 @@ · 40 unmodified lines | ||
| 41 | 41 | #include <string.h> |
| 42 | 42 | #include <time.h> |
| 43 | 43 | #include <unistd.h> |
| 44 | +#include <net/if.h> | |
| 44 | 45 | #include <sys/types.h> |
| 45 | 46 | #include <sys/stat.h> |
| 46 | 47 | |
| @@ -229,6 +230,21 @@ static void print_prog_json(struct bpf_prog_info *info, int fd) · 182 unmodified lines | ||
| 229 | 230 | info->tag[0], info->tag[1], info->tag[2], info->tag[3], |
| 230 | 231 | info->tag[4], info->tag[5], info->tag[6], info->tag[7]); |
| 231 | 232 | |
| 233 | + if (info->status & BPF_PROG_STATUS_DEV_BOUND) { | |
| 234 | + jsonw_name(json_wtr, "dev"); | |
| 235 | + if (info->ifindex) { | |
| 236 | + char name[IF_NAMESIZE]; | |
| 237 | + | |
| 238 | + if (!if_indextoname(info->ifindex, name)) | |
| 239 | + jsonw_printf(json_wtr, "\"ifindex:%d\"", | |
| 240 | + info->ifindex); | |
| 241 | + else | |
| 242 | + jsonw_printf(json_wtr, "\"%s\"", name); | |
| 243 | + } else { | |
| 244 | + jsonw_printf(json_wtr, "\"unknown\""); | |
| 245 | + } | |
| 246 | + } | |
| 247 | + | |
| 232 | 248 | if (info->load_time) { |
| 233 | 249 | char buf[32]; |
| 234 | 250 | |
| @@ -274,6 +290,21 @@ static void print_prog_plain(struct bpf_prog_info *info, int fd) · 39 unmodified lines | ||
| 274 | 290 | |
| 275 | 291 | printf("tag "); |
| 276 | 292 | fprint_hex(stdout, info->tag, BPF_TAG_SIZE, ""); |
| 293 | + printf(" "); | |
| 294 | + | |
| 295 | + if (info->status & BPF_PROG_STATUS_DEV_BOUND) { | |
| 296 | + printf("dev "); | |
| 297 | + if (info->ifindex) { | |
| 298 | + char name[IF_NAMESIZE]; | |
| 299 | + | |
| 300 | + if (!if_indextoname(info->ifindex, name)) | |
| 301 | + printf("ifindex:%d ", info->ifindex); | |
| 302 | + else | |
| 303 | + printf("%s ", name); | |
| 304 | + } else { | |
| 305 | + printf("unknown "); | |
| 306 | + } | |
| 307 | + } | |
| 277 | 308 | printf("\n"); |
| 278 | 309 | |
| 279 | 310 | if (info->load_time) { |
| @@ -259,6 +259,7 @@ union bpf_attr { · 258 unmodified lines | ||
| 259 | 259 | __u32 kern_version; /* checked when prog_type=kprobe */ |
| 260 | 260 | __u32 prog_flags; |
| 261 | 261 | char prog_name[BPF_OBJ_NAME_LEN]; |
| 262 | + __u32 prog_target_ifindex; /* ifindex of netdev to prep for */ | |
| 262 | 263 | }; |
| 263 | 264 | |
| 264 | 265 | struct { /* anonymous struct used by BPF_OBJ_* commands */ |
| @@ -893,6 +894,10 @@ enum sk_action { · 628 unmodified lines | ||
| 893 | 894 | |
| 894 | 895 | #define BPF_TAG_SIZE 8 |
| 895 | 896 | |
| 897 | +enum bpf_prog_status { | |
| 898 | + BPF_PROG_STATUS_DEV_BOUND = (1 << 0), | |
| 899 | +}; | |
| 900 | + | |
| 896 | 901 | struct bpf_prog_info { |
| 897 | 902 | __u32 type; |
| 898 | 903 | __u32 id; |
| @@ -906,6 +911,8 @@ struct bpf_prog_info { · 7 unmodified lines | ||
| 906 | 911 | __u32 nr_map_ids; |
| 907 | 912 | __aligned_u64 map_ids; |
| 908 | 913 | char name[BPF_OBJ_NAME_LEN]; |
| 914 | + __u32 ifindex; | |
| 915 | + __u32 status; | |
| 909 | 916 | } __attribute__((aligned(8))); |
| 910 | 917 | |
| 911 | 918 | struct bpf_map_info { |