Commit 6de4a9c4 authored by Martin KaFai Lau's avatar Martin KaFai Lau Committed by Alexei Starovoitov

bpf: tcp: Add bpf_cubic example

This patch adds a bpf_cubic example.  Some highlights:
1. CONFIG_HZ .kconfig map is used.
2. In bictcp_update(), calculation is changed to use usec
   resolution (i.e. USEC_PER_JIFFY) instead of using jiffies.
   Thus, usecs_to_jiffies() is not used in the bpf_cubic.c.
3. In bitctcp_update() [under tcp_friendliness], the original
   "while (ca->ack_cnt > delta)" loop is changed to the equivalent
   "ca->ack_cnt / delta" operation.
Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200122233658.903774-1-kafai@fb.com
parent 0a49c1a8
...@@ -6,13 +6,28 @@ ...@@ -6,13 +6,28 @@
#include <linux/types.h> #include <linux/types.h>
#include <bpf/bpf_helpers.h> #include <bpf/bpf_helpers.h>
#include <bpf/bpf_core_read.h> #include <bpf/bpf_core_read.h>
#include "bpf_trace_helpers.h"
#define BPF_STRUCT_OPS(name, args...) \
SEC("struct_ops/"#name) \
BPF_PROG(name, args)
#define tcp_jiffies32 ((__u32)bpf_jiffies64())
struct sock_common { struct sock_common {
unsigned char skc_state; unsigned char skc_state;
} __attribute__((preserve_access_index)); } __attribute__((preserve_access_index));
enum sk_pacing {
SK_PACING_NONE = 0,
SK_PACING_NEEDED = 1,
SK_PACING_FQ = 2,
};
struct sock { struct sock {
struct sock_common __sk_common; struct sock_common __sk_common;
unsigned long sk_pacing_rate;
__u32 sk_pacing_status; /* see enum sk_pacing */
} __attribute__((preserve_access_index)); } __attribute__((preserve_access_index));
struct inet_sock { struct inet_sock {
...@@ -54,6 +69,7 @@ struct tcp_sock { ...@@ -54,6 +69,7 @@ struct tcp_sock {
__u32 max_packets_out; __u32 max_packets_out;
__u32 lsndtime; __u32 lsndtime;
__u32 prior_cwnd; __u32 prior_cwnd;
__u64 tcp_mstamp; /* most recent packet received/sent */
} __attribute__((preserve_access_index)); } __attribute__((preserve_access_index));
static __always_inline struct inet_connection_sock *inet_csk(const struct sock *sk) static __always_inline struct inet_connection_sock *inet_csk(const struct sock *sk)
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <test_progs.h> #include <test_progs.h>
#include "bpf_dctcp.skel.h" #include "bpf_dctcp.skel.h"
#include "bpf_cubic.skel.h"
#define min(a, b) ((a) < (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b))
...@@ -158,6 +159,28 @@ static void do_test(const char *tcp_ca) ...@@ -158,6 +159,28 @@ static void do_test(const char *tcp_ca)
close(fd); close(fd);
} }
static void test_cubic(void)
{
struct bpf_cubic *cubic_skel;
struct bpf_link *link;
cubic_skel = bpf_cubic__open_and_load();
if (CHECK(!cubic_skel, "bpf_cubic__open_and_load", "failed\n"))
return;
link = bpf_map__attach_struct_ops(cubic_skel->maps.cubic);
if (CHECK(IS_ERR(link), "bpf_map__attach_struct_ops", "err:%ld\n",
PTR_ERR(link))) {
bpf_cubic__destroy(cubic_skel);
return;
}
do_test("bpf_cubic");
bpf_link__destroy(link);
bpf_cubic__destroy(cubic_skel);
}
static void test_dctcp(void) static void test_dctcp(void)
{ {
struct bpf_dctcp *dctcp_skel; struct bpf_dctcp *dctcp_skel;
...@@ -184,4 +207,6 @@ void test_bpf_tcp_ca(void) ...@@ -184,4 +207,6 @@ void test_bpf_tcp_ca(void)
{ {
if (test__start_subtest("dctcp")) if (test__start_subtest("dctcp"))
test_dctcp(); test_dctcp();
if (test__start_subtest("cubic"))
test_cubic();
} }
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment