Skip to content

Commit

Permalink
selftests/bpf: check bpf verifier log buffer usage works for HW offload
Browse files Browse the repository at this point in the history
Make netdevsim print a message to the BPF verifier log buffer when a
program is offloaded.

Then use this message in hardware offload selftests to make sure that
using this buffer actually prints the message to the console for
eBPF hardware offload.

The message is appended after the last instruction is processed with the
verifying function from netdevsim. Output looks like the following:

    $ tc filter add dev foo ingress bpf obj sample_ret0.o \
        sec .text verbose skip_sw

    Prog section '.text' loaded (5)!
     - Type:         3
     - Instructions: 2 (0 over limit)
     - License:

    Verifier analysis:

    0: (b7) r0 = 0
    1: (95) exit
    [netdevsim] Hello from netdevsim!
    processed 2 insns, stack depth 0

"verbose" flag is required to see it in the console since netdevsim does
not throw an error after printing the message.

Signed-off-by: Quentin Monnet <[email protected]>
Reviewed-by: Jakub Kicinski <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
qmonnet authored and davem330 committed Jan 24, 2018
1 parent 7c5db7e commit 9045bdc
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 5 deletions.
6 changes: 6 additions & 0 deletions drivers/net/netdevsim/bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@

#include "netdevsim.h"

#define pr_vlog(env, fmt, ...) \
bpf_verifier_log_write(env, "[netdevsim] " fmt, ##__VA_ARGS__)

struct nsim_bpf_bound_prog {
struct netdevsim *ns;
struct bpf_prog *prog;
Expand Down Expand Up @@ -77,6 +80,9 @@ nsim_bpf_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn)
if (state->ns->bpf_bind_verifier_delay && !insn_idx)
msleep(state->ns->bpf_bind_verifier_delay);

if (insn_idx == env->prog->len - 1)
pr_vlog(env, "Hello from netdevsim!\n");

return 0;
}

Expand Down
24 changes: 19 additions & 5 deletions tools/testing/selftests/bpf/test_offload.py
Original file line number Diff line number Diff line change
Expand Up @@ -362,8 +362,10 @@ def set_mtu(self, mtu, fail=True):
return ip("link set dev %s mtu %d" % (self.dev["ifname"], mtu),
fail=fail)

def set_xdp(self, bpf, mode, force=False, JSON=True,
def set_xdp(self, bpf, mode, force=False, JSON=True, verbose=False,
fail=True, include_stderr=False):
if verbose:
bpf += " verbose"
return ip("link set dev %s xdp%s %s" % (self.dev["ifname"], mode, bpf),
force=force, JSON=JSON,
fail=fail, include_stderr=include_stderr)
Expand Down Expand Up @@ -427,11 +429,13 @@ def tc_show_ingress(self, expected=None):
(len(filters), expected))
return filters

def cls_bpf_add_filter(self, bpf, da=False, skip_sw=False, skip_hw=False,
fail=True, include_stderr=False):
def cls_bpf_add_filter(self, bpf, da=False, verbose=False, skip_sw=False,
skip_hw=False, fail=True, include_stderr=False):
params = ""
if da:
params += " da"
if verbose:
params += " verbose"
if skip_sw:
params += " skip_sw"
if skip_hw:
Expand Down Expand Up @@ -520,6 +524,13 @@ def check_extack(output, reference, args):
def check_extack_nsim(output, reference, args):
check_extack(output, "Error: netdevsim: " + reference, args)

def check_verifier_log(output, reference):
lines = output.split("\n")
for l in reversed(lines):
if l == reference:
return
fail(True, "Missing or incorrect message from netdevsim in verifier log")

# Parse command line
parser = argparse.ArgumentParser()
parser.add_argument("--log", help="output verbose log to given file")
Expand Down Expand Up @@ -634,8 +645,10 @@ def check_extack_nsim(output, reference, args):
sim.wait_for_flush()

start_test("Test TC offloads work...")
ret, _ = sim.cls_bpf_add_filter(obj, skip_sw=True, fail=False)
ret, _, err = sim.cls_bpf_add_filter(obj, verbose=True, skip_sw=True,
fail=False, include_stderr=True)
fail(ret != 0, "TC filter did not load with TC offloads enabled")
check_verifier_log(err, "[netdevsim] Hello from netdevsim!")

start_test("Test TC offload basics...")
dfs = sim.dfs_get_bound_progs(expected=1)
Expand Down Expand Up @@ -744,12 +757,13 @@ def check_extack_nsim(output, reference, args):

sim.wait_for_flush()
start_test("Test XDP offload...")
sim.set_xdp(obj, "offload")
_, _, err = sim.set_xdp(obj, "offload", verbose=True, include_stderr=True)
ipl = sim.ip_link_show(xdp=True)
link_xdp = ipl["xdp"]["prog"]
progs = bpftool_prog_list(expected=1)
prog = progs[0]
fail(link_xdp["id"] != prog["id"], "Loaded program has wrong ID")
check_verifier_log(err, "[netdevsim] Hello from netdevsim!")

start_test("Test XDP offload is device bound...")
dfs = sim.dfs_get_bound_progs(expected=1)
Expand Down

0 comments on commit 9045bdc

Please sign in to comment.