| 1 |
|
| 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/skbuff.h>
|
| 15 | #include <linux/bits.h>
|
| 16 |
|
| 17 | #include "flow.h"
|
| 18 | struct datapath;
|
| 19 |
|
| 20 | #define DP_MAX_BANDS 1
|
| 21 | #define DP_METER_ARRAY_SIZE_MIN BIT_ULL(10)
|
| 22 | #define DP_METER_NUM_MAX (200000UL)
|
| 23 |
|
| 24 | struct dp_meter_band {
|
| 25 | u32 type;
|
| 26 | u32 rate;
|
| 27 | u32 burst_size;
|
| 28 | u64 bucket;
|
| 29 | struct ovs_flow_stats stats;
|
| 30 | };
|
| 31 |
|
| 32 | struct dp_meter {
|
| 33 | spinlock_t lock;
|
| 34 | struct rcu_head rcu;
|
| 35 | u32 id;
|
| 36 | u16 kbps:1, keep_stats:1;
|
| 37 | u16 n_bands;
|
| 38 | u32 max_delta_t;
|
| 39 | u64 used;
|
| 40 | struct ovs_flow_stats stats;
|
| 41 | struct dp_meter_band bands[] __counted_by(n_bands);
|
| 42 | };
|
| 43 |
|
| 44 | struct dp_meter_instance {
|
| 45 | struct rcu_head rcu;
|
| 46 | u32 n_meters;
|
| 47 | struct dp_meter __rcu *dp_meters[] __counted_by(n_meters);
|
| 48 | };
|
| 49 |
|
| 50 | struct dp_meter_table {
|
| 51 | struct dp_meter_instance __rcu *ti;
|
| 52 | u32 count;
|
| 53 | u32 max_meters_allowed;
|
| 54 | };
|
| 55 |
|
| 56 | extern struct genl_family dp_meter_genl_family;
|
| 57 | int ovs_meters_init(struct datapath *dp);
|
| 58 | void ovs_meters_exit(struct datapath *dp);
|
| 59 | bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb,
|
| 60 | struct sw_flow_key *key, u32 meter_id);
|
| 61 |
|
| 62 | #endif
|