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.
Showing the changes to tools/include/uapi/linux (1 of 8 files). Show all
Unified · Split
| @@ -17,7 +17,7 @@ · 16 unmodified lines | ||
| 17 | 17 | #define BPF_ALU64 0x07 /* alu mode in double word width */ |
| 18 | 18 | |
| 19 | 19 | /* ld/ldx fields */ |
| 20 | −#define BPF_DW 0x18 /* double word */ | |
| 20 | +#define BPF_DW 0x18 /* double word (64-bit) */ | |
| 21 | 21 | #define BPF_XADD 0xc0 /* exclusive add */ |
| 22 | 22 | |
| 23 | 23 | /* alu/jmp fields */ |
| @@ -642,6 +642,14 @@ union bpf_attr { · 618 unmodified lines | ||
| 642 | 642 | * @optlen: length of optval in bytes |
| 643 | 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 | 653 | * int bpf_skb_adjust_room(skb, len_diff, mode, flags) |
| 646 | 654 | * Grow or shrink room in sk_buff. |
| 647 | 655 | * @skb: pointer to skb |
| @@ -748,7 +756,8 @@ union bpf_attr { · 100 unmodified lines | ||
| 748 | 756 | FN(perf_event_read_value), \ |
| 749 | 757 | FN(perf_prog_read_value), \ |
| 750 | 758 | FN(getsockopt), \ |
| 751 | − FN(override_return), | |
| 759 | + FN(override_return), \ | |
| 760 | + FN(sock_ops_cb_flags_set), | |
| 752 | 761 | |
| 753 | 762 | /* integer value in 'imm' field of BPF_CALL instruction selects which helper |
| 754 | 763 | * function eBPF program intends to call |
| @@ -952,8 +961,9 @@ struct bpf_map_info { · 197 unmodified lines | ||
| 952 | 961 | struct bpf_sock_ops { |
| 953 | 962 | __u32 op; |
| 954 | 963 | union { |
| 955 | − __u32 reply; | |
| 956 | − __u32 replylong[4]; | |
| 964 | + __u32 args[4]; /* Optionally passed to bpf program */ | |
| 965 | + __u32 reply; /* Returned by bpf program */ | |
| 966 | + __u32 replylong[4]; /* Optionally returned by bpf prog */ | |
| 957 | 967 | }; |
| 958 | 968 | __u32 family; |
| 959 | 969 | __u32 remote_ip4; /* Stored in network byte order */ |
| @@ -968,8 +978,39 @@ struct bpf_sock_ops { · 8 unmodified lines | ||
| 968 | 978 | */ |
| 969 | 979 | __u32 snd_cwnd; |
| 970 | 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 | 1014 | /* List of known BPF sock_ops operators. |
| 974 | 1015 | * New entries can only be added at the end |
| 975 | 1016 | */ |
| @@ -1003,6 +1044,43 @@ enum { · 27 unmodified lines | ||
| 1003 | 1044 | * a congestion threshold. RTTs above |
| 1004 | 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 | 1086 | #define TCP_BPF_IW 1001 /* Set TCP initial congestion window */ |