Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* Copyright (c) 2020 Facebook */
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 /* Store in bpf_sk_storage */
0029 struct hdr_stg {
0030     bool active;
0031     bool resend_syn; /* active side only */
0032     bool syncookie;  /* passive side only */
0033     bool fastopen;  /* passive side only */
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 /* BPF_PROG_TEST_TCP_HDR_OPTIONS */
0151 
0152 #endif /* _TEST_TCP_HDR_OPTIONS_H */