test_run.c (6b16f5d12202a23d875915349cc031c07fe1b3ec) | test_run.c (6e6fddc78323533be570873abb728b7e0ba7e024) |
---|---|
1/* Copyright (c) 2017 Facebook 2 * 3 * This program is free software; you can redistribute it and/or 4 * modify it under the terms of version 2 of the GNU General Public 5 * License as published by the Free Software Foundation. 6 */ 7#include <linux/bpf.h> 8#include <linux/slab.h> --- 82 unchanged lines hidden (view full) --- 91 92int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr, 93 union bpf_attr __user *uattr) 94{ 95 bool is_l2 = false, is_direct_pkt_access = false; 96 u32 size = kattr->test.data_size_in; 97 u32 repeat = kattr->test.repeat; 98 u32 retval, duration; | 1/* Copyright (c) 2017 Facebook 2 * 3 * This program is free software; you can redistribute it and/or 4 * modify it under the terms of version 2 of the GNU General Public 5 * License as published by the Free Software Foundation. 6 */ 7#include <linux/bpf.h> 8#include <linux/slab.h> --- 82 unchanged lines hidden (view full) --- 91 92int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr, 93 union bpf_attr __user *uattr) 94{ 95 bool is_l2 = false, is_direct_pkt_access = false; 96 u32 size = kattr->test.data_size_in; 97 u32 repeat = kattr->test.repeat; 98 u32 retval, duration; |
99 int hh_len = ETH_HLEN; |
|
99 struct sk_buff *skb; 100 void *data; 101 int ret; 102 103 data = bpf_test_init(kattr, size, NET_SKB_PAD + NET_IP_ALIGN, 104 SKB_DATA_ALIGN(sizeof(struct skb_shared_info))); 105 if (IS_ERR(data)) 106 return PTR_ERR(data); --- 19 unchanged lines hidden (view full) --- 126 } 127 128 skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); 129 __skb_put(skb, size); 130 skb->protocol = eth_type_trans(skb, current->nsproxy->net_ns->loopback_dev); 131 skb_reset_network_header(skb); 132 133 if (is_l2) | 100 struct sk_buff *skb; 101 void *data; 102 int ret; 103 104 data = bpf_test_init(kattr, size, NET_SKB_PAD + NET_IP_ALIGN, 105 SKB_DATA_ALIGN(sizeof(struct skb_shared_info))); 106 if (IS_ERR(data)) 107 return PTR_ERR(data); --- 19 unchanged lines hidden (view full) --- 127 } 128 129 skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); 130 __skb_put(skb, size); 131 skb->protocol = eth_type_trans(skb, current->nsproxy->net_ns->loopback_dev); 132 skb_reset_network_header(skb); 133 134 if (is_l2) |
134 __skb_push(skb, ETH_HLEN); | 135 __skb_push(skb, hh_len); |
135 if (is_direct_pkt_access) 136 bpf_compute_data_pointers(skb); 137 retval = bpf_test_run(prog, skb, repeat, &duration); | 136 if (is_direct_pkt_access) 137 bpf_compute_data_pointers(skb); 138 retval = bpf_test_run(prog, skb, repeat, &duration); |
138 if (!is_l2) 139 __skb_push(skb, ETH_HLEN); | 139 if (!is_l2) { 140 if (skb_headroom(skb) < hh_len) { 141 int nhead = HH_DATA_ALIGN(hh_len - skb_headroom(skb)); 142 143 if (pskb_expand_head(skb, nhead, 0, GFP_USER)) { 144 kfree_skb(skb); 145 return -ENOMEM; 146 } 147 } 148 memset(__skb_push(skb, hh_len), 0, hh_len); 149 } 150 |
140 size = skb->len; 141 /* bpf program can never convert linear skb to non-linear */ 142 if (WARN_ON_ONCE(skb_is_nonlinear(skb))) 143 size = skb_headlen(skb); 144 ret = bpf_test_finish(kattr, uattr, skb->data, size, retval, duration); 145 kfree_skb(skb); 146 return ret; 147} --- 32 unchanged lines hidden --- | 151 size = skb->len; 152 /* bpf program can never convert linear skb to non-linear */ 153 if (WARN_ON_ONCE(skb_is_nonlinear(skb))) 154 size = skb_headlen(skb); 155 ret = bpf_test_finish(kattr, uattr, skb->data, size, retval, duration); 156 kfree_skb(skb); 157 return ret; 158} --- 32 unchanged lines hidden --- |