diff options
Diffstat (limited to 'tools/lib/bpf/bpf.c')
-rw-r--r-- | tools/lib/bpf/bpf.c | 129 |
1 files changed, 0 insertions, 129 deletions
diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 60aa4ca8b2c5..3878a26a2071 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c | |||
@@ -28,16 +28,8 @@ | |||
28 | #include <linux/bpf.h> | 28 | #include <linux/bpf.h> |
29 | #include "bpf.h" | 29 | #include "bpf.h" |
30 | #include "libbpf.h" | 30 | #include "libbpf.h" |
31 | #include "nlattr.h" | ||
32 | #include <linux/rtnetlink.h> | ||
33 | #include <linux/if_link.h> | ||
34 | #include <sys/socket.h> | ||
35 | #include <errno.h> | 31 | #include <errno.h> |
36 | 32 | ||
37 | #ifndef SOL_NETLINK | ||
38 | #define SOL_NETLINK 270 | ||
39 | #endif | ||
40 | |||
41 | /* | 33 | /* |
42 | * When building perf, unistd.h is overridden. __NR_bpf is | 34 | * When building perf, unistd.h is overridden. __NR_bpf is |
43 | * required to be defined explicitly. | 35 | * required to be defined explicitly. |
@@ -499,127 +491,6 @@ int bpf_raw_tracepoint_open(const char *name, int prog_fd) | |||
499 | return sys_bpf(BPF_RAW_TRACEPOINT_OPEN, &attr, sizeof(attr)); | 491 | return sys_bpf(BPF_RAW_TRACEPOINT_OPEN, &attr, sizeof(attr)); |
500 | } | 492 | } |
501 | 493 | ||
502 | int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags) | ||
503 | { | ||
504 | struct sockaddr_nl sa; | ||
505 | int sock, seq = 0, len, ret = -1; | ||
506 | char buf[4096]; | ||
507 | struct nlattr *nla, *nla_xdp; | ||
508 | struct { | ||
509 | struct nlmsghdr nh; | ||
510 | struct ifinfomsg ifinfo; | ||
511 | char attrbuf[64]; | ||
512 | } req; | ||
513 | struct nlmsghdr *nh; | ||
514 | struct nlmsgerr *err; | ||
515 | socklen_t addrlen; | ||
516 | int one = 1; | ||
517 | |||
518 | memset(&sa, 0, sizeof(sa)); | ||
519 | sa.nl_family = AF_NETLINK; | ||
520 | |||
521 | sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); | ||
522 | if (sock < 0) { | ||
523 | return -errno; | ||
524 | } | ||
525 | |||
526 | if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, | ||
527 | &one, sizeof(one)) < 0) { | ||
528 | fprintf(stderr, "Netlink error reporting not supported\n"); | ||
529 | } | ||
530 | |||
531 | if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) { | ||
532 | ret = -errno; | ||
533 | goto cleanup; | ||
534 | } | ||
535 | |||
536 | addrlen = sizeof(sa); | ||
537 | if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0) { | ||
538 | ret = -errno; | ||
539 | goto cleanup; | ||
540 | } | ||
541 | |||
542 | if (addrlen != sizeof(sa)) { | ||
543 | ret = -LIBBPF_ERRNO__INTERNAL; | ||
544 | goto cleanup; | ||
545 | } | ||
546 | |||
547 | memset(&req, 0, sizeof(req)); | ||
548 | req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); | ||
549 | req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; | ||
550 | req.nh.nlmsg_type = RTM_SETLINK; | ||
551 | req.nh.nlmsg_pid = 0; | ||
552 | req.nh.nlmsg_seq = ++seq; | ||
553 | req.ifinfo.ifi_family = AF_UNSPEC; | ||
554 | req.ifinfo.ifi_index = ifindex; | ||
555 | |||
556 | /* started nested attribute for XDP */ | ||
557 | nla = (struct nlattr *)(((char *)&req) | ||
558 | + NLMSG_ALIGN(req.nh.nlmsg_len)); | ||
559 | nla->nla_type = NLA_F_NESTED | IFLA_XDP; | ||
560 | nla->nla_len = NLA_HDRLEN; | ||
561 | |||
562 | /* add XDP fd */ | ||
563 | nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len); | ||
564 | nla_xdp->nla_type = IFLA_XDP_FD; | ||
565 | nla_xdp->nla_len = NLA_HDRLEN + sizeof(int); | ||
566 | memcpy((char *)nla_xdp + NLA_HDRLEN, &fd, sizeof(fd)); | ||
567 | nla->nla_len += nla_xdp->nla_len; | ||
568 | |||
569 | /* if user passed in any flags, add those too */ | ||
570 | if (flags) { | ||
571 | nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len); | ||
572 | nla_xdp->nla_type = IFLA_XDP_FLAGS; | ||
573 | nla_xdp->nla_len = NLA_HDRLEN + sizeof(flags); | ||
574 | memcpy((char *)nla_xdp + NLA_HDRLEN, &flags, sizeof(flags)); | ||
575 | nla->nla_len += nla_xdp->nla_len; | ||
576 | } | ||
577 | |||
578 | req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len); | ||
579 | |||
580 | if (send(sock, &req, req.nh.nlmsg_len, 0) < 0) { | ||
581 | ret = -errno; | ||
582 | goto cleanup; | ||
583 | } | ||
584 | |||
585 | len = recv(sock, buf, sizeof(buf), 0); | ||
586 | if (len < 0) { | ||
587 | ret = -errno; | ||
588 | goto cleanup; | ||
589 | } | ||
590 | |||
591 | for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, len); | ||
592 | nh = NLMSG_NEXT(nh, len)) { | ||
593 | if (nh->nlmsg_pid != sa.nl_pid) { | ||
594 | ret = -LIBBPF_ERRNO__WRNGPID; | ||
595 | goto cleanup; | ||
596 | } | ||
597 | if (nh->nlmsg_seq != seq) { | ||
598 | ret = -LIBBPF_ERRNO__INVSEQ; | ||
599 | goto cleanup; | ||
600 | } | ||
601 | switch (nh->nlmsg_type) { | ||
602 | case NLMSG_ERROR: | ||
603 | err = (struct nlmsgerr *)NLMSG_DATA(nh); | ||
604 | if (!err->error) | ||
605 | continue; | ||
606 | ret = err->error; | ||
607 | nla_dump_errormsg(nh); | ||
608 | goto cleanup; | ||
609 | case NLMSG_DONE: | ||
610 | break; | ||
611 | default: | ||
612 | break; | ||
613 | } | ||
614 | } | ||
615 | |||
616 | ret = 0; | ||
617 | |||
618 | cleanup: | ||
619 | close(sock); | ||
620 | return ret; | ||
621 | } | ||
622 | |||
623 | int bpf_load_btf(void *btf, __u32 btf_size, char *log_buf, __u32 log_buf_size, | 494 | int bpf_load_btf(void *btf, __u32 btf_size, char *log_buf, __u32 log_buf_size, |
624 | bool do_log) | 495 | bool do_log) |
625 | { | 496 | { |