bpf.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH bpf v2 1/2] bpf: enforce that struct_ops programs be GPL-only
@ 2021-03-25 21:11 Toke Høiland-Jørgensen
  2021-03-25 21:11 ` [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license Toke Høiland-Jørgensen
  0 siblings, 1 reply; 7+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-03-25 21:11 UTC (permalink / raw)
  To: Alexei Starovoitov, Daniel Borkmann
  Cc: Toke Høiland-Jørgensen, Andrii Nakryiko,
	Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, David S. Miller,
	Jesper Dangaard Brouer, Andrea Arcangeli, Clark Williams, bpf,
	netdev

With the introduction of the struct_ops program type, it became possible to
implement kernel functionality in BPF, making it viable to use BPF in place
of a regular kernel module for these particular operations.

Thus far, the only user of this mechanism is for implementing TCP
congestion control algorithms. These are clearly marked as GPL-only when
implemented as modules (as seen by the use of EXPORT_SYMBOL_GPL for
tcp_register_congestion_control()), so it seems like an oversight that this
was not carried over to BPF implementations. Since this is the only user
of the struct_ops mechanism, just enforcing GPL-only for the struct_ops
program type seems like the simplest way to fix this.

v2: Move check to the top of check_struct_ops_btf_id().

Fixes: 0baf26b0fcd7 ("bpf: tcp: Support tcp_congestion_ops in bpf")
Acked-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
---
 kernel/bpf/verifier.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 44e4ec1640f1..3a738724a380 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -12158,6 +12158,11 @@ static int check_struct_ops_btf_id(struct bpf_verifier_env *env)
 	u32 btf_id, member_idx;
 	const char *mname;
 
+	if (!prog->gpl_compatible) {
+		verbose(env, "struct ops programs must have a GPL compatible license\n");
+		return -EINVAL;
+	}
+
 	btf_id = prog->aux->attach_btf_id;
 	st_ops = bpf_struct_ops_find(btf_id);
 	if (!st_ops) {
-- 
2.31.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license
  2021-03-25 21:11 [PATCH bpf v2 1/2] bpf: enforce that struct_ops programs be GPL-only Toke Høiland-Jørgensen
@ 2021-03-25 21:11 ` Toke Høiland-Jørgensen
  2021-03-25 22:58   ` Martin KaFai Lau
  2021-03-26  4:04   ` Andrii Nakryiko
  0 siblings, 2 replies; 7+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-03-25 21:11 UTC (permalink / raw)
  To: Alexei Starovoitov, Daniel Borkmann
  Cc: Toke Høiland-Jørgensen, Andrii Nakryiko,
	Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, David S. Miller,
	Jesper Dangaard Brouer, Andrea Arcangeli, Clark Williams, bpf,
	netdev

This adds a selftest to check that the verifier rejects a TCP CC struct_ops
with a non-GPL license.

v2:
- Use a minimal struct_ops BPF program instead of rewriting bpf_dctcp's
  license in memory.
- Check for the verifier reject message instead of just the return code.

Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
---
 .../selftests/bpf/prog_tests/bpf_tcp_ca.c     | 44 +++++++++++++++++++
 .../selftests/bpf/progs/bpf_nogpltcp.c        | 19 ++++++++
 2 files changed, 63 insertions(+)
 create mode 100644 tools/testing/selftests/bpf/progs/bpf_nogpltcp.c

diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
index 37c5494a0381..a09c716528e1 100644
--- a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
+++ b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
@@ -6,6 +6,7 @@
 #include <test_progs.h>
 #include "bpf_dctcp.skel.h"
 #include "bpf_cubic.skel.h"
+#include "bpf_nogpltcp.skel.h"
 
 #define min(a, b) ((a) < (b) ? (a) : (b))
 
@@ -227,10 +228,53 @@ static void test_dctcp(void)
 	bpf_dctcp__destroy(dctcp_skel);
 }
 
