diff options
| author | Lawrence Brakmo <brakmo@fb.com> | 2018-01-25 19:14:16 -0500 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2018-01-25 19:41:15 -0500 |
| commit | d6d4f60c3a0933852dcc40a2142d93027ea1da76 (patch) | |
| tree | a740942fab1902605fe48ed877d942c6ad02ad58 /tools/include/uapi/linux | |
| parent | d44874910a26f3a8f81edf873a2473363f07f660 (diff) | |
bpf: add selftest for tcpbpf
Added a selftest for tcpbpf (sock_ops) that checks that the appropriate
callbacks occured and that it can access tcp_sock fields and that their
values are correct.
Run with command: ./test_tcpbpf_user
Adding the flag "-d" will show why it did not pass.
Signed-off-by: Lawrence Brakmo <brakmo@fb.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tools/include/uapi/linux')
| -rw-r--r-- | tools/include/uapi/linux/bpf.h | 86 |
1 files changed, 82 insertions, 4 deletions
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index af1f49ad8b88..db6bdc375126 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | #define BPF_ALU64 0x07 /* alu mode in double word width */ | 17 | #define BPF_ALU64 0x07 /* alu mode in double word width */ |
| 18 | 18 | ||
| 19 | /* ld/ldx fields */ | 19 | /* ld/ldx fields */ |
| 20 | #define BPF_DW 0x18 /* double word */ | 20 | #define BPF_DW 0x18 /* double word (64-bit) */ |
| 21 | #define BPF_XADD 0xc0 /* exclusive add */ | 21 | #define BPF_XADD 0xc0 /* exclusive add */ |
| 22 | 22 | ||
| 23 | /* alu/jmp fields */ | 23 | /* alu/jmp fields */ |
| @@ -642,6 +642,14 @@ union bpf_attr { | |||
| 642 | * @optlen: length of optval in bytes | 642 | * @optlen: length of optval in bytes |
| 643 | * Return: 0 or negative error | 643 | * Return: 0 or negative error |
| 644 | * | 644 | * |
| 645 | * int bpf_sock_ops_cb_flags_set(bpf_sock_ops, flags) | ||
| 646 | * Set callback flags for sock_ops | ||
| 647 | * @bpf_sock_ops: pointer to bpf_sock_ops_kern struct | ||
| 648 | * @flags: flags value | ||
| 649 | * Return: 0 for no error | ||
| 650 | * -EINVAL if there is no full tcp socket | ||
| 651 | * bits in flags that are not supported by current kernel | ||
| 652 | * | ||
| 645 | * int bpf_skb_adjust_room(skb, len_diff, mode, flags) | 653 | * int bpf_skb_adjust_room(skb, len_diff, mode, flags) |
| 646 | * Grow or shrink room in sk_buff. | 654 | * Grow or shrink room in sk_buff. |
| 647 | * @skb: pointer to skb | 655 | * @skb: pointer to skb |
| @@ -748,7 +756,8 @@ union bpf_attr { | |||
| 748 | FN(perf_event_read_value), \ | 756 | FN(perf_event_read_value), \ |
| 749 | FN(perf_prog_read_value), \ | 757 | FN(perf_prog_read_value), \ |
| 750 | FN(getsockopt), \ | 758 | FN(getsockopt), \ |
| 751 | FN(override_return), | 759 | FN(override_return), \ |
| 760 | FN(sock_ops_cb_flags_set), | ||
| 752 | 761 | ||
| 753 | /* integer value in 'imm' field of BPF_CALL instruction selects which helper | 762 | /* integer value in 'imm' field of BPF_CALL instruction selects which helper |
| 754 | * function eBPF program intends to call | 763 | * function eBPF program intends to call |
| @@ -952,8 +961,9 @@ struct bpf_map_info { | |||
| 952 | struct bpf_sock_ops { | 961 | struct bpf_sock_ops { |
| 953 | __u32 op; | 962 | __u32 op; |
| 954 | union { | 963 | union { |
| 955 | __u32 reply; | 964 | __u32 args[4]; /* Optionally passed to bpf program */ |
| 956 | __u32 replylong[4]; | 965 | __u32 reply; /* Returned by bpf program */ |
| 966 | __u32 replylong[4]; /* Optionally returned by bpf prog */ | ||
| 957 | }; | 967 | }; |
| 958 | __u32 family; | 968 | __u32 family; |
| 959 | __u32 remote_ip4; /* Stored in network byte order */ | 969 | __u32 remote_ip4; /* Stored in network byte order */ |
| @@ -968,8 +978,39 @@ struct bpf_sock_ops { | |||
| 968 | */ | 978 | */ |
| 969 | __u32 snd_cwnd; | 979 | __u32 snd_cwnd; |
| 970 | __u32 srtt_us; /* Averaged RTT << 3 in usecs */ | 980 | __u32 srtt_us; /* Averaged RTT << 3 in usecs */ |
| 981 | __u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */ | ||
| 982 | __u32 state; | ||
| 983 | __u32 rtt_min; | ||
| 984 | __u32 snd_ssthresh; | ||
| 985 | __u32 rcv_nxt; | ||
| 986 | __u32 snd_nxt; | ||
| 987 | __u32 snd_una; | ||
| 988 | __u32 mss_cache; | ||
| 989 | __u32 ecn_flags; | ||
| 990 | __u32 rate_delivered; | ||
| 991 | __u32 rate_interval_us; | ||
| 992 | __u32 packets_out; | ||
| 993 | __u32 retrans_out; | ||
| 994 | __u32 total_retrans; | ||
| 995 | __u32 segs_in; | ||
| 996 | __u32 data_segs_in; | ||
| 997 | __u32 segs_out; | ||
| 998 | __u32 data_segs_out; | ||
| 999 | __u32 lost_out; | ||
| 1000 | __u32 sacked_out; | ||
| 1001 | __u32 sk_txhash; | ||
| 1002 | __u64 bytes_received; | ||
| 1003 | __u64 bytes_acked; | ||
| 971 | }; | 1004 | }; |
| 972 | 1005 | ||
| 1006 | /* Definitions for bpf_sock_ops_cb_flags */ | ||
| 1007 | #define BPF_SOCK_OPS_RTO_CB_FLAG (1<<0) | ||
| 1008 | #define BPF_SOCK_OPS_RETRANS_CB_FLAG (1<<1) | ||
| 1009 | #define BPF_SOCK_OPS_STATE_CB_FLAG (1<<2) | ||
| 1010 | #define BPF_SOCK_OPS_ALL_CB_FLAGS 0x7 /* Mask of all currently | ||
| 1011 | * supported cb flags | ||
| 1012 | */ | ||
| 1013 | |||
| 973 | /* List of known BPF sock_ops operators. | 1014 | /* List of known BPF sock_ops operators. |
| 974 | * New entries can only be added at the end | 1015 | * New entries can only be added at the end |
| 975 | */ | 1016 | */ |
| @@ -1003,6 +1044,43 @@ enum { | |||
| 1003 | * a congestion threshold. RTTs above | 1044 | * a congestion threshold. RTTs above |
| 1004 | * this indicate congestion | 1045 | * this indicate congestion |
| 1005 | */ | 1046 | */ |
| 1047 | BPF_SOCK_OPS_RTO_CB, /* Called when an RTO has triggered. | ||
| 1048 | * Arg1: value of icsk_retransmits | ||
| 1049 | * Arg2: value of icsk_rto | ||
| 1050 | * Arg3: whether RTO has expired | ||
| 1051 | */ | ||
| 1052 | BPF_SOCK_OPS_RETRANS_CB, /* Called when skb is retransmitted. | ||
| 1053 | * Arg1: sequence number of 1st byte | ||
| 1054 | * Arg2: # segments | ||
| 1055 | * Arg3: return value of | ||
| 1056 | * tcp_transmit_skb (0 => success) | ||
| 1057 | */ | ||
| 1058 | BPF_SOCK_OPS_STATE_CB, /* Called when TCP changes state. | ||
| 1059 | * Arg1: old_state | ||
| 1060 | * Arg2: new_state | ||
| 1061 | */ | ||
| 1062 | }; | ||
| 1063 | |||
| 1064 | /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect | ||
| 1065 | * changes between the TCP and BPF versions. Ideally this should never happen. | ||
| 1066 | * If it does, we need to add code to convert them before calling | ||
| 1067 | * the BPF sock_ops function. | ||
| 1068 | */ | ||
| 1069 | enum { | ||
| 1070 | BPF_TCP_ESTABLISHED = 1, | ||
| 1071 | BPF_TCP_SYN_SENT, | ||
| 1072 | BPF_TCP_SYN_RECV, | ||
| 1073 | BPF_TCP_FIN_WAIT1, | ||
| 1074 | BPF_TCP_FIN_WAIT2, | ||
| 1075 | BPF_TCP_TIME_WAIT, | ||
| 1076 | BPF_TCP_CLOSE, | ||
| 1077 | BPF_TCP_CLOSE_WAIT, | ||
| 1078 | BPF_TCP_LAST_ACK, | ||
| 1079 | BPF_TCP_LISTEN, | ||
| 1080 | BPF_TCP_CLOSING, /* Now a valid state */ | ||
| 1081 | BPF_TCP_NEW_SYN_RECV, | ||
| 1082 | |||
| 1083 | BPF_TCP_MAX_STATES /* Leave at the end! */ | ||
| 1006 | }; | 1084 | }; |
| 1007 | 1085 | ||
| 1008 | #define TCP_BPF_IW 1001 /* Set TCP initial congestion window */ | 1086 | #define TCP_BPF_IW 1001 /* Set TCP initial congestion window */ |
