aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2018-05-10 13:24:42 -0400
committerDaniel Borkmann <daniel@iogearbox.net>2018-05-10 19:40:52 -0400
commit17387dd5ac2c9c4e5f7d38b5affcd70e059f0a8c (patch)
tree3eff4d0d19a8bfc59266fd2ca56fce6eeb818517 /tools/lib
parent2eb57bb8f6769fe94f8f9865342ffa0f6c257e0a (diff)
tools: bpf: don't complain about no kernel version for networking code
BPF programs only have to specify the target kernel version for tracing related hooks, in networking world that requirement does not really apply. Loosen the checks in libbpf to reflect that. bpf_object__open() users will continue to see the error for backward compatibility (and because prog_type is not available there). Error code for NULL file name is changed from ENOENT to EINVAL, as it seems more appropriate, hopefully, that's an OK change. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'tools/lib')
-rw-r--r--tools/lib/bpf/libbpf.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index ce96f1fe3f37..df54c4c9e48a 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -1438,9 +1438,37 @@ bpf_object__load_progs(struct bpf_object *obj)
1438 return 0; 1438 return 0;
1439} 1439}
1440 1440
1441static int bpf_object__validate(struct bpf_object *obj) 1441static bool bpf_prog_type__needs_kver(enum bpf_prog_type type)
1442{
1443 switch (type) {
1444 case BPF_PROG_TYPE_SOCKET_FILTER:
1445 case BPF_PROG_TYPE_SCHED_CLS:
1446 case BPF_PROG_TYPE_SCHED_ACT:
1447 case BPF_PROG_TYPE_XDP:
1448 case BPF_PROG_TYPE_CGROUP_SKB:
1449 case BPF_PROG_TYPE_CGROUP_SOCK:
1450 case BPF_PROG_TYPE_LWT_IN:
1451 case BPF_PROG_TYPE_LWT_OUT:
1452 case BPF_PROG_TYPE_LWT_XMIT:
1453 case BPF_PROG_TYPE_SOCK_OPS:
1454 case BPF_PROG_TYPE_SK_SKB:
1455 case BPF_PROG_TYPE_CGROUP_DEVICE:
1456 case BPF_PROG_TYPE_SK_MSG:
1457 case BPF_PROG_TYPE_CGROUP_SOCK_ADDR:
1458 return false;
1459 case BPF_PROG_TYPE_UNSPEC:
1460 case BPF_PROG_TYPE_KPROBE:
1461 case BPF_PROG_TYPE_TRACEPOINT:
1462 case BPF_PROG_TYPE_PERF_EVENT:
1463 case BPF_PROG_TYPE_RAW_TRACEPOINT:
1464 default:
1465 return true;
1466 }
1467}
1468
1469static int bpf_object__validate(struct bpf_object *obj, bool needs_kver)
1442{ 1470{
1443 if (obj->kern_version == 0) { 1471 if (needs_kver && obj->kern_version == 0) {
1444 pr_warning("%s doesn't provide kernel version\n", 1472 pr_warning("%s doesn't provide kernel version\n",
1445 obj->path); 1473 obj->path);
1446 return -LIBBPF_ERRNO__KVERSION; 1474 return -LIBBPF_ERRNO__KVERSION;
@@ -1449,7 +1477,8 @@ static int bpf_object__validate(struct bpf_object *obj)
1449} 1477}
1450 1478
1451static struct bpf_object * 1479static struct bpf_object *
1452__bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz) 1480__bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz,
1481 bool needs_kver)
1453{ 1482{
1454 struct bpf_object *obj; 1483 struct bpf_object *obj;
1455 int err; 1484 int err;
@@ -1467,7 +1496,7 @@ __bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz)
1467 CHECK_ERR(bpf_object__check_endianness(obj), err, out); 1496 CHECK_ERR(bpf_object__check_endianness(obj), err, out);
1468 CHECK_ERR(bpf_object__elf_collect(obj), err, out); 1497 CHECK_ERR(bpf_object__elf_collect(obj), err, out);
1469 CHECK_ERR(bpf_object__collect_reloc(obj), err, out); 1498 CHECK_ERR(bpf_object__collect_reloc(obj), err, out);
1470 CHECK_ERR(bpf_object__validate(obj), err, out); 1499 CHECK_ERR(bpf_object__validate(obj, needs_kver), err, out);
1471 1500
1472 bpf_object__elf_finish(obj); 1501 bpf_object__elf_finish(obj);
1473 return obj; 1502 return obj;
@@ -1484,7 +1513,7 @@ struct bpf_object *bpf_object__open(const char *path)
1484 1513
1485 pr_debug("loading %s\n", path); 1514 pr_debug("loading %s\n", path);
1486 1515
1487 return __bpf_object__open(path, NULL, 0); 1516 return __bpf_object__open(path, NULL, 0, true);
1488} 1517}
1489 1518
1490struct bpf_object *bpf_object__open_buffer(void *obj_buf, 1519struct bpf_object *bpf_object__open_buffer(void *obj_buf,
@@ -1507,7 +1536,7 @@ struct bpf_object *bpf_object__open_buffer(void *obj_buf,
1507 pr_debug("loading object '%s' from buffer\n", 1536 pr_debug("loading object '%s' from buffer\n",
1508 name); 1537 name);
1509 1538
1510 return __bpf_object__open(name, obj_buf, obj_buf_sz); 1539 return __bpf_object__open(name, obj_buf, obj_buf_sz, true);
1511} 1540}
1512 1541
1513int bpf_object__unload(struct bpf_object *obj) 1542int bpf_object__unload(struct bpf_object *obj)
@@ -2164,8 +2193,11 @@ int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
2164 2193
2165 if (!attr) 2194 if (!attr)
2166 return -EINVAL; 2195 return -EINVAL;
2196 if (!attr->file)
2197 return -EINVAL;
2167 2198
2168 obj = bpf_object__open(attr->file); 2199 obj = __bpf_object__open(attr->file, NULL, 0,
2200 bpf_prog_type__needs_kver(attr->prog_type));
2169 if (IS_ERR(obj)) 2201 if (IS_ERR(obj))
2170 return -ENOENT; 2202 return -ENOENT;
2171 2203