summaryrefslogtreecommitdiff
path: root/nest/limit.h
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2021-11-06 20:34:16 +0100
committerMaria Matejka <mq@ucw.cz>2021-11-09 19:20:41 +0100
commit3a8197a9dce6fc5d38b089a291ac79d8d394fea1 (patch)
treea23af287f4c31c1a22897de6fc5f34e08113d1bd /nest/limit.h
parent46739f007a8a21c7887a29a465db0c2520fb4a13 (diff)
Limit containment
Diffstat (limited to 'nest/limit.h')
-rw-r--r--nest/limit.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/nest/limit.h b/nest/limit.h
new file mode 100644
index 00000000..5838ad3b
--- /dev/null
+++ b/nest/limit.h
@@ -0,0 +1,49 @@
+/*
+ * BIRD Internet Routing Daemon -- Limits
+ *
+ * (c) 1998--2000 Martin Mares <mj@ucw.cz>
+ * (c) 2021 Maria Matejka <mq@jmq.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_LIMIT_H_
+#define _BIRD_LIMIT_H_
+
+struct limit {
+ u32 max;
+ u32 count;
+ int (*action)(struct limit *, void *data);
+};
+
+static inline int limit_do_action(struct limit *l, void *data)
+{
+ return l->action ? l->action(l, data) : 1;
+}
+
+static inline int limit_push(struct limit *l, void *data)
+{
+ if ((l->count >= l->max) && limit_do_action(l, data))
+ return 1;
+
+ l->count++;
+ return 0;
+}
+
+static inline void limit_pop(struct limit *l)
+{
+ --l->count;
+}
+
+static inline void limit_reset(struct limit *l)
+{
+ l->count = 0;
+}
+
+static inline void limit_update(struct limit *l, void *data, u32 max)
+{
+ if (l->count > (l->max = max))
+ limit_do_action(l, data);
+}
+
+#endif