1 /* Copyright (c) 2016 Thomas Graf <tgraf@tgraf.ch>
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.
7 * This program is distributed in the hope that it will be useful, but
8 * WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * General Public License for more details.
13 #include <uapi/linux/bpf.h>
14 #include <uapi/linux/if_ether.h>
15 #include <uapi/linux/ip.h>
16 #include <uapi/linux/in.h>
17 #include "bpf_helpers.h"
19 # define printk(fmt, ...) \
21 char ____fmt[] = fmt; \
22 bpf_trace_printk(____fmt, sizeof(____fmt), \
36 struct bpf_elf_map
SEC("maps") lwt_len_hist_map
= {
37 .type
= BPF_MAP_TYPE_PERCPU_HASH
,
38 .size_key
= sizeof(__u64
),
39 .size_value
= sizeof(__u64
),
44 static unsigned int log2(unsigned int v
)
49 r
= (v
> 0xFFFF) << 4; v
>>= r
;
50 shift
= (v
> 0xFF) << 3; v
>>= shift
; r
|= shift
;
51 shift
= (v
> 0xF) << 2; v
>>= shift
; r
|= shift
;
52 shift
= (v
> 0x3) << 1; v
>>= shift
; r
|= shift
;
57 static unsigned int log2l(unsigned long v
)
59 unsigned int hi
= v
>> 32;
67 int do_len_hist(struct __sk_buff
*skb
)
69 __u64
*value
, key
, init_val
= 1;
71 key
= log2l(skb
->len
);
73 value
= bpf_map_lookup_elem(&lwt_len_hist_map
, &key
);
75 __sync_fetch_and_add(value
, 1);
77 bpf_map_update_elem(&lwt_len_hist_map
, &key
, &init_val
, BPF_ANY
);
82 char _license
[] SEC("license") = "GPL";