aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Miller <davem@davemloft.net>2017-05-02 11:36:45 -0400
committerDavid S. Miller <davem@davemloft.net>2017-05-02 11:46:28 -0400
commit586f8525979ad9574bf61637fd58c98d5077f29d (patch)
tree6f6d73b367e877b7c4cc14d991ea659df5959480
parent78e5227237cae9172dd50c3ebb08d4fb31530676 (diff)
bpf: Align packet data properly in program testing framework.
Make sure we apply NET_IP_ALIGN when reserving headroom for SKB and XDP test runs, just like a real driver would. Signed-off-by: David S. Miller <davem@davemloft.net> Acked-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r--net/bpf/test_run.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index f946912c8a81..6be41a44d688 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -100,7 +100,7 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
100 void *data; 100 void *data;
101 int ret; 101 int ret;
102 102
103 data = bpf_test_init(kattr, size, NET_SKB_PAD, 103 data = bpf_test_init(kattr, size, NET_SKB_PAD + NET_IP_ALIGN,
104 SKB_DATA_ALIGN(sizeof(struct skb_shared_info))); 104 SKB_DATA_ALIGN(sizeof(struct skb_shared_info)));
105 if (IS_ERR(data)) 105 if (IS_ERR(data))
106 return PTR_ERR(data); 106 return PTR_ERR(data);
@@ -125,7 +125,7 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
125 return -ENOMEM; 125 return -ENOMEM;
126 } 126 }
127 127
128 skb_reserve(skb, NET_SKB_PAD); 128 skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
129 __skb_put(skb, size); 129 __skb_put(skb, size);
130 skb->protocol = eth_type_trans(skb, current->nsproxy->net_ns->loopback_dev); 130 skb->protocol = eth_type_trans(skb, current->nsproxy->net_ns->loopback_dev);
131 skb_reset_network_header(skb); 131 skb_reset_network_header(skb);
@@ -156,16 +156,16 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr,
156 void *data; 156 void *data;
157 int ret; 157 int ret;
158 158
159 data = bpf_test_init(kattr, size, XDP_PACKET_HEADROOM, 0); 159 data = bpf_test_init(kattr, size, XDP_PACKET_HEADROOM + NET_IP_ALIGN, 0);
160 if (IS_ERR(data)) 160 if (IS_ERR(data))
161 return PTR_ERR(data); 161 return PTR_ERR(data);
162 162
163 xdp.data_hard_start = data; 163 xdp.data_hard_start = data;
164 xdp.data = data + XDP_PACKET_HEADROOM; 164 xdp.data = data + XDP_PACKET_HEADROOM + NET_IP_ALIGN;
165 xdp.data_end = xdp.data + size; 165 xdp.data_end = xdp.data + size;
166 166
167 retval = bpf_test_run(prog, &xdp, repeat, &duration); 167 retval = bpf_test_run(prog, &xdp, repeat, &duration);
168 if (xdp.data != data + XDP_PACKET_HEADROOM) 168 if (xdp.data != data + XDP_PACKET_HEADROOM + NET_IP_ALIGN)
169 size = xdp.data_end - xdp.data; 169 size = xdp.data_end - xdp.data;
170 ret = bpf_test_finish(kattr, uattr, xdp.data, size, retval, duration); 170 ret = bpf_test_finish(kattr, uattr, xdp.data, size, retval, duration);
171 kfree(data); 171 kfree(data);