0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-09-19 11:55:21 +00:00
bird/proto/aggregator/aggregator.h
2024-07-10 15:12:49 +02:00

121 lines
2.5 KiB
C

/*
* BIRD -- Aggregator Pseudoprotocol
*
* (c) 2023--2024 Igor Putovny <igor.putovny@nic.cz>
* (c) 2023--2024 Maria Matejka <mq@ucw.cz>
* (c) 2024 CZ.NIC z.s.p.o.
*
* Can be freely distributed and used under the terms of the GNU GPL.
*
* This file contains the data structures used by Babel.
*/
#ifndef _BIRD_AGGREGATOR_H_
#define _BIRD_AGGREGATOR_H_
#include "nest/bird.h"
#include "nest/protocol.h"
#include "lib/hash.h"
#include "lib/settle.h"
#define MAX_POTENTIAL_BUCKETS_COUNT 16
enum aggregation_mode {
NET_AGGR, PREFIX_AGGR,
};
struct aggregator_config {
struct proto_config c;
struct channel_config *src, *dst;
enum aggregation_mode aggr_mode;
uint aggr_on_count;
uint aggr_on_da_count;
struct aggr_item *aggr_on;
const struct f_line *merge_by;
struct settle_config notify_settle_cf;
int logging;
};
struct aggregator_route {
struct aggregator_route *next_hash;
struct aggregator_bucket *bucket;
struct rte rte;
};
struct aggregator_bucket {
struct aggregator_bucket *next_hash;
struct rte *rte; /* Pointer to struct aggregator_route.rte */
struct rte_src *last_src; /* Which src we announced the bucket last with */
u32 count;
u32 hash;
u32 id;
struct f_val aggr_data[0];
};
struct aggregator_proto {
struct proto p;
struct channel *src, *dst;
enum aggregation_mode aggr_mode;
/* Buckets by aggregator rule */
HASH(struct aggregator_bucket) buckets;
linpool *bucket_pool;
/* Routes by net and src */
HASH(struct aggregator_route) routes;
linpool *route_pool;
/* Aggregator rule */
uint aggr_on_count;
uint aggr_on_da_count;
struct aggr_item *aggr_on;
/* Merge filter */
const struct f_line *merge_by;
event reload_buckets;
/* Aggregation trie */
int first_run;
uint addr_type;
linpool *trie_pool;
struct trie_node *root;
struct settle_config notify_settle_cf;
struct settle notify_settle;
int before_count;
int after_count;
int internal_nodes;
int leaves;
int logging;
};
enum aggr_item_type {
AGGR_ITEM_TERM,
AGGR_ITEM_STATIC_ATTR,
AGGR_ITEM_DYNAMIC_ATTR,
};
struct aggr_item {
enum aggr_item_type type;
union {
struct f_static_attr sa;
struct f_dynamic_attr da;
const struct f_line *line;
};
};
struct aggr_item_node {
const struct aggr_item_node *next;
struct aggr_item i;
};
struct trie_node {
struct trie_node *parent;
struct trie_node *child[2];
struct aggregator_bucket *bucket;
struct aggregator_bucket *potential_buckets[MAX_POTENTIAL_BUCKETS_COUNT];
int potential_buckets_count;
int depth;
};
#endif