sockmap_verdict_prog.c 1023 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <linux/bpf.h>
  2. #include "bpf_helpers.h"
  3. #include "bpf_util.h"
  4. #include "bpf_endian.h"
  5. int _version SEC("version") = 1;
  6. #define bpf_printk(fmt, ...) \
  7. ({ \
  8. char ____fmt[] = fmt; \
  9. bpf_trace_printk(____fmt, sizeof(____fmt), \
  10. ##__VA_ARGS__); \
  11. })
  12. struct bpf_map_def SEC("maps") sock_map = {
  13. .type = BPF_MAP_TYPE_SOCKMAP,
  14. .key_size = sizeof(int),
  15. .value_size = sizeof(int),
  16. .max_entries = 20,
  17. };
  18. SEC("sk_skb2")
  19. int bpf_prog2(struct __sk_buff *skb)
  20. {
  21. void *data_end = (void *)(long) skb->data_end;
  22. void *data = (void *)(long) skb->data;
  23. __u32 lport = skb->local_port;
  24. __u32 rport = skb->remote_port;
  25. char *d = data;
  26. if (data + 8 > data_end)
  27. return SK_DROP;
  28. d[0] = 0xd;
  29. d[1] = 0xe;
  30. d[2] = 0xa;
  31. d[3] = 0xd;
  32. d[4] = 0xb;
  33. d[5] = 0xe;
  34. d[6] = 0xe;
  35. d[7] = 0xf;
  36. bpf_printk("verdict: data[0] = (%u): local_port %i remote %i redirect 5\n",
  37. d[0], lport, bpf_ntohl(rport));
  38. return bpf_sk_redirect_map(&sock_map, 5, 0);
  39. }
  40. char _license[] SEC("license") = "GPL";