blob: 24577fdfca13b0525f2ab62336ecfd7017c047ae [file] [log] [blame]
Harald Welte7b45d602010-05-13 11:35:30 +02001#ifndef _RATE_CTR_H
2#define _RATE_CTR_H
3
Harald Welte9327c6d2011-08-17 16:06:06 +02004/*! \defgroup rate_ctr Rate counters
5 * @{
6 */
7
8/*! \file rate_ctr.h */
9
Harald Welte7b45d602010-05-13 11:35:30 +020010#include <stdint.h>
11
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010012#include <osmocom/core/linuxlist.h>
Harald Welte7b45d602010-05-13 11:35:30 +020013
Harald Welte9327c6d2011-08-17 16:06:06 +020014/*! \brief Number of rate counter intervals */
Harald Welte7b45d602010-05-13 11:35:30 +020015#define RATE_CTR_INTV_NUM 4
16
Harald Welte9327c6d2011-08-17 16:06:06 +020017/*! \brief Rate counter interval */
Harald Welte7b45d602010-05-13 11:35:30 +020018enum rate_ctr_intv {
Harald Welte9327c6d2011-08-17 16:06:06 +020019 RATE_CTR_INTV_SEC, /*!< \brief last second */
20 RATE_CTR_INTV_MIN, /*!< \brief last minute */
21 RATE_CTR_INTV_HOUR, /*!< \brief last hour */
22 RATE_CTR_INTV_DAY, /*!< \brief last day */
Harald Welte7b45d602010-05-13 11:35:30 +020023};
24
Harald Welte9327c6d2011-08-17 16:06:06 +020025/*! \brief data we keep for each of the intervals */
Harald Welte7b45d602010-05-13 11:35:30 +020026struct rate_ctr_per_intv {
Harald Welte9327c6d2011-08-17 16:06:06 +020027 uint64_t last; /*!< \brief counter value in last interval */
28 uint64_t rate; /*!< \brief counter rate */
Harald Welte7b45d602010-05-13 11:35:30 +020029};
30
Harald Welte9327c6d2011-08-17 16:06:06 +020031/*! \brief data we keep for each actual value */
Harald Welte7b45d602010-05-13 11:35:30 +020032struct rate_ctr {
Harald Welte9327c6d2011-08-17 16:06:06 +020033 uint64_t current; /*!< \brief current value */
34 /*! \brief per-interval data */
Harald Welte7b45d602010-05-13 11:35:30 +020035 struct rate_ctr_per_intv intv[RATE_CTR_INTV_NUM];
36};
37
Harald Welte9327c6d2011-08-17 16:06:06 +020038/*! \brief rate counter description */
Harald Welte7b45d602010-05-13 11:35:30 +020039struct rate_ctr_desc {
Harald Welte9327c6d2011-08-17 16:06:06 +020040 const char *name; /*!< \brief name of the counter */
41 const char *description;/*!< \brief description of the counter */
Harald Welte7b45d602010-05-13 11:35:30 +020042};
43
Harald Welte9327c6d2011-08-17 16:06:06 +020044/*! \brief description of a rate counter group */
Harald Welte7b45d602010-05-13 11:35:30 +020045struct rate_ctr_group_desc {
Harald Welte9327c6d2011-08-17 16:06:06 +020046 /*! \brief The prefix to the name of all counters in this group */
Holger Hans Peter Freyther75bd69b2010-05-23 21:14:32 +080047 const char *group_name_prefix;
Harald Welte9327c6d2011-08-17 16:06:06 +020048 /*! \brief The human-readable description of the group */
Holger Hans Peter Freyther75bd69b2010-05-23 21:14:32 +080049 const char *group_description;
Harald Welte9327c6d2011-08-17 16:06:06 +020050 /*! \brief The number of counters in this group */
Holger Hans Peter Freyther75bd69b2010-05-23 21:14:32 +080051 const unsigned int num_ctr;
Harald Welte9327c6d2011-08-17 16:06:06 +020052 /*! \brief Pointer to array of counter names */
Holger Hans Peter Freyther75bd69b2010-05-23 21:14:32 +080053 const struct rate_ctr_desc *ctr_desc;
Harald Welte7b45d602010-05-13 11:35:30 +020054};
55
Harald Welte9327c6d2011-08-17 16:06:06 +020056/*! \brief One instance of a counter group class */
Harald Welte7b45d602010-05-13 11:35:30 +020057struct rate_ctr_group {
Harald Welte9327c6d2011-08-17 16:06:06 +020058 /*! \brief Linked list of all counter groups in the system */
Harald Welte7b45d602010-05-13 11:35:30 +020059 struct llist_head list;
Harald Welte9327c6d2011-08-17 16:06:06 +020060 /*! \brief Pointer to the counter group class */
Harald Welte7b45d602010-05-13 11:35:30 +020061 const struct rate_ctr_group_desc *desc;
Harald Welte9327c6d2011-08-17 16:06:06 +020062 /*! \brief The index of this ctr_group within its class */
Harald Welte087fcff2010-05-13 12:16:17 +020063 unsigned int idx;
Harald Welte9327c6d2011-08-17 16:06:06 +020064 /*! \brief Actual counter structures below */
Harald Welte7b45d602010-05-13 11:35:30 +020065 struct rate_ctr ctr[0];
66};
67
Harald Welte7b45d602010-05-13 11:35:30 +020068struct rate_ctr_group *rate_ctr_group_alloc(void *ctx,
69 const struct rate_ctr_group_desc *desc,
70 unsigned int idx);
71
Harald Welte7b45d602010-05-13 11:35:30 +020072void rate_ctr_group_free(struct rate_ctr_group *grp);
73
Harald Welte7b45d602010-05-13 11:35:30 +020074void rate_ctr_add(struct rate_ctr *ctr, int inc);
75
Harald Welte9327c6d2011-08-17 16:06:06 +020076/*! \brief Increment the counter by 1 */
Harald Welte7b45d602010-05-13 11:35:30 +020077static inline void rate_ctr_inc(struct rate_ctr *ctr)
78{
79 rate_ctr_add(ctr, 1);
80}
81
Harald Welte7b45d602010-05-13 11:35:30 +020082int rate_ctr_init(void *tall_ctx);
83
Daniel Willmann2d42dde2011-04-08 10:46:18 +020084struct rate_ctr_group *rate_ctr_get_group_by_name_idx(const char *name, const unsigned int idx);
Holger Hans Peter Freythera9f526a2011-04-18 16:45:45 +020085const struct rate_ctr *rate_ctr_get_by_name(const struct rate_ctr_group *ctrg, const char *name);
Harald Welte9327c6d2011-08-17 16:06:06 +020086
Sylvain Munautdca7d2c2012-04-18 21:53:23 +020087/*! @} */
Harald Welte7b45d602010-05-13 11:35:30 +020088#endif /* RATE_CTR_H */