mirror of
https://github.com/vishvananda/netlink
synced 2025-01-10 17:09:26 +00:00
fadc1088f6
* Add netlink definitions for extra IFLAs The relevant IFLA_* are defined in the kernel but not in the syscall package. * Parameterize the return value of loadSimpleBpf Allow the return value of the bpf program created by loadSimpleBpf to be specified by the caller. Before this, the value was hardcoded to 1. * Add support for a new IFLA that enables using a bpf program as a filter early in the driver path of some NICs. * Add a test for set/get of an xdp program. Since currently, the XDP IFLA is optional, check that the hardware supports it before trying to set the field. Signed-off-by: Brenden Blanco <bblanco@plumgrid.com>
63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package netlink
|
|
|
|
/*
|
|
#include <asm/types.h>
|
|
#include <asm/unistd.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <unistd.h>
|
|
|
|
static int load_simple_bpf(int prog_type, int ret) {
|
|
#ifdef __NR_bpf
|
|
// { return ret; }
|
|
__u64 __attribute__((aligned(8))) insns[] = {
|
|
0x00000000000000b7ull | ((__u64)ret<<32),
|
|
0x0000000000000095ull,
|
|
};
|
|
__u8 __attribute__((aligned(8))) license[] = "ASL2";
|
|
// Copied from a header file since libc is notoriously slow to update.
|
|
// The call will succeed or fail and that will be our indication on
|
|
// whether or not it is supported.
|
|
struct {
|
|
__u32 prog_type;
|
|
__u32 insn_cnt;
|
|
__u64 insns;
|
|
__u64 license;
|
|
__u32 log_level;
|
|
__u32 log_size;
|
|
__u64 log_buf;
|
|
__u32 kern_version;
|
|
} __attribute__((aligned(8))) attr = {
|
|
.prog_type = prog_type,
|
|
.insn_cnt = 2,
|
|
.insns = (uintptr_t)&insns,
|
|
.license = (uintptr_t)&license,
|
|
};
|
|
return syscall(__NR_bpf, 5, &attr, sizeof(attr));
|
|
#else
|
|
errno = EINVAL;
|
|
return -1;
|
|
#endif
|
|
}
|
|
*/
|
|
import "C"
|
|
|
|
type BpfProgType C.int
|
|
|
|
const (
|
|
BPF_PROG_TYPE_UNSPEC BpfProgType = iota
|
|
BPF_PROG_TYPE_SOCKET_FILTER
|
|
BPF_PROG_TYPE_KPROBE
|
|
BPF_PROG_TYPE_SCHED_CLS
|
|
BPF_PROG_TYPE_SCHED_ACT
|
|
BPF_PROG_TYPE_TRACEPOINT
|
|
BPF_PROG_TYPE_XDP
|
|
)
|
|
|
|
// loadSimpleBpf loads a trivial bpf program for testing purposes
|
|
func loadSimpleBpf(progType BpfProgType, ret int) (int, error) {
|
|
fd, err := C.load_simple_bpf(C.int(progType), C.int(ret))
|
|
return int(fd), err
|
|
}
|