+static char *err_str = NULL;
+static bool found = false;
+
+static int libbpf_debug_print(enum libbpf_print_level level,
+			      const char *format, va_list args)
+{
+	char *log_buf;
+
+	if (level != LIBBPF_WARN ||
+	    strcmp(format, "libbpf: \n%s\n")) {
+		vprintf(format, args);
+		return 0;
+	}
+
+	log_buf = va_arg(args, char *);
+	if (!log_buf)
+		goto out;
+	if (err_str && strstr(log_buf, err_str) != NULL)
+		found = true;
+out:
+	printf(format, log_buf);
+	return 0;
+}
+
+static void test_invalid_license(void)
+{
+	libbpf_print_fn_t old_print_fn = NULL;
+	struct bpf_nogpltcp *skel;
+
+	err_str = "struct ops programs must have a GPL compatible license";
+	old_print_fn = libbpf_set_print(libbpf_debug_print);
+
+	skel = bpf_nogpltcp__open_and_load();
+	if (CHECK(skel, "bpf_nogplgtcp__open_and_load()", "didn't fail\n"))
+		bpf_nogpltcp__destroy(skel);
+
+	CHECK(!found, "errmsg check", "expected string '%s'", err_str);
+
+	libbpf_set_print(old_print_fn);
+}
+
 void test_bpf_tcp_ca(void)
 {
 	if (test__start_subtest("dctcp"))
 		test_dctcp();
 	if (test__start_subtest("cubic"))
 		test_cubic();
+	if (test__start_subtest("invalid_license"))
+		test_invalid_license();
 }
