1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
---|---|
2 | /* |
3 | * Copyright (c) 2017 Nicira, Inc. |
4 | */ |
5 | |
6 | #ifndef METER_H |
7 | #define METER_H 1 |
8 | |
9 | #include <linux/init.h> |
10 | #include <linux/module.h> |
11 | #include <linux/kernel.h> |
12 | #include <linux/netlink.h> |
13 | #include <linux/openvswitch.h> |
14 | #include <linux/genetlink.h> |
15 | #include <linux/skbuff.h> |
16 | #include <linux/bits.h> |
17 | |
18 | #include "flow.h" |
19 | struct datapath; |
20 | |
21 | #define DP_MAX_BANDS 1 |
22 | #define DP_METER_ARRAY_SIZE_MIN BIT_ULL(10) |
23 | #define DP_METER_NUM_MAX (200000UL) |
24 | |
25 | struct dp_meter_band { |
26 | u32 type; |
27 | u32 rate; |
28 | u32 burst_size; |
29 | u64 bucket; /* 1/1000 packets, or in bits */ |
30 | struct ovs_flow_stats stats; |
31 | }; |
32 | |
33 | struct dp_meter { |
34 | spinlock_t lock; /* Per meter lock */ |
35 | struct rcu_head rcu; |
36 | u32 id; |
37 | u16 kbps:1, keep_stats:1; |
38 | u16 n_bands; |
39 | u32 max_delta_t; |
40 | u64 used; |
41 | struct ovs_flow_stats stats; |
42 | struct dp_meter_band bands[] __counted_by(n_bands); |
43 | }; |
44 | |
45 | struct dp_meter_instance { |
46 | struct rcu_head rcu; |
47 | u32 n_meters; |
48 | struct dp_meter __rcu *dp_meters[] __counted_by(n_meters); |
49 | }; |
50 | |
51 | struct dp_meter_table { |
52 | struct dp_meter_instance __rcu *ti; |
53 | u32 count; |
54 | u32 max_meters_allowed; |
55 | }; |
56 | |
57 | extern struct genl_family dp_meter_genl_family; |
58 | int ovs_meters_init(struct datapath *dp); |
59 | void ovs_meters_exit(struct datapath *dp); |
60 | bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb, |
61 | struct sw_flow_key *key, u32 meter_id); |
62 | |
63 | #endif /* meter.h */ |
64 |