filter.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * Linux Socket Filter Data Structures
  3. */
  4. #ifndef __LINUX_FILTER_H__
  5. #define __LINUX_FILTER_H__
  6. #include <linux/atomic.h>
  7. #include <linux/compat.h>
  8. #include <linux/workqueue.h>
  9. #include <uapi/linux/filter.h>
  10. #ifdef CONFIG_COMPAT
  11. /*
  12. * A struct sock_filter is architecture independent.
  13. */
  14. struct compat_sock_fprog {
  15. u16 len;
  16. compat_uptr_t filter; /* struct sock_filter * */
  17. };
  18. #endif
  19. struct sk_buff;
  20. struct sock;
  21. struct sk_filter
  22. {
  23. atomic_t refcnt;
  24. unsigned int len; /* Number of filter blocks */
  25. struct rcu_head rcu;
  26. unsigned int (*bpf_func)(const struct sk_buff *skb,
  27. const struct sock_filter *filter);
  28. union {
  29. struct sock_filter insns[0];
  30. struct work_struct work;
  31. };
  32. };
  33. static inline unsigned int sk_filter_size(unsigned int proglen)
  34. {
  35. return max(sizeof(struct sk_filter),
  36. offsetof(struct sk_filter, insns[proglen]));
  37. }
  38. extern int sk_filter(struct sock *sk, struct sk_buff *skb);
  39. extern unsigned int sk_run_filter(const struct sk_buff *skb,
  40. const struct sock_filter *filter);
  41. extern int sk_unattached_filter_create(struct sk_filter **pfp,
  42. struct sock_fprog *fprog);
  43. extern void sk_unattached_filter_destroy(struct sk_filter *fp);
  44. extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);
  45. extern int sk_detach_filter(struct sock *sk);
  46. extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen);
  47. extern int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, unsigned len);
  48. extern void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to);
  49. #ifdef CONFIG_BPF_JIT
  50. #include <stdarg.h>
  51. #include <linux/linkage.h>
  52. #include <linux/printk.h>
  53. extern void bpf_jit_compile(struct sk_filter *fp);
  54. extern void bpf_jit_free(struct sk_filter *fp);
  55. static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen,
  56. u32 pass, void *image)
  57. {
  58. pr_err("flen=%u proglen=%u pass=%u image=%pK\n",
  59. flen, proglen, pass, image);
  60. if (image)
  61. print_hex_dump(KERN_ERR, "JIT code: ", DUMP_PREFIX_OFFSET,
  62. 16, 1, image, proglen, false);
  63. }
  64. #define SK_RUN_FILTER(FILTER, SKB) (*FILTER->bpf_func)(SKB, FILTER->insns)
  65. #else
  66. #include <linux/slab.h>
  67. static inline void bpf_jit_compile(struct sk_filter *fp)
  68. {
  69. }
  70. static inline void bpf_jit_free(struct sk_filter *fp)
  71. {
  72. kfree(fp);
  73. }
  74. #define SK_RUN_FILTER(FILTER, SKB) sk_run_filter(SKB, FILTER->insns)
  75. #endif
  76. enum {
  77. BPF_S_RET_K = 1,
  78. BPF_S_RET_A,
  79. BPF_S_ALU_ADD_K,
  80. BPF_S_ALU_ADD_X,
  81. BPF_S_ALU_SUB_K,
  82. BPF_S_ALU_SUB_X,
  83. BPF_S_ALU_MUL_K,
  84. BPF_S_ALU_MUL_X,
  85. BPF_S_ALU_DIV_X,
  86. BPF_S_ALU_MOD_K,
  87. BPF_S_ALU_MOD_X,
  88. BPF_S_ALU_AND_K,
  89. BPF_S_ALU_AND_X,
  90. BPF_S_ALU_OR_K,
  91. BPF_S_ALU_OR_X,
  92. BPF_S_ALU_XOR_K,
  93. BPF_S_ALU_XOR_X,
  94. BPF_S_ALU_LSH_K,
  95. BPF_S_ALU_LSH_X,
  96. BPF_S_ALU_RSH_K,
  97. BPF_S_ALU_RSH_X,
  98. BPF_S_ALU_NEG,
  99. BPF_S_LD_W_ABS,
  100. BPF_S_LD_H_ABS,
  101. BPF_S_LD_B_ABS,
  102. BPF_S_LD_W_LEN,
  103. BPF_S_LD_W_IND,
  104. BPF_S_LD_H_IND,
  105. BPF_S_LD_B_IND,
  106. BPF_S_LD_IMM,
  107. BPF_S_LDX_W_LEN,
  108. BPF_S_LDX_B_MSH,
  109. BPF_S_LDX_IMM,
  110. BPF_S_MISC_TAX,
  111. BPF_S_MISC_TXA,
  112. BPF_S_ALU_DIV_K,
  113. BPF_S_LD_MEM,
  114. BPF_S_LDX_MEM,
  115. BPF_S_ST,
  116. BPF_S_STX,
  117. BPF_S_JMP_JA,
  118. BPF_S_JMP_JEQ_K,
  119. BPF_S_JMP_JEQ_X,
  120. BPF_S_JMP_JGE_K,
  121. BPF_S_JMP_JGE_X,
  122. BPF_S_JMP_JGT_K,
  123. BPF_S_JMP_JGT_X,
  124. BPF_S_JMP_JSET_K,
  125. BPF_S_JMP_JSET_X,
  126. /* Ancillary data */
  127. BPF_S_ANC_PROTOCOL,
  128. BPF_S_ANC_PKTTYPE,
  129. BPF_S_ANC_IFINDEX,
  130. BPF_S_ANC_NLATTR,
  131. BPF_S_ANC_NLATTR_NEST,
  132. BPF_S_ANC_MARK,
  133. BPF_S_ANC_QUEUE,
  134. BPF_S_ANC_HATYPE,
  135. BPF_S_ANC_RXHASH,
  136. BPF_S_ANC_CPU,
  137. BPF_S_ANC_ALU_XOR_X,
  138. BPF_S_ANC_SECCOMP_LD_W,
  139. BPF_S_ANC_VLAN_TAG,
  140. BPF_S_ANC_VLAN_TAG_PRESENT,
  141. BPF_S_ANC_PAY_OFFSET,
  142. };
  143. #endif /* __LINUX_FILTER_H__ */