On 7 December 2016 at 22:06, Mauricio Vasquez via iovisor-dev
<[email protected]> wrote:
> BPF_TABLE("array", u32, struct rt_entry, routing_table, ROUTING_TABLE_DIM);
>
> static int handle_rx(void *skb, struct metadata *md) {
> u8 *cursor = 0;
> struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));
>
> int i = 0;
> struct rt_entry *rt_entry_p = 0;
> u32 ip_dst_masked = 0;
>
> //#pragma unroll
> #pragma clang loop unroll(full)
> for (i = 0; i < ROUTING_TABLE_DIM; i++) {
> rt_entry_p = routing_table.lookup(&i);
Might be because you pass a pointer here?
> if (rt_entry_p) {
> ip_dst_masked = ip->dst & rt_entry_p->netmask;
> if (ip_dst_masked == rt_entry_p->network) {
> goto FORWARD;
> }
> }
> }
>
> DROP:
> return RX_DROP;
>
> FORWARD:
> pkt_redirect(skb,md, rt_entry_p->port);
> return RX_REDIRECT;
> }
>
> Do you have any idea why clang is not unrolling that loop?
It is working fine for us here and we're just using the standard unroll pragma:
https://github.com/cilium/cilium/blob/master/bpf/lib/l3.h#L131
_______________________________________________
iovisor-dev mailing list
[email protected]
https://lists.iovisor.org/mailman/listinfo/iovisor-dev