diff options
author | David Miller <davem@davemloft.net> | 2017-05-02 11:36:45 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-05-02 11:46:28 -0400 |
commit | 586f8525979ad9574bf61637fd58c98d5077f29d (patch) | |
tree | 6f6d73b367e877b7c4cc14d991ea659df5959480 | |
parent | 78e5227237cae9172dd50c3ebb08d4fb31530676 (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.c | 10 |
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); |