diff --git a/tools/testing/selftests/bpf/progs/bpf_nogpltcp.c b/tools/testing/selftests/bpf/progs/bpf_nogpltcp.c
new file mode 100644
index 000000000000..2ecd833dcd41
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/bpf_nogpltcp.c
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/bpf.h>
+#include <linux/types.h>
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+#include "bpf_tcp_helpers.h"
+
+char _license[] SEC("license") = "X";
+
+void BPF_STRUCT_OPS(nogpltcp_init, struct sock *sk)
+{
+}
+
+SEC(".struct_ops")
+struct tcp_congestion_ops bpf_nogpltcp = {
+	.init           = (void *)nogpltcp_init,
+	.name           = "bpf_nogpltcp",
+};
-- 
2.31.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license
  2021-03-25 21:11 ` [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license Toke Høiland-Jørgensen
@ 2021-03-25 22:58   ` Martin KaFai Lau
  2021-03-26  4:04   ` Andrii Nakryiko
  1 sibling, 0 replies; 7+ messages in thread
From: Martin KaFai Lau @ 2021-03-25 22:58 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen
  Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	David S. Miller, Jesper Dangaard Brouer, Andrea Arcangeli,
	Clark Williams, bpf, netdev

On Thu, Mar 25, 2021 at 10:11:22PM +0100, Toke Høiland-Jørgensen wrote:
> This adds a selftest to check that the verifier rejects a TCP CC struct_ops
> with a non-GPL license.
> 
> v2:
> - Use a minimal struct_ops BPF program instead of rewriting bpf_dctcp's
>   license in memory.
> - Check for the verifier reject message instead of just the return code.
> 
> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
> ---
>  .../selftests/bpf/prog_tests/bpf_tcp_ca.c     | 44 +++++++++++++++++++
>  .../selftests/bpf/progs/bpf_nogpltcp.c        | 19 ++++++++
>  2 files changed, 63 insertions(+)
>  create mode 100644 tools/testing/selftests/bpf/progs/bpf_nogpltcp.c
> 
> diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> index 37c5494a0381..a09c716528e1 100644
> --- a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> +++ b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> @@ -6,6 +6,7 @@
>  #include <test_progs.h>
>  #include "bpf_dctcp.skel.h"
>  #include "bpf_cubic.skel.h"
> +#include "bpf_nogpltcp.skel.h"
>  
>  #define min(a, b) ((a) < (b) ? (a) : (b))
>  
> @@ -227,10 +228,53 @@ static void test_dctcp(void)
>  	bpf_dctcp__destroy(dctcp_skel);
>  }
>  
> +static char *err_str = NULL;
> +static bool found = false;
Nit. These two inits are not needed.

> +
> +static int libbpf_debug_print(enum libbpf_print_level level,
> +			      const char *format, va_list args)
> +{
> +	char *log_buf;
> +
> +	if (level != LIBBPF_WARN ||
> +	    strcmp(format, "libbpf: \n%s\n")) {
> +		vprintf(format, args);
> +		return 0;
> +	}
> +
> +	log_buf = va_arg(args, char *);
> +	if (!log_buf)
> +		goto out;
> +	if (err_str && strstr(log_buf, err_str) != NULL)
> +		found = true;
> +out:
> +	printf(format, log_buf);
> +	return 0;
> +}
> +
> +static void test_invalid_license(void)
> +{
> +	libbpf_print_fn_t old_print_fn = NULL;
Nit. Same here.  Not need to init NULL.

Others lgtm.

Acked-by: Martin KaFai Lau <kafai@fb.com>

> +	struct bpf_nogpltcp *skel;
> +
> +	err_str = "struct ops programs must have a GPL compatible license";
> +	old_print_fn = libbpf_set_print(libbpf_debug_print);
> +
> +	skel = bpf_nogpltcp__open_and_load();
> +	if (CHECK(skel, "bpf_nogplgtcp__open_and_load()", "didn't fail\n"))
> +		bpf_nogpltcp__destroy(skel);
> +
> +	CHECK(!found, "errmsg check", "expected string '%s'", err_str);
> +
> +	libbpf_set_print(old_print_fn);
> +}

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license
  2021-03-25 21:11 ` [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license Toke Høiland-Jørgensen
  2021-03-25 22:58   ` Martin KaFai Lau
@ 2021-03-26  4:04   ` Andrii Nakryiko
  2021-03-26  9:43     ` Toke Høiland-Jørgensen
  1 sibling, 1 reply; 7+ messages in thread
From: Andrii Nakryiko @ 2021-03-26  4:04 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen
  Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
	Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, David S. Miller,
	Jesper Dangaard Brouer, Andrea Arcangeli, Clark Williams, bpf,
	Networking

On Thu, Mar 25, 2021 at 2:11 PM Toke Høiland-Jørgensen <toke@redhat.com> wrote:
>
> This adds a selftest to check that the verifier rejects a TCP CC struct_ops
> with a non-GPL license.
>
> v2:
> - Use a minimal struct_ops BPF program instead of rewriting bpf_dctcp's
>   license in memory.
> - Check for the verifier reject message instead of just the return code.
>
> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
> ---
>  .../selftests/bpf/prog_tests/bpf_tcp_ca.c     | 44 +++++++++++++++++++
>  .../selftests/bpf/progs/bpf_nogpltcp.c        | 19 ++++++++
>  2 files changed, 63 insertions(+)
>  create mode 100644 tools/testing/selftests/bpf/progs/bpf_nogpltcp.c
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> index 37c5494a0381..a09c716528e1 100644
> --- a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> +++ b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> @@ -6,6 +6,7 @@
>  #include <test_progs.h>
>  #include "bpf_dctcp.skel.h"
>  #include "bpf_cubic.skel.h"
> +#include "bpf_nogpltcp.skel.h"

total nit, but my eyes can't read "nogpltcp"... wouldn't
"bpf_tcp_nogpl" be a bit easier?

>
>  #define min(a, b) ((a) < (b) ? (a) : (b))
>
> @@ -227,10 +228,53 @@ static void test_dctcp(void)
>         bpf_dctcp__destroy(dctcp_skel);
>  }
>
> +static char *err_str = NULL;
> +static bool found = false;
> +
> +static int libbpf_debug_print(enum libbpf_print_level level,
> +                             const char *format, va_list args)
> +{
> +       char *log_buf;
> +
> +       if (level != LIBBPF_WARN ||
> +           strcmp(format, "libbpf: \n%s\n")) {
> +               vprintf(format, args);
> +               return 0;
> +       }
> +
> +       log_buf = va_arg(args, char *);
> +       if (!log_buf)
> +               goto out;
> +       if (err_str && strstr(log_buf, err_str) != NULL)
> +               found = true;
> +out:
> +       printf(format, log_buf);
> +       return 0;
> +}
> +
> +static void test_invalid_license(void)
> +{
> +       libbpf_print_fn_t old_print_fn = NULL;
> +       struct bpf_nogpltcp *skel;
> +
> +       err_str = "struct ops programs must have a GPL compatible license";
> +       old_print_fn = libbpf_set_print(libbpf_debug_print);
> +
> +       skel = bpf_nogpltcp__open_and_load();
> +       if (CHECK(skel, "bpf_nogplgtcp__open_and_load()", "didn't fail\n"))

ASSERT_OK_PTR()

> +               bpf_nogpltcp__destroy(skel);

you should destroy unconditionally

> +
> +       CHECK(!found, "errmsg check", "expected string '%s'", err_str);

ASSERT_EQ(found, true, "expected_err_msg");

I can never be sure which way CHECK() is checking

> +
> +       libbpf_set_print(old_print_fn);
> +}
> +
>  void test_bpf_tcp_ca(void)
>  {
>         if (test__start_subtest("dctcp"))
>                 test_dctcp();
>         if (test__start_subtest("cubic"))
>                 test_cubic();
> +       if (test__start_subtest("invalid_license"))
> +               test_invalid_license();
>  }
> diff --git a/tools/testing/selftests/bpf/progs/bpf_nogpltcp.c b/tools/testing/selftests/bpf/progs/bpf_nogpltcp.c
> new file mode 100644
> index 000000000000..2ecd833dcd41
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/progs/bpf_nogpltcp.c
> @@ -0,0 +1,19 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <linux/bpf.h>
> +#include <linux/types.h>
> +#include <bpf/bpf_helpers.h>
> +#include <bpf/bpf_tracing.h>
> +#include "bpf_tcp_helpers.h"
> +
> +char _license[] SEC("license") = "X";
> +
> +void BPF_STRUCT_OPS(nogpltcp_init, struct sock *sk)
> +{
> +}
> +
> +SEC(".struct_ops")
> +struct tcp_congestion_ops bpf_nogpltcp = {
> +       .init           = (void *)nogpltcp_init,
> +       .name           = "bpf_nogpltcp",
> +};
> --
> 2.31.0
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license
  2021-03-26  4:04   ` Andrii Nakryiko
@ 2021-03-26  9:43     ` Toke Høiland-Jørgensen
  2021-03-26 18:14       ` Andrii Nakryiko
  0 siblings, 1 reply; 7+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-03-26  9:43 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
	Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, David S. Miller,
	Jesper Dangaard Brouer, Andrea Arcangeli, Clark Williams, bpf,
	Networking

Andrii Nakryiko <andrii.nakryiko@gmail.com> writes:

> On Thu, Mar 25, 2021 at 2:11 PM Toke Høiland-Jørgensen <toke@redhat.com> wrote:
>>
>> This adds a selftest to check that the verifier rejects a TCP CC struct_ops
>> with a non-GPL license.
>>
>> v2:
>> - Use a minimal struct_ops BPF program instead of rewriting bpf_dctcp's
>>   license in memory.
>> - Check for the verifier reject message instead of just the return code.
>>
>> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
>> ---
>>  .../selftests/bpf/prog_tests/bpf_tcp_ca.c     | 44 +++++++++++++++++++
>>  .../selftests/bpf/progs/bpf_nogpltcp.c        | 19 ++++++++
>>  2 files changed, 63 insertions(+)
>>  create mode 100644 tools/testing/selftests/bpf/progs/bpf_nogpltcp.c
>>
>> diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
>> index 37c5494a0381..a09c716528e1 100644
>> --- a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
>> +++ b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
>> @@ -6,6 +6,7 @@
>>  #include <test_progs.h>
>>  #include "bpf_dctcp.skel.h"
>>  #include "bpf_cubic.skel.h"
>> +#include "bpf_nogpltcp.skel.h"
>
> total nit, but my eyes can't read "nogpltcp"... wouldn't
> "bpf_tcp_nogpl" be a bit easier?

Haha, yeah, good point - my eyes also just lump it into a blob...

>>
>>  #define min(a, b) ((a) < (b) ? (a) : (b))
>>
>> @@ -227,10 +228,53 @@ static void test_dctcp(void)
>>         bpf_dctcp__destroy(dctcp_skel);
>>  }
>>
>> +static char *err_str = NULL;
>> +static bool found = false;
>> +
>> +static int libbpf_debug_print(enum libbpf_print_level level,
>> +                             const char *format, va_list args)
>> +{
>> +       char *log_buf;
>> +
>> +       if (level != LIBBPF_WARN ||
>> +           strcmp(format, "libbpf: \n%s\n")) {
>> +               vprintf(format, args);
>> +               return 0;
>> +       }
>> +
>> +       log_buf = va_arg(args, char *);
>> +       if (!log_buf)
>> +               goto out;
>> +       if (err_str && strstr(log_buf, err_str) != NULL)
>> +               found = true;
>> +out:
>> +       printf(format, log_buf);
>> +       return 0;
>> +}
>> +
>> +static void test_invalid_license(void)
>> +{
>> +       libbpf_print_fn_t old_print_fn = NULL;
>> +       struct bpf_nogpltcp *skel;
>> +
>> +       err_str = "struct ops programs must have a GPL compatible license";
>> +       old_print_fn = libbpf_set_print(libbpf_debug_print);
>> +
>> +       skel = bpf_nogpltcp__open_and_load();
>> +       if (CHECK(skel, "bpf_nogplgtcp__open_and_load()", "didn't fail\n"))
>
> ASSERT_OK_PTR()
>
>> +               bpf_nogpltcp__destroy(skel);
>
> you should destroy unconditionally
>
>> +
>> +       CHECK(!found, "errmsg check", "expected string '%s'", err_str);
>
> ASSERT_EQ(found, true, "expected_err_msg");
>
> I can never be sure which way CHECK() is checking

Ah, thanks! I always get confused about CHECK() as well! Maybe it should
be renamed to ASSERT()? But that would require flipping all the if()
statements around them as well :/

-Toke


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license
  2021-03-26  9:43     ` Toke Høiland-Jørgensen
@ 2021-03-26 18:14       ` Andrii Nakryiko
  2021-03-26 18:25         ` Toke Høiland-Jørgensen
  0 siblings, 1 reply; 7+ messages in thread
From: Andrii Nakryiko @ 2021-03-26 18:14 UTC (permalink / raw)
  To: Toke Høiland-Jørgensen
  Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
	Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, David S. Miller,
	Jesper Dangaard Brouer, Andrea Arcangeli, Clark Williams, bpf,
	Networking

-- Andrii

On Fri, Mar 26, 2021 at 2:43 AM Toke Høiland-Jørgensen <toke@redhat.com> wrote:
>
> Andrii Nakryiko <andrii.nakryiko@gmail.com> writes:
>
> > On Thu, Mar 25, 2021 at 2:11 PM Toke Høiland-Jørgensen <toke@redhat.com> wrote:
> >>
> >> This adds a selftest to check that the verifier rejects a TCP CC struct_ops
> >> with a non-GPL license.
> >>
> >> v2:
> >> - Use a minimal struct_ops BPF program instead of rewriting bpf_dctcp's
> >>   license in memory.
> >> - Check for the verifier reject message instead of just the return code.
> >>
> >> Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
> >> ---
> >>  .../selftests/bpf/prog_tests/bpf_tcp_ca.c     | 44 +++++++++++++++++++
> >>  .../selftests/bpf/progs/bpf_nogpltcp.c        | 19 ++++++++
> >>  2 files changed, 63 insertions(+)
> >>  create mode 100644 tools/testing/selftests/bpf/progs/bpf_nogpltcp.c
> >>
> >> diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> >> index 37c5494a0381..a09c716528e1 100644
> >> --- a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> >> +++ b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c
> >> @@ -6,6 +6,7 @@
> >>  #include <test_progs.h>
> >>  #include "bpf_dctcp.skel.h"
> >>  #include "bpf_cubic.skel.h"
> >> +#include "bpf_nogpltcp.skel.h"
> >
> > total nit, but my eyes can't read "nogpltcp"... wouldn't
> > "bpf_tcp_nogpl" be a bit easier?
>
> Haha, yeah, good point - my eyes also just lump it into a blob...

thanks

>
> >>
> >>  #define min(a, b) ((a) < (b) ? (a) : (b))
> >>
> >> @@ -227,10 +228,53 @@ static void test_dctcp(void)
> >>         bpf_dctcp__destroy(dctcp_skel);
> >>  }
> >>
> >> +static char *err_str = NULL;
> >> +static bool found = false;
> >> +
> >> +static int libbpf_debug_print(enum libbpf_print_level level,
> >> +                             const char *format, va_list args)
> >> +{
> >> +       char *log_buf;
> >> +
> >> +       if (level != LIBBPF_WARN ||
> >> +           strcmp(format, "libbpf: \n%s\n")) {
> >> +               vprintf(format, args);
> >> +               return 0;
> >> +       }
> >> +
> >> +       log_buf = va_arg(args, char *);
> >> +       if (!log_buf)
> >> +               goto out;
> >> +       if (err_str && strstr(log_buf, err_str) != NULL)
> >> +               found = true;
> >> +out:
> >> +       printf(format, log_buf);
> >> +       return 0;
> >> +}
> >> +
> >> +static void test_invalid_license(void)
> >> +{
> >> +       libbpf_print_fn_t old_print_fn = NULL;
> >> +       struct bpf_nogpltcp *skel;
> >> +
> >> +       err_str = "struct ops programs must have a GPL compatible license";
> >> +       old_print_fn = libbpf_set_print(libbpf_debug_print);
> >> +
> >> +       skel = bpf_nogpltcp__open_and_load();
> >> +       if (CHECK(skel, "bpf_nogplgtcp__open_and_load()", "didn't fail\n"))
> >
> > ASSERT_OK_PTR()
> >
> >> +               bpf_nogpltcp__destroy(skel);
> >
> > you should destroy unconditionally
> >
> >> +
> >> +       CHECK(!found, "errmsg check", "expected string '%s'", err_str);
> >
> > ASSERT_EQ(found, true, "expected_err_msg");
> >
> > I can never be sure which way CHECK() is checking
>
> Ah, thanks! I always get confused about CHECK() as well! Maybe it should
> be renamed to ASSERT()? But that would require flipping all the if()
> statements around them as well :/

Exactly, it's the opposite of assert (ASSERT_NOT %-), that
CHECK(!found) is "assert not not found", right?) and it throws me off
every. single. time. Ideally we complete the set of ASSERT_XXX()
macros and convert as much as possible to that. We can also have just
generic ASSERT() for all other complicated cases.

>
> -Toke
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license
  2021-03-26 18:14       ` Andrii Nakryiko
@ 2021-03-26 18:25         ` Toke Høiland-Jørgensen
  0 siblings, 0 replies; 7+ messages in thread
From: Toke Høiland-Jørgensen @ 2021-03-26 18:25 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
	Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, David S. Miller,
	Jesper Dangaard Brouer, Andrea Arcangeli, Clark Williams, bpf,
	Networking

Andrii Nakryiko <andrii.nakryiko@gmail.com> writes:


>> Ah, thanks! I always get confused about CHECK() as well! Maybe it should
>> be renamed to ASSERT()? But that would require flipping all the if()
>> statements around them as well :/
>
> Exactly, it's the opposite of assert (ASSERT_NOT %-), that
> CHECK(!found) is "assert not not found", right?) and it throws me off
> every. single. time.

Yup, me too, I have to basically infer the right meaning from the
surrounding if statements (i.e., whether it triggers an error path or
not).

> Ideally we complete the set of ASSERT_XXX() macros and convert as much
> as possible to that. We can also have just generic ASSERT() for all
> other complicated cases.

Totally on board with that! I'll try to remember to fix any selftests I
fiddle with (and not introduce any new uses of CHECK() of course).

-Toke


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-03-26 18:26 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-25 21:11 [PATCH bpf v2 1/2] bpf: enforce that struct_ops programs be GPL-only Toke Høiland-Jørgensen
2021-03-25 21:11 ` [PATCH bpf v2 2/2] bpf/selftests: test that kernel rejects a TCP CC with an invalid license Toke Høiland-Jørgensen
2021-03-25 22:58   ` Martin KaFai Lau
2021-03-26  4:04   ` Andrii Nakryiko
2021-03-26  9:43     ` Toke Høiland-Jørgensen
2021-03-26 18:14       ` Andrii Nakryiko
2021-03-26 18:25         ` Toke Høiland-Jørgensen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).