bpf_linux.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package netlink
  2. import (
  3. "unsafe"
  4. "golang.org/x/sys/unix"
  5. )
  6. type BpfProgType uint32
  7. const (
  8. BPF_PROG_TYPE_UNSPEC BpfProgType = iota
  9. BPF_PROG_TYPE_SOCKET_FILTER
  10. BPF_PROG_TYPE_KPROBE
  11. BPF_PROG_TYPE_SCHED_CLS
  12. BPF_PROG_TYPE_SCHED_ACT
  13. BPF_PROG_TYPE_TRACEPOINT
  14. BPF_PROG_TYPE_XDP
  15. BPF_PROG_TYPE_PERF_EVENT
  16. BPF_PROG_TYPE_CGROUP_SKB
  17. BPF_PROG_TYPE_CGROUP_SOCK
  18. BPF_PROG_TYPE_LWT_IN
  19. BPF_PROG_TYPE_LWT_OUT
  20. BPF_PROG_TYPE_LWT_XMIT
  21. BPF_PROG_TYPE_SOCK_OPS
  22. BPF_PROG_TYPE_SK_SKB
  23. BPF_PROG_TYPE_CGROUP_DEVICE
  24. BPF_PROG_TYPE_SK_MSG
  25. BPF_PROG_TYPE_RAW_TRACEPOINT
  26. BPF_PROG_TYPE_CGROUP_SOCK_ADDR
  27. BPF_PROG_TYPE_LWT_SEG6LOCAL
  28. BPF_PROG_TYPE_LIRC_MODE2
  29. BPF_PROG_TYPE_SK_REUSEPORT
  30. BPF_PROG_TYPE_FLOW_DISSECTOR
  31. BPF_PROG_TYPE_CGROUP_SYSCTL
  32. BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
  33. BPF_PROG_TYPE_CGROUP_SOCKOPT
  34. BPF_PROG_TYPE_TRACING
  35. BPF_PROG_TYPE_STRUCT_OPS
  36. BPF_PROG_TYPE_EXT
  37. BPF_PROG_TYPE_LSM
  38. BPF_PROG_TYPE_SK_LOOKUP
  39. )
  40. type BPFAttr struct {
  41. ProgType uint32
  42. InsnCnt uint32
  43. Insns uintptr
  44. License uintptr
  45. LogLevel uint32
  46. LogSize uint32
  47. LogBuf uintptr
  48. KernVersion uint32
  49. }
  50. // loadSimpleBpf loads a trivial bpf program for testing purposes.
  51. func loadSimpleBpf(progType BpfProgType, ret uint32) (int, error) {
  52. insns := []uint64{
  53. 0x00000000000000b7 | (uint64(ret) << 32),
  54. 0x0000000000000095,
  55. }
  56. license := []byte{'A', 'S', 'L', '2', '\x00'}
  57. attr := BPFAttr{
  58. ProgType: uint32(progType),
  59. InsnCnt: uint32(len(insns)),
  60. Insns: uintptr(unsafe.Pointer(&insns[0])),
  61. License: uintptr(unsafe.Pointer(&license[0])),
  62. }
  63. fd, _, errno := unix.Syscall(unix.SYS_BPF,
  64. 5, /* bpf cmd */
  65. uintptr(unsafe.Pointer(&attr)),
  66. unsafe.Sizeof(attr))
  67. if errno != 0 {
  68. return 0, errno
  69. }
  70. return int(fd), nil
  71. }