Lines Matching +full:data +full:- +full:out
1 // SPDX-License-Identifier: GPL-2.0-only
16 #include <linux/error-injection.h>
34 if (t->mode == NO_PREEMPT) in bpf_test_timer_enter()
39 t->time_start = ktime_get_ns(); in bpf_test_timer_enter()
45 t->time_start = 0; in bpf_test_timer_leave()
47 if (t->mode == NO_PREEMPT) in bpf_test_timer_leave()
57 t->i++; in bpf_test_timer_continue()
58 if (t->i >= repeat) { in bpf_test_timer_continue()
60 t->time_spent += ktime_get_ns() - t->time_start; in bpf_test_timer_continue()
61 do_div(t->time_spent, t->i); in bpf_test_timer_continue()
62 *duration = t->time_spent > U32_MAX ? U32_MAX : (u32)t->time_spent; in bpf_test_timer_continue()
69 *err = -EINTR; in bpf_test_timer_continue()
75 t->time_spent += ktime_get_ns() - t->time_start; in bpf_test_timer_continue()
85 t->i = 0; in bpf_test_timer_continue()
105 return -ENOMEM; in bpf_test_run()
131 union bpf_attr __user *uattr, const void *data, in bpf_test_finish() argument
134 void __user *data_out = u64_to_user_ptr(kattr->test.data_out); in bpf_test_finish()
135 int err = -EFAULT; in bpf_test_finish()
141 if (kattr->test.data_size_out && in bpf_test_finish()
142 copy_size > kattr->test.data_size_out) { in bpf_test_finish()
143 copy_size = kattr->test.data_size_out; in bpf_test_finish()
144 err = -ENOSPC; in bpf_test_finish()
147 if (data_out && copy_to_user(data_out, data, copy_size)) in bpf_test_finish()
148 goto out; in bpf_test_finish()
149 if (copy_to_user(&uattr->test.data_size_out, &size, sizeof(size))) in bpf_test_finish()
150 goto out; in bpf_test_finish()
151 if (copy_to_user(&uattr->test.retval, &retval, sizeof(retval))) in bpf_test_finish()
152 goto out; in bpf_test_finish()
153 if (copy_to_user(&uattr->test.duration, &duration, sizeof(duration))) in bpf_test_finish()
154 goto out; in bpf_test_finish()
155 if (err != -ENOSPC) in bpf_test_finish()
157 out: in bpf_test_finish()
167 __diag_ignore(GCC, 8, "-Wmissing-prototypes",
210 return (long)arg->a; in bpf_fentry_test8()
252 void __user *data_in = u64_to_user_ptr(kattr->test.data_in); in bpf_test_init()
253 u32 user_size = kattr->test.data_size_in; in bpf_test_init()
254 void *data; in bpf_test_init() local
256 if (size < ETH_HLEN || size > PAGE_SIZE - headroom - tailroom) in bpf_test_init()
257 return ERR_PTR(-EINVAL); in bpf_test_init()
260 return ERR_PTR(-EMSGSIZE); in bpf_test_init()
262 data = kzalloc(size + headroom + tailroom, GFP_USER); in bpf_test_init()
263 if (!data) in bpf_test_init()
264 return ERR_PTR(-ENOMEM); in bpf_test_init()
266 if (copy_from_user(data + headroom, data_in, user_size)) { in bpf_test_init()
267 kfree(data); in bpf_test_init()
268 return ERR_PTR(-EFAULT); in bpf_test_init()
271 return data; in bpf_test_init()
280 int b = 2, err = -EFAULT; in bpf_prog_test_run_tracing()
283 if (kattr->test.flags || kattr->test.cpu) in bpf_prog_test_run_tracing()
284 return -EINVAL; in bpf_prog_test_run_tracing()
286 switch (prog->expected_attach_type) { in bpf_prog_test_run_tracing()
297 goto out; in bpf_prog_test_run_tracing()
305 goto out; in bpf_prog_test_run_tracing()
309 if (copy_to_user(&uattr->test.retval, &retval, sizeof(retval))) in bpf_prog_test_run_tracing()
310 goto out; in bpf_prog_test_run_tracing()
313 out: in bpf_prog_test_run_tracing()
325 __bpf_prog_test_run_raw_tp(void *data) in __bpf_prog_test_run_raw_tp() argument
327 struct bpf_raw_tp_test_run_info *info = data; in __bpf_prog_test_run_raw_tp()
330 info->retval = bpf_prog_run(info->prog, info->ctx); in __bpf_prog_test_run_raw_tp()
338 void __user *ctx_in = u64_to_user_ptr(kattr->test.ctx_in); in bpf_prog_test_run_raw_tp()
339 __u32 ctx_size_in = kattr->test.ctx_size_in; in bpf_prog_test_run_raw_tp()
341 int cpu = kattr->test.cpu, err = 0; in bpf_prog_test_run_raw_tp()
344 /* doesn't support data_in/out, ctx_out, duration, or repeat */ in bpf_prog_test_run_raw_tp()
345 if (kattr->test.data_in || kattr->test.data_out || in bpf_prog_test_run_raw_tp()
346 kattr->test.ctx_out || kattr->test.duration || in bpf_prog_test_run_raw_tp()
347 kattr->test.repeat) in bpf_prog_test_run_raw_tp()
348 return -EINVAL; in bpf_prog_test_run_raw_tp()
350 if (ctx_size_in < prog->aux->max_ctx_offset || in bpf_prog_test_run_raw_tp()
352 return -EINVAL; in bpf_prog_test_run_raw_tp()
354 if ((kattr->test.flags & BPF_F_TEST_RUN_ON_CPU) == 0 && cpu != 0) in bpf_prog_test_run_raw_tp()
355 return -EINVAL; in bpf_prog_test_run_raw_tp()
360 return -ENOMEM; in bpf_prog_test_run_raw_tp()
362 err = -EFAULT; in bpf_prog_test_run_raw_tp()
363 goto out; in bpf_prog_test_run_raw_tp()
372 if ((kattr->test.flags & BPF_F_TEST_RUN_ON_CPU) == 0 || in bpf_prog_test_run_raw_tp()
378 * space, let's do an extra quick check to filter out in bpf_prog_test_run_raw_tp()
381 err = -ENXIO; in bpf_prog_test_run_raw_tp()
389 copy_to_user(&uattr->test.retval, &info.retval, sizeof(u32))) in bpf_prog_test_run_raw_tp()
390 err = -EFAULT; in bpf_prog_test_run_raw_tp()
392 out: in bpf_prog_test_run_raw_tp()
399 void __user *data_in = u64_to_user_ptr(kattr->test.ctx_in); in bpf_ctx_init()
400 void __user *data_out = u64_to_user_ptr(kattr->test.ctx_out); in bpf_ctx_init()
401 u32 size = kattr->test.ctx_size_in; in bpf_ctx_init()
402 void *data; in bpf_ctx_init() local
408 data = kzalloc(max_size, GFP_USER); in bpf_ctx_init()
409 if (!data) in bpf_ctx_init()
410 return ERR_PTR(-ENOMEM); in bpf_ctx_init()
415 kfree(data); in bpf_ctx_init()
420 if (copy_from_user(data, data_in, size)) { in bpf_ctx_init()
421 kfree(data); in bpf_ctx_init()
422 return ERR_PTR(-EFAULT); in bpf_ctx_init()
425 return data; in bpf_ctx_init()
429 union bpf_attr __user *uattr, const void *data, in bpf_ctx_finish() argument
432 void __user *data_out = u64_to_user_ptr(kattr->test.ctx_out); in bpf_ctx_finish()
433 int err = -EFAULT; in bpf_ctx_finish()
436 if (!data || !data_out) in bpf_ctx_finish()
439 if (copy_size > kattr->test.ctx_size_out) { in bpf_ctx_finish()
440 copy_size = kattr->test.ctx_size_out; in bpf_ctx_finish()
441 err = -ENOSPC; in bpf_ctx_finish()
444 if (copy_to_user(data_out, data, copy_size)) in bpf_ctx_finish()
445 goto out; in bpf_ctx_finish()
446 if (copy_to_user(&uattr->test.ctx_size_out, &size, sizeof(size))) in bpf_ctx_finish()
447 goto out; in bpf_ctx_finish()
448 if (err != -ENOSPC) in bpf_ctx_finish()
450 out: in bpf_ctx_finish()
455 * range_is_zero - test whether buffer is initialized
460 * This function returns true if the there is a non-zero byte
465 return !memchr_inv((u8 *)buf + from, 0, to - from); in range_is_zero()
470 struct qdisc_skb_cb *cb = (struct qdisc_skb_cb *)skb->cb; in convert___skb_to_skb()
477 return -EINVAL; in convert___skb_to_skb()
483 return -EINVAL; in convert___skb_to_skb()
489 return -EINVAL; in convert___skb_to_skb()
495 return -EINVAL; in convert___skb_to_skb()
501 return -EINVAL; in convert___skb_to_skb()
509 return -EINVAL; in convert___skb_to_skb()
515 return -EINVAL; in convert___skb_to_skb()
517 skb->mark = __skb->mark; in convert___skb_to_skb()
518 skb->priority = __skb->priority; in convert___skb_to_skb()
519 skb->tstamp = __skb->tstamp; in convert___skb_to_skb()
520 memcpy(&cb->data, __skb->cb, QDISC_CB_PRIV_LEN); in convert___skb_to_skb()
522 if (__skb->wire_len == 0) { in convert___skb_to_skb()
523 cb->pkt_len = skb->len; in convert___skb_to_skb()
525 if (__skb->wire_len < skb->len || in convert___skb_to_skb()
526 __skb->wire_len > GSO_MAX_SIZE) in convert___skb_to_skb()
527 return -EINVAL; in convert___skb_to_skb()
528 cb->pkt_len = __skb->wire_len; in convert___skb_to_skb()
531 if (__skb->gso_segs > GSO_MAX_SEGS) in convert___skb_to_skb()
532 return -EINVAL; in convert___skb_to_skb()
533 skb_shinfo(skb)->gso_segs = __skb->gso_segs; in convert___skb_to_skb()
534 skb_shinfo(skb)->gso_size = __skb->gso_size; in convert___skb_to_skb()
541 struct qdisc_skb_cb *cb = (struct qdisc_skb_cb *)skb->cb; in convert_skb_to___skb()
546 __skb->mark = skb->mark; in convert_skb_to___skb()
547 __skb->priority = skb->priority; in convert_skb_to___skb()
548 __skb->ifindex = skb->dev->ifindex; in convert_skb_to___skb()
549 __skb->tstamp = skb->tstamp; in convert_skb_to___skb()
550 memcpy(__skb->cb, &cb->data, QDISC_CB_PRIV_LEN); in convert_skb_to___skb()
551 __skb->wire_len = cb->pkt_len; in convert_skb_to___skb()
552 __skb->gso_segs = skb_shinfo(skb)->gso_segs; in convert_skb_to___skb()
565 struct net *net = current->nsproxy->net_ns; in bpf_prog_test_run_skb()
566 struct net_device *dev = net->loopback_dev; in bpf_prog_test_run_skb()
567 u32 size = kattr->test.data_size_in; in bpf_prog_test_run_skb()
568 u32 repeat = kattr->test.repeat; in bpf_prog_test_run_skb()
574 void *data; in bpf_prog_test_run_skb() local
577 if (kattr->test.flags || kattr->test.cpu) in bpf_prog_test_run_skb()
578 return -EINVAL; in bpf_prog_test_run_skb()
580 data = bpf_test_init(kattr, size, NET_SKB_PAD + NET_IP_ALIGN, in bpf_prog_test_run_skb()
582 if (IS_ERR(data)) in bpf_prog_test_run_skb()
583 return PTR_ERR(data); in bpf_prog_test_run_skb()
587 kfree(data); in bpf_prog_test_run_skb()
591 switch (prog->type) { in bpf_prog_test_run_skb()
607 kfree(data); in bpf_prog_test_run_skb()
609 return -ENOMEM; in bpf_prog_test_run_skb()
613 skb = build_skb(data, 0); in bpf_prog_test_run_skb()
615 kfree(data); in bpf_prog_test_run_skb()
618 return -ENOMEM; in bpf_prog_test_run_skb()
620 skb->sk = sk; in bpf_prog_test_run_skb()
624 if (ctx && ctx->ifindex > 1) { in bpf_prog_test_run_skb()
625 dev = dev_get_by_index(net, ctx->ifindex); in bpf_prog_test_run_skb()
627 ret = -ENODEV; in bpf_prog_test_run_skb()
628 goto out; in bpf_prog_test_run_skb()
631 skb->protocol = eth_type_trans(skb, dev); in bpf_prog_test_run_skb()
634 switch (skb->protocol) { in bpf_prog_test_run_skb()
636 sk->sk_family = AF_INET; in bpf_prog_test_run_skb()
638 sk->sk_rcv_saddr = ip_hdr(skb)->saddr; in bpf_prog_test_run_skb()
639 sk->sk_daddr = ip_hdr(skb)->daddr; in bpf_prog_test_run_skb()
644 sk->sk_family = AF_INET6; in bpf_prog_test_run_skb()
646 sk->sk_v6_rcv_saddr = ipv6_hdr(skb)->saddr; in bpf_prog_test_run_skb()
647 sk->sk_v6_daddr = ipv6_hdr(skb)->daddr; in bpf_prog_test_run_skb()
661 goto out; in bpf_prog_test_run_skb()
664 goto out; in bpf_prog_test_run_skb()
667 int nhead = HH_DATA_ALIGN(hh_len - skb_headroom(skb)); in bpf_prog_test_run_skb()
670 ret = -ENOMEM; in bpf_prog_test_run_skb()
671 goto out; in bpf_prog_test_run_skb()
678 size = skb->len; in bpf_prog_test_run_skb()
679 /* bpf program can never convert linear skb to non-linear */ in bpf_prog_test_run_skb()
682 ret = bpf_test_finish(kattr, uattr, skb->data, size, retval, duration); in bpf_prog_test_run_skb()
686 out: in bpf_prog_test_run_skb()
687 if (dev && dev != net->loopback_dev) in bpf_prog_test_run_skb()
704 if (xdp_md->egress_ifindex != 0) in xdp_convert_md_to_buff()
705 return -EINVAL; in xdp_convert_md_to_buff()
707 ingress_ifindex = xdp_md->ingress_ifindex; in xdp_convert_md_to_buff()
708 rx_queue_index = xdp_md->rx_queue_index; in xdp_convert_md_to_buff()
711 return -EINVAL; in xdp_convert_md_to_buff()
714 device = dev_get_by_index(current->nsproxy->net_ns, in xdp_convert_md_to_buff()
717 return -ENODEV; in xdp_convert_md_to_buff()
719 if (rx_queue_index >= device->real_num_rx_queues) in xdp_convert_md_to_buff()
724 if (!xdp_rxq_info_is_reg(&rxqueue->xdp_rxq)) in xdp_convert_md_to_buff()
727 xdp->rxq = &rxqueue->xdp_rxq; in xdp_convert_md_to_buff()
728 /* The device is now tracked in the xdp->rxq for later in xdp_convert_md_to_buff()
733 xdp->data = xdp->data_meta + xdp_md->data; in xdp_convert_md_to_buff()
738 return -EINVAL; in xdp_convert_md_to_buff()
746 xdp_md->data = xdp->data - xdp->data_meta; in xdp_convert_buff_to_md()
747 xdp_md->data_end = xdp->data_end - xdp->data_meta; in xdp_convert_buff_to_md()
749 if (xdp_md->ingress_ifindex) in xdp_convert_buff_to_md()
750 dev_put(xdp->rxq->dev); in xdp_convert_buff_to_md()
758 u32 size = kattr->test.data_size_in; in bpf_prog_test_run_xdp()
759 u32 repeat = kattr->test.repeat; in bpf_prog_test_run_xdp()
765 void *data; in bpf_prog_test_run_xdp() local
766 int ret = -EINVAL; in bpf_prog_test_run_xdp()
768 if (prog->expected_attach_type == BPF_XDP_DEVMAP || in bpf_prog_test_run_xdp()
769 prog->expected_attach_type == BPF_XDP_CPUMAP) in bpf_prog_test_run_xdp()
770 return -EINVAL; in bpf_prog_test_run_xdp()
777 /* There can't be user provided data before the meta data */ in bpf_prog_test_run_xdp()
778 if (ctx->data_meta || ctx->data_end != size || in bpf_prog_test_run_xdp()
779 ctx->data > ctx->data_end || in bpf_prog_test_run_xdp()
780 unlikely(xdp_metalen_invalid(ctx->data))) in bpf_prog_test_run_xdp()
782 /* Meta data is allocated from the headroom */ in bpf_prog_test_run_xdp()
783 headroom -= ctx->data; in bpf_prog_test_run_xdp()
787 max_data_sz = 4096 - headroom - tailroom; in bpf_prog_test_run_xdp()
789 data = bpf_test_init(kattr, max_data_sz, headroom, tailroom); in bpf_prog_test_run_xdp()
790 if (IS_ERR(data)) { in bpf_prog_test_run_xdp()
791 ret = PTR_ERR(data); in bpf_prog_test_run_xdp()
795 rxqueue = __netif_get_rx_queue(current->nsproxy->net_ns->loopback_dev, 0); in bpf_prog_test_run_xdp()
797 &rxqueue->xdp_rxq); in bpf_prog_test_run_xdp()
798 xdp_prepare_buff(&xdp, data, headroom, size, true); in bpf_prog_test_run_xdp()
812 goto out; in bpf_prog_test_run_xdp()
814 if (xdp.data_meta != data + headroom || in bpf_prog_test_run_xdp()
816 size = xdp.data_end - xdp.data_meta; in bpf_prog_test_run_xdp()
824 out: in bpf_prog_test_run_xdp()
827 kfree(data); in bpf_prog_test_run_xdp()
837 return -EINVAL; in verify_user_bpf_flow_keys()
843 return -EINVAL; in verify_user_bpf_flow_keys()
853 u32 size = kattr->test.data_size_in; in bpf_prog_test_run_flow_dissector()
855 u32 repeat = kattr->test.repeat; in bpf_prog_test_run_flow_dissector()
861 void *data; in bpf_prog_test_run_flow_dissector() local
864 if (prog->type != BPF_PROG_TYPE_FLOW_DISSECTOR) in bpf_prog_test_run_flow_dissector()
865 return -EINVAL; in bpf_prog_test_run_flow_dissector()
867 if (kattr->test.flags || kattr->test.cpu) in bpf_prog_test_run_flow_dissector()
868 return -EINVAL; in bpf_prog_test_run_flow_dissector()
871 return -EINVAL; in bpf_prog_test_run_flow_dissector()
873 data = bpf_test_init(kattr, size, 0, 0); in bpf_prog_test_run_flow_dissector()
874 if (IS_ERR(data)) in bpf_prog_test_run_flow_dissector()
875 return PTR_ERR(data); in bpf_prog_test_run_flow_dissector()
877 eth = (struct ethhdr *)data; in bpf_prog_test_run_flow_dissector()
884 kfree(data); in bpf_prog_test_run_flow_dissector()
890 goto out; in bpf_prog_test_run_flow_dissector()
891 flags = user_ctx->flags; in bpf_prog_test_run_flow_dissector()
895 ctx.data = data; in bpf_prog_test_run_flow_dissector()
896 ctx.data_end = (__u8 *)data + size; in bpf_prog_test_run_flow_dissector()
900 retval = bpf_flow_dissect(prog, &ctx, eth->h_proto, ETH_HLEN, in bpf_prog_test_run_flow_dissector()
906 goto out; in bpf_prog_test_run_flow_dissector()
914 out: in bpf_prog_test_run_flow_dissector()
916 kfree(data); in bpf_prog_test_run_flow_dissector()
926 u32 repeat = kattr->test.repeat; in bpf_prog_test_run_sk_lookup()
929 int ret = -EINVAL; in bpf_prog_test_run_sk_lookup()
931 if (prog->type != BPF_PROG_TYPE_SK_LOOKUP) in bpf_prog_test_run_sk_lookup()
932 return -EINVAL; in bpf_prog_test_run_sk_lookup()
934 if (kattr->test.flags || kattr->test.cpu) in bpf_prog_test_run_sk_lookup()
935 return -EINVAL; in bpf_prog_test_run_sk_lookup()
937 if (kattr->test.data_in || kattr->test.data_size_in || kattr->test.data_out || in bpf_prog_test_run_sk_lookup()
938 kattr->test.data_size_out) in bpf_prog_test_run_sk_lookup()
939 return -EINVAL; in bpf_prog_test_run_sk_lookup()
949 return -EINVAL; in bpf_prog_test_run_sk_lookup()
951 if (user_ctx->sk) in bpf_prog_test_run_sk_lookup()
952 goto out; in bpf_prog_test_run_sk_lookup()
955 goto out; in bpf_prog_test_run_sk_lookup()
957 if (user_ctx->local_port > U16_MAX || user_ctx->remote_port > U16_MAX) { in bpf_prog_test_run_sk_lookup()
958 ret = -ERANGE; in bpf_prog_test_run_sk_lookup()
959 goto out; in bpf_prog_test_run_sk_lookup()
962 ctx.family = (u16)user_ctx->family; in bpf_prog_test_run_sk_lookup()
963 ctx.protocol = (u16)user_ctx->protocol; in bpf_prog_test_run_sk_lookup()
964 ctx.dport = (u16)user_ctx->local_port; in bpf_prog_test_run_sk_lookup()
965 ctx.sport = (__force __be16)user_ctx->remote_port; in bpf_prog_test_run_sk_lookup()
969 ctx.v4.daddr = (__force __be32)user_ctx->local_ip4; in bpf_prog_test_run_sk_lookup()
970 ctx.v4.saddr = (__force __be32)user_ctx->remote_ip4; in bpf_prog_test_run_sk_lookup()
975 ctx.v6.daddr = (struct in6_addr *)user_ctx->local_ip6; in bpf_prog_test_run_sk_lookup()
976 ctx.v6.saddr = (struct in6_addr *)user_ctx->remote_ip6; in bpf_prog_test_run_sk_lookup()
981 ret = -EAFNOSUPPORT; in bpf_prog_test_run_sk_lookup()
982 goto out; in bpf_prog_test_run_sk_lookup()
987 ret = -ENOMEM; in bpf_prog_test_run_sk_lookup()
988 goto out; in bpf_prog_test_run_sk_lookup()
991 progs->items[0].prog = prog; in bpf_prog_test_run_sk_lookup()
1001 goto out; in bpf_prog_test_run_sk_lookup()
1003 user_ctx->cookie = 0; in bpf_prog_test_run_sk_lookup()
1005 if (ctx.selected_sk->sk_reuseport && !ctx.no_reuseport) { in bpf_prog_test_run_sk_lookup()
1006 ret = -EOPNOTSUPP; in bpf_prog_test_run_sk_lookup()
1007 goto out; in bpf_prog_test_run_sk_lookup()
1010 user_ctx->cookie = sock_gen_cookie(ctx.selected_sk); in bpf_prog_test_run_sk_lookup()
1017 out: in bpf_prog_test_run_sk_lookup()
1027 void __user *ctx_in = u64_to_user_ptr(kattr->test.ctx_in); in bpf_prog_test_run_syscall()
1028 __u32 ctx_size_in = kattr->test.ctx_size_in; in bpf_prog_test_run_syscall()
1033 /* doesn't support data_in/out, ctx_out, duration, or repeat or flags */ in bpf_prog_test_run_syscall()
1034 if (kattr->test.data_in || kattr->test.data_out || in bpf_prog_test_run_syscall()
1035 kattr->test.ctx_out || kattr->test.duration || in bpf_prog_test_run_syscall()
1036 kattr->test.repeat || kattr->test.flags) in bpf_prog_test_run_syscall()
1037 return -EINVAL; in bpf_prog_test_run_syscall()
1039 if (ctx_size_in < prog->aux->max_ctx_offset || in bpf_prog_test_run_syscall()
1041 return -EINVAL; in bpf_prog_test_run_syscall()
1046 return -ENOMEM; in bpf_prog_test_run_syscall()
1048 err = -EFAULT; in bpf_prog_test_run_syscall()
1049 goto out; in bpf_prog_test_run_syscall()
1057 if (copy_to_user(&uattr->test.retval, &retval, sizeof(u32))) { in bpf_prog_test_run_syscall()
1058 err = -EFAULT; in bpf_prog_test_run_syscall()
1059 goto out; in bpf_prog_test_run_syscall()
1063 err = -EFAULT; in bpf_prog_test_run_syscall()
1064 out: in bpf_prog_test_run_syscall()