1e5e7a8f2SAlexei Starovoitov // SPDX-License-Identifier: GPL-2.0
2e5e7a8f2SAlexei Starovoitov // Copyright (c) 2019 Facebook
3e5e7a8f2SAlexei Starovoitov #include <linux/bpf.h>
43e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
5e5e7a8f2SAlexei Starovoitov #define ATTR __attribute__((noinline))
6e5e7a8f2SAlexei Starovoitov #include "test_jhash.h"
7e5e7a8f2SAlexei Starovoitov 
8cf060c2cSAndrii Nakryiko SEC("tc")
balancer_ingress(struct __sk_buff * ctx)9e5e7a8f2SAlexei Starovoitov int balancer_ingress(struct __sk_buff *ctx)
10e5e7a8f2SAlexei Starovoitov {
11e5e7a8f2SAlexei Starovoitov 	void *data_end = (void *)(long)ctx->data_end;
12e5e7a8f2SAlexei Starovoitov 	void *data = (void *)(long)ctx->data;
13e5e7a8f2SAlexei Starovoitov 	void *ptr;
14*c8ed6685SAndrii Nakryiko 	int nh_off, i = 0;
15e5e7a8f2SAlexei Starovoitov 
16e5e7a8f2SAlexei Starovoitov 	nh_off = 14;
17e5e7a8f2SAlexei Starovoitov 
18e5e7a8f2SAlexei Starovoitov 	/* pragma unroll doesn't work on large loops */
19e5e7a8f2SAlexei Starovoitov 
20e5e7a8f2SAlexei Starovoitov #define C do { \
21e5e7a8f2SAlexei Starovoitov 	ptr = data + i; \
22e5e7a8f2SAlexei Starovoitov 	if (ptr + nh_off > data_end) \
23e5e7a8f2SAlexei Starovoitov 		break; \
24e5e7a8f2SAlexei Starovoitov 	ctx->tc_index = jhash(ptr, nh_off, ctx->cb[0] + i++); \
25e5e7a8f2SAlexei Starovoitov 	} while (0);
26e5e7a8f2SAlexei Starovoitov #define C30 C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;
27e5e7a8f2SAlexei Starovoitov 	C30;C30;C30; /* 90 calls */
28e5e7a8f2SAlexei Starovoitov 	return 0;
29e5e7a8f2SAlexei Starovoitov }
30e5e7a8f2SAlexei Starovoitov char _license[] SEC("license") = "GPL";
31