blob: 0429ff04d94aaad1a7a75629fd906385d99e63cb [file] [log] [blame]
/*****************************************************************************\
* ebpf.h - header file, library to handle BPF cgroup device constrains
*****************************************************************************
* Copyright (C) SchedMD LLC.
*
* This file is part of Slurm, a resource management program.
* For details, see <https://slurm.schedmd.com/>.
* Please also read the included file: DISCLAIMER.
*
* Slurm is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* In addition, as a special exception, the copyright holders give permission
* to link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file, and
* distribute linked combinations including the two. You must obey the GNU
* General Public License in all respects for all of the code used other than
* OpenSSL. If you modify file(s) with this exception, you may extend this
* exception to your version of the file(s), but you are not obligated to do
* so. If you do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source files in
* the program, then also delete it here.
*
* Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with Slurm; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\*****************************************************************************/
#ifndef _EBPF_H
#define _EBPF_H
#include <fcntl.h>
#include <linux/bpf.h>
#include <sys/syscall.h>
#include "slurm/slurm_errno.h"
#include "src/common/log.h"
#include "src/common/strlcpy.h"
#include "src/common/xmalloc.h"
typedef struct bpf_program {
size_t n_inst;
size_t prog_size;
struct bpf_insn *program;
} bpf_program_t;
#define EBPF_ACCEPT true
#define EBPF_DENY false
#define INIT_INST 6
#define CLOSE_INST 2
/*
* init_ebpf_prog - Initialize the bpf_program struct and include the INIT_INST
* instructions to it.
* OUT program - Pointer to the bpf_program_t to be initialized
*/
extern void init_ebpf_prog(bpf_program_t *program);
/*
* add_device_ebpf_prog - Add the instructions to accept or deny (based on the
* parameter accept) the device specified with dev_type, major and minor to the
* program.
* OUT program - Pointer to the bpf_program_t to add the device rule to.
* IN dev_type - can be BPF_DEVCG_DEV_BLOCK, BPF_DEVCG_DEV_CHAR or 0, if 0 is
* passed then the device type check is skipped.
* IN major - The major id of the device, if this parameter is NO_VAL then the
* major check is skipped.
* IN minor - The minor id of the device, if this parameter is NO_VAL then the
* minor check is skipped.
* RET SLURM_SUCCESS or SLURM_ERROR if more than 2 checks are skipped.
*/
extern int add_device_ebpf_prog(bpf_program_t *program, uint32_t dev_type,
uint32_t major, uint32_t minor, bool accept);
/*
* close_ebpf_prog - Adds the closing instructions to the bpf_program, this is
* the action that the program will do if none of the rules (added using
* add_device_ebpf_prog) are met.
* OUT close_ebpf_prog - Pointer to the bpf_program_t to be closed.
* IN def_action - What to set as default action allow any device(True) or
* deny(False)
*/
extern void close_ebpf_prog(bpf_program_t *close_ebpf_prog, bool def_action);
/*
* load_ebpf_prog - Loads the program and attaches it to a cgroup.
* OUT program - Pointer to the bpf_program_t to be loaded
* IN cgroup_path - Path to the cgroup the program needs to be attached to.
* IN override_flag - true sets BPF_F_ALLOW_OVERRIDE flag to the program, this
* indicates that any descendent cgroups bpf program will
* override this bpf program
* RET SLURM_SUCCESS on successful load, SLURM_ERROR otherwise.
*/
extern int load_ebpf_prog(bpf_program_t *program, const char cgroup_path[],
bool override_flag);
/*
* free_ebpf_prog -Frees the memory allocated by the program
* OUT program - Pointer to the bpf_program_t to free
*/
extern void free_ebpf_prog(bpf_program_t *program);
#endif