0001
0002
0003
0004 #ifndef _TEST_TCP_HDR_OPTIONS_H
0005 #define _TEST_TCP_HDR_OPTIONS_H
0006
0007 struct bpf_test_option {
0008 __u8 flags;
0009 __u8 max_delack_ms;
0010 __u8 rand;
0011 } __attribute__((packed));
0012
0013 enum {
0014 OPTION_RESEND,
0015 OPTION_MAX_DELACK_MS,
0016 OPTION_RAND,
0017 __NR_OPTION_FLAGS,
0018 };
0019
0020 #define OPTION_F_RESEND (1 << OPTION_RESEND)
0021 #define OPTION_F_MAX_DELACK_MS (1 << OPTION_MAX_DELACK_MS)
0022 #define OPTION_F_RAND (1 << OPTION_RAND)
0023 #define OPTION_MASK ((1 << __NR_OPTION_FLAGS) - 1)
0024
0025 #define TEST_OPTION_FLAGS(flags, option) (1 & ((flags) >> (option)))
0026 #define SET_OPTION_FLAGS(flags, option) ((flags) |= (1 << (option)))
0027
0028
0029 struct hdr_stg {
0030 bool active;
0031 bool resend_syn;
0032 bool syncookie;
0033 bool fastopen;
0034 };
0035
0036 struct linum_err {
0037 unsigned int linum;
0038 int err;
0039 };
0040
0041 #define TCPHDR_FIN 0x01
0042 #define TCPHDR_SYN 0x02
0043 #define TCPHDR_RST 0x04
0044 #define TCPHDR_PSH 0x08
0045 #define TCPHDR_ACK 0x10
0046 #define TCPHDR_URG 0x20
0047 #define TCPHDR_ECE 0x40
0048 #define TCPHDR_CWR 0x80
0049 #define TCPHDR_SYNACK (TCPHDR_SYN | TCPHDR_ACK)
0050
0051 #define TCPOPT_EOL 0
0052 #define TCPOPT_NOP 1
0053 #define TCPOPT_WINDOW 3
0054 #define TCPOPT_EXP 254
0055
0056 #define TCP_BPF_EXPOPT_BASE_LEN 4
0057 #define MAX_TCP_HDR_LEN 60
0058 #define MAX_TCP_OPTION_SPACE 40
0059
0060 #ifdef BPF_PROG_TEST_TCP_HDR_OPTIONS
0061
0062 #define CG_OK 1
0063 #define CG_ERR 0
0064
0065 #ifndef SOL_TCP
0066 #define SOL_TCP 6
0067 #endif
0068
0069 struct tcp_exprm_opt {
0070 __u8 kind;
0071 __u8 len;
0072 __u16 magic;
0073 union {
0074 __u8 data[4];
0075 __u32 data32;
0076 };
0077 } __attribute__((packed));
0078
0079 struct tcp_opt {
0080 __u8 kind;
0081 __u8 len;
0082 union {
0083 __u8 data[4];
0084 __u32 data32;
0085 };
0086 } __attribute__((packed));
0087
0088 struct {
0089 __uint(type, BPF_MAP_TYPE_HASH);
0090 __uint(max_entries, 2);
0091 __type(key, int);
0092 __type(value, struct linum_err);
0093 } lport_linum_map SEC(".maps");
0094
0095 static inline unsigned int tcp_hdrlen(const struct tcphdr *th)
0096 {
0097 return th->doff << 2;
0098 }
0099
0100 static inline __u8 skops_tcp_flags(const struct bpf_sock_ops *skops)
0101 {
0102 return skops->skb_tcp_flags;
0103 }
0104
0105 static inline void clear_hdr_cb_flags(struct bpf_sock_ops *skops)
0106 {
0107 bpf_sock_ops_cb_flags_set(skops,
0108 skops->bpf_sock_ops_cb_flags &
0109 ~(BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG |
0110 BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG));
0111 }
0112
0113 static inline void set_hdr_cb_flags(struct bpf_sock_ops *skops, __u32 extra)
0114 {
0115 bpf_sock_ops_cb_flags_set(skops,
0116 skops->bpf_sock_ops_cb_flags |
0117 BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG |
0118 BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG |
0119 extra);
0120 }
0121 static inline void
0122 clear_parse_all_hdr_cb_flags(struct bpf_sock_ops *skops)
0123 {
0124 bpf_sock_ops_cb_flags_set(skops,
0125 skops->bpf_sock_ops_cb_flags &
0126 ~BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG);
0127 }
0128
0129 static inline void
0130 set_parse_all_hdr_cb_flags(struct bpf_sock_ops *skops)
0131 {
0132 bpf_sock_ops_cb_flags_set(skops,
0133 skops->bpf_sock_ops_cb_flags |
0134 BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG);
0135 }
0136
0137 #define RET_CG_ERR(__err) ({ \
0138 struct linum_err __linum_err; \
0139 int __lport; \
0140 \
0141 __linum_err.linum = __LINE__; \
0142 __linum_err.err = __err; \
0143 __lport = skops->local_port; \
0144 bpf_map_update_elem(&lport_linum_map, &__lport, &__linum_err, BPF_NOEXIST); \
0145 clear_hdr_cb_flags(skops); \
0146 clear_parse_all_hdr_cb_flags(skops); \
0147 return CG_ERR; \
0148 })
0149
0150 #endif
0151
0152 #endif