brintos

brintos / linux-shallow public Read only

0
0
Text · 3.3 KiB · 56c9f8a Raw
154 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/* Copyright (c) 2020 Facebook */3 4#ifndef _TEST_TCP_HDR_OPTIONS_H5#define _TEST_TCP_HDR_OPTIONS_H6 7struct bpf_test_option {8	__u8 flags;9	__u8 max_delack_ms;10	__u8 rand;11} __attribute__((packed));12 13enum {14	OPTION_RESEND,15	OPTION_MAX_DELACK_MS,16	OPTION_RAND,17	__NR_OPTION_FLAGS,18};19 20#define OPTION_F_RESEND		(1 << OPTION_RESEND)21#define OPTION_F_MAX_DELACK_MS	(1 << OPTION_MAX_DELACK_MS)22#define OPTION_F_RAND		(1 << OPTION_RAND)23#define OPTION_MASK		((1 << __NR_OPTION_FLAGS) - 1)24 25#define TEST_OPTION_FLAGS(flags, option) (1 & ((flags) >> (option)))26#define SET_OPTION_FLAGS(flags, option)	((flags) |= (1 << (option)))27 28/* Store in bpf_sk_storage */29struct hdr_stg {30	bool active;31	bool resend_syn; /* active side only */32	bool syncookie;  /* passive side only */33	bool fastopen;	/* passive side only */34};35 36struct linum_err {37	unsigned int linum;38	int err;39};40 41#define TCPHDR_FIN 0x0142#define TCPHDR_SYN 0x0243#define TCPHDR_RST 0x0444#define TCPHDR_PSH 0x0845#define TCPHDR_ACK 0x1046#define TCPHDR_URG 0x2047#define TCPHDR_ECE 0x4048#define TCPHDR_CWR 0x8049#define TCPHDR_SYNACK (TCPHDR_SYN | TCPHDR_ACK)50 51#define TCPOPT_EOL		052#define TCPOPT_NOP		153#define TCPOPT_MSS		254#define TCPOPT_WINDOW		355#define TCPOPT_EXP		25456 57#define TCP_BPF_EXPOPT_BASE_LEN 458#define MAX_TCP_HDR_LEN		6059#define MAX_TCP_OPTION_SPACE	4060 61#ifdef BPF_PROG_TEST_TCP_HDR_OPTIONS62 63#define CG_OK	164#define CG_ERR	065 66#ifndef SOL_TCP67#define SOL_TCP 668#endif69 70struct tcp_exprm_opt {71	__u8 kind;72	__u8 len;73	__u16 magic;74	union {75		__u8 data[4];76		__u32 data32;77	};78} __attribute__((packed));79 80struct tcp_opt {81	__u8 kind;82	__u8 len;83	union {84		__u8 data[4];85		__u32 data32;86	};87} __attribute__((packed));88 89struct {90	__uint(type, BPF_MAP_TYPE_HASH);91	__uint(max_entries, 2);92	__type(key, int);93	__type(value, struct linum_err);94} lport_linum_map SEC(".maps");95 96static inline unsigned int tcp_hdrlen(const struct tcphdr *th)97{98	return th->doff << 2;99}100 101static inline __u8 skops_tcp_flags(const struct bpf_sock_ops *skops)102{103	return skops->skb_tcp_flags;104}105 106static inline void clear_hdr_cb_flags(struct bpf_sock_ops *skops)107{108	bpf_sock_ops_cb_flags_set(skops,109				  skops->bpf_sock_ops_cb_flags &110				  ~(BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG |111				    BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG));112}113 114static inline void set_hdr_cb_flags(struct bpf_sock_ops *skops, __u32 extra)115{116	bpf_sock_ops_cb_flags_set(skops,117				  skops->bpf_sock_ops_cb_flags |118				  BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG |119				  BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG |120				  extra);121}122static inline void123clear_parse_all_hdr_cb_flags(struct bpf_sock_ops *skops)124{125	bpf_sock_ops_cb_flags_set(skops,126				  skops->bpf_sock_ops_cb_flags &127				  ~BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG);128}129 130static inline void131set_parse_all_hdr_cb_flags(struct bpf_sock_ops *skops)132{133	bpf_sock_ops_cb_flags_set(skops,134				  skops->bpf_sock_ops_cb_flags |135				  BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG);136}137 138#define RET_CG_ERR(__err) ({			\139	struct linum_err __linum_err;		\140	int __lport;				\141						\142	__linum_err.linum = __LINE__;		\143	__linum_err.err = __err;		\144	__lport = skops->local_port;		\145	bpf_map_update_elem(&lport_linum_map, &__lport, &__linum_err, BPF_NOEXIST); \146	clear_hdr_cb_flags(skops);					\147	clear_parse_all_hdr_cb_flags(skops);				\148	return CG_ERR;							\149})150 151#endif /* BPF_PROG_TEST_TCP_HDR_OPTIONS */152 153#endif /* _TEST_TCP_HDR_OPTIONS_H */154