sockmap_verdict_prog.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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_rx = {
  13. .type = BPF_MAP_TYPE_SOCKMAP,
  14. .key_size = sizeof(int),
  15. .value_size = sizeof(int),
  16. .max_entries = 20,
  17. };
  18. struct bpf_map_def SEC("maps") sock_map_tx = {
  19. .type = BPF_MAP_TYPE_SOCKMAP,
  20. .key_size = sizeof(int),
  21. .value_size = sizeof(int),
  22. .max_entries = 20,
  23. };
  24. struct bpf_map_def SEC("maps") sock_map_msg = {
  25. .type = BPF_MAP_TYPE_SOCKMAP,
  26. .key_size = sizeof(int),
  27. .value_size = sizeof(int),
  28. .max_entries = 20,
  29. };
  30. struct bpf_map_def SEC("maps") sock_map_break = {
  31. .type = BPF_MAP_TYPE_ARRAY,
  32. .key_size = sizeof(int),
  33. .value_size = sizeof(int),
  34. .max_entries = 20,
  35. };
  36. SEC("sk_skb2")
  37. int bpf_prog2(struct __sk_buff *skb)
  38. {
  39. void *data_end = (void *)(long) skb->data_end;
  40. void *data = (void *)(long) skb->data;
  41. __u32 lport = skb->local_port;
  42. __u32 rport = skb->remote_port;
  43. __u8 *d = data;
  44. __u8 sk, map;
  45. if (data + 8 > data_end)
  46. return SK_DROP;
  47. map = d[0];
  48. sk = d[1];
  49. d[0] = 0xd;
  50. d[1] = 0xe;
  51. d[2] = 0xa;
  52. d[3] = 0xd;
  53. d[4] = 0xb;
  54. d[5] = 0xe;
  55. d[6] = 0xe;
  56. d[7] = 0xf;
  57. if (!map)
  58. return bpf_sk_redirect_map(skb, &sock_map_rx, sk, 0);
  59. return bpf_sk_redirect_map(skb, &sock_map_tx, sk, 0);
  60. }
  61. char _license[] SEC("license") = "GPL";