test_tcp_hdr_options.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /* Copyright (c) 2020 Facebook */
  3. #ifndef _TEST_TCP_HDR_OPTIONS_H
  4. #define _TEST_TCP_HDR_OPTIONS_H
  5. struct bpf_test_option {
  6. __u8 flags;
  7. __u8 max_delack_ms;
  8. __u8 rand;
  9. } __attribute__((packed));
  10. enum {
  11. OPTION_RESEND,
  12. OPTION_MAX_DELACK_MS,
  13. OPTION_RAND,
  14. __NR_OPTION_FLAGS,
  15. };
  16. #define OPTION_F_RESEND (1 << OPTION_RESEND)
  17. #define OPTION_F_MAX_DELACK_MS (1 << OPTION_MAX_DELACK_MS)
  18. #define OPTION_F_RAND (1 << OPTION_RAND)
  19. #define OPTION_MASK ((1 << __NR_OPTION_FLAGS) - 1)
  20. #define TEST_OPTION_FLAGS(flags, option) (1 & ((flags) >> (option)))
  21. #define SET_OPTION_FLAGS(flags, option) ((flags) |= (1 << (option)))
  22. /* Store in bpf_sk_storage */
  23. struct hdr_stg {
  24. bool active;
  25. bool resend_syn; /* active side only */
  26. bool syncookie; /* passive side only */
  27. bool fastopen; /* passive side only */
  28. };
  29. struct linum_err {
  30. unsigned int linum;
  31. int err;
  32. };
  33. #define TCPHDR_FIN 0x01
  34. #define TCPHDR_SYN 0x02
  35. #define TCPHDR_RST 0x04
  36. #define TCPHDR_PSH 0x08
  37. #define TCPHDR_ACK 0x10
  38. #define TCPHDR_URG 0x20
  39. #define TCPHDR_ECE 0x40
  40. #define TCPHDR_CWR 0x80
  41. #define TCPHDR_SYNACK (TCPHDR_SYN | TCPHDR_ACK)
  42. #define TCPOPT_EOL 0
  43. #define TCPOPT_NOP 1
  44. #define TCPOPT_MSS 2
  45. #define TCPOPT_WINDOW 3
  46. #define TCPOPT_EXP 254
  47. #define TCP_BPF_EXPOPT_BASE_LEN 4
  48. #define MAX_TCP_HDR_LEN 60
  49. #define MAX_TCP_OPTION_SPACE 40
  50. #ifdef BPF_PROG_TEST_TCP_HDR_OPTIONS
  51. #define CG_OK 1
  52. #define CG_ERR 0
  53. #ifndef SOL_TCP
  54. #define SOL_TCP 6
  55. #endif
  56. struct tcp_exprm_opt {
  57. __u8 kind;
  58. __u8 len;
  59. __u16 magic;
  60. union {
  61. __u8 data[4];
  62. __u32 data32;
  63. };
  64. } __attribute__((packed));
  65. struct tcp_opt {
  66. __u8 kind;
  67. __u8 len;
  68. union {
  69. __u8 data[4];
  70. __u32 data32;
  71. };
  72. } __attribute__((packed));
  73. struct {
  74. __uint(type, BPF_MAP_TYPE_HASH);
  75. __uint(max_entries, 2);
  76. __type(key, int);
  77. __type(value, struct linum_err);
  78. } lport_linum_map SEC(".maps");
  79. static inline unsigned int tcp_hdrlen(const struct tcphdr *th)
  80. {
  81. return th->doff << 2;
  82. }
  83. static inline __u8 skops_tcp_flags(const struct bpf_sock_ops *skops)
  84. {
  85. return skops->skb_tcp_flags;
  86. }
  87. static inline void clear_hdr_cb_flags(struct bpf_sock_ops *skops)
  88. {
  89. bpf_sock_ops_cb_flags_set(skops,
  90. skops->bpf_sock_ops_cb_flags &
  91. ~(BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG |
  92. BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG));
  93. }
  94. static inline void set_hdr_cb_flags(struct bpf_sock_ops *skops, __u32 extra)
  95. {
  96. bpf_sock_ops_cb_flags_set(skops,
  97. skops->bpf_sock_ops_cb_flags |
  98. BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG |
  99. BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG |
  100. extra);
  101. }
  102. static inline void
  103. clear_parse_all_hdr_cb_flags(struct bpf_sock_ops *skops)
  104. {
  105. bpf_sock_ops_cb_flags_set(skops,
  106. skops->bpf_sock_ops_cb_flags &
  107. ~BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG);
  108. }
  109. static inline void
  110. set_parse_all_hdr_cb_flags(struct bpf_sock_ops *skops)
  111. {
  112. bpf_sock_ops_cb_flags_set(skops,
  113. skops->bpf_sock_ops_cb_flags |
  114. BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG);
  115. }
  116. #define RET_CG_ERR(__err) ({ \
  117. struct linum_err __linum_err; \
  118. int __lport; \
  119. \
  120. __linum_err.linum = __LINE__; \
  121. __linum_err.err = __err; \
  122. __lport = skops->local_port; \
  123. bpf_map_update_elem(&lport_linum_map, &__lport, &__linum_err, BPF_NOEXIST); \
  124. clear_hdr_cb_flags(skops); \
  125. clear_parse_all_hdr_cb_flags(skops); \
  126. return CG_ERR; \
  127. })
  128. #endif /* BPF_PROG_TEST_TCP_HDR_OPTIONS */
  129. #endif /* _TEST_TCP_HDR_OPTIONS_H */