cregit-Linux how code gets into the kernel

Release 4.10 samples/bpf/test_cgrp2_sock.c

Directory: samples/bpf
/* eBPF example program:
 *
 * - Loads eBPF program
 *
 *   The eBPF program sets the sk_bound_dev_if index in new AF_INET{6}
 *   sockets opened by processes in the cgroup.
 *
 * - Attaches the new program to a cgroup using BPF_PROG_ATTACH
 */


#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <net/if.h>
#include <linux/bpf.h>

#include "libbpf.h"


char bpf_log_buf[BPF_LOG_BUF_SIZE];


static int prog_load(int idx) { struct bpf_insn prog[] = { BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), BPF_MOV64_IMM(BPF_REG_3, idx), BPF_MOV64_IMM(BPF_REG_2, offsetof(struct bpf_sock, bound_dev_if)), BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, offsetof(struct bpf_sock, bound_dev_if)), BPF_MOV64_IMM(BPF_REG_0, 1), /* r0 = verdict */ BPF_EXIT_INSN(), }; size_t insns_cnt = sizeof(prog) / sizeof(struct bpf_insn); return bpf_load_program(BPF_PROG_TYPE_CGROUP_SOCK, prog, insns_cnt, "GPL", 0, bpf_log_buf, BPF_LOG_BUF_SIZE); }

Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern8380.58%133.33%
joe stringerjoe stringer2019.42%266.67%
Total103100.00%3100.00%


static int usage(const char *argv0) { printf("Usage: %s cg-path device-index\n", argv0); return EXIT_FAILURE; }

Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern21100.00%1100.00%
Total21100.00%1100.00%


int main(int argc, char **argv) { int cg_fd, prog_fd, ret; unsigned int idx; if (argc < 2) return usage(argv[0]); idx = if_nametoindex(argv[2]); if (!idx) { printf("Invalid device name\n"); return EXIT_FAILURE; } cg_fd = open(argv[1], O_DIRECTORY | O_RDONLY); if (cg_fd < 0) { printf("Failed to open cgroup path: '%s'\n", strerror(errno)); return EXIT_FAILURE; } prog_fd = prog_load(idx); printf("Output from kernel verifier:\n%s\n-------\n", bpf_log_buf); if (prog_fd < 0) { printf("Failed to load prog: '%s'\n", strerror(errno)); return EXIT_FAILURE; } ret = bpf_prog_attach(prog_fd, cg_fd, BPF_CGROUP_INET_SOCK_CREATE, 0); if (ret < 0) { printf("Failed to attach prog to cgroup: '%s'\n", strerror(errno)); return EXIT_FAILURE; } return EXIT_SUCCESS; }

Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern16998.83%150.00%
alexei starovoitovalexei starovoitov21.17%150.00%
Total171100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern31091.72%125.00%
joe stringerjoe stringer267.69%250.00%
alexei starovoitovalexei starovoitov20.59%125.00%
Total338100.00%4100.00%
Directory: samples/bpf
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.