18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* eBPF example program: 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * - Loads eBPF program 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * The eBPF program loads a filter from file and attaches the 78c2ecf20Sopenharmony_ci * program to a cgroup using BPF_PROG_ATTACH 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#define _GNU_SOURCE 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <stdio.h> 138c2ecf20Sopenharmony_ci#include <stdlib.h> 148c2ecf20Sopenharmony_ci#include <stddef.h> 158c2ecf20Sopenharmony_ci#include <string.h> 168c2ecf20Sopenharmony_ci#include <unistd.h> 178c2ecf20Sopenharmony_ci#include <assert.h> 188c2ecf20Sopenharmony_ci#include <errno.h> 198c2ecf20Sopenharmony_ci#include <fcntl.h> 208c2ecf20Sopenharmony_ci#include <net/if.h> 218c2ecf20Sopenharmony_ci#include <linux/bpf.h> 228c2ecf20Sopenharmony_ci#include <bpf/bpf.h> 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#include "bpf_insn.h" 258c2ecf20Sopenharmony_ci#include "bpf_load.h" 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic int usage(const char *argv0) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci printf("Usage: %s cg-path filter-path [filter-id]\n", argv0); 308c2ecf20Sopenharmony_ci return EXIT_FAILURE; 318c2ecf20Sopenharmony_ci} 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ciint main(int argc, char **argv) 348c2ecf20Sopenharmony_ci{ 358c2ecf20Sopenharmony_ci int cg_fd, ret, filter_id = 0; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci if (argc < 3) 388c2ecf20Sopenharmony_ci return usage(argv[0]); 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci cg_fd = open(argv[1], O_DIRECTORY | O_RDONLY); 418c2ecf20Sopenharmony_ci if (cg_fd < 0) { 428c2ecf20Sopenharmony_ci printf("Failed to open cgroup path: '%s'\n", strerror(errno)); 438c2ecf20Sopenharmony_ci return EXIT_FAILURE; 448c2ecf20Sopenharmony_ci } 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci if (load_bpf_file(argv[2])) 478c2ecf20Sopenharmony_ci return EXIT_FAILURE; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci printf("Output from kernel verifier:\n%s\n-------\n", bpf_log_buf); 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci if (argc > 3) 528c2ecf20Sopenharmony_ci filter_id = atoi(argv[3]); 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci if (filter_id >= prog_cnt) { 558c2ecf20Sopenharmony_ci printf("Invalid program id; program not found in file\n"); 568c2ecf20Sopenharmony_ci return EXIT_FAILURE; 578c2ecf20Sopenharmony_ci } 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci ret = bpf_prog_attach(prog_fd[filter_id], cg_fd, 608c2ecf20Sopenharmony_ci BPF_CGROUP_INET_SOCK_CREATE, 0); 618c2ecf20Sopenharmony_ci if (ret < 0) { 628c2ecf20Sopenharmony_ci printf("Failed to attach prog to cgroup: '%s'\n", 638c2ecf20Sopenharmony_ci strerror(errno)); 648c2ecf20Sopenharmony_ci return EXIT_FAILURE; 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci return EXIT_SUCCESS; 688c2ecf20Sopenharmony_ci} 69