mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-18 00:58:42 +00:00
977b82fba4
Add a new protocol offering route aggregation. User can specify list of route attributes in the configuration file and run route aggregation on the export side of the pipe protocol. Routes are sorted and for every group of equivalent routes new route is created and exported to the routing table. It is also possible to specify filter which will run for every route before aggregation. Furthermore, it will be possible to set attributes of new routes according to attributes of the aggregated routes. This is a work in progress. Original work by Igor Putovny, subsequent cleanups and finalization by Maria Matejka.
87 lines
1.8 KiB
C
87 lines
1.8 KiB
C
/*
|
|
* BIRD -- Aggregator Pseudoprotocol
|
|
*
|
|
* (c) 2023 Igor Putovny <igor.putovny@nic.cz>
|
|
* (c) 2023 Maria Matejka <mq@ucw.cz>
|
|
* (c) 2023 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"
|
|
|
|
struct aggregator_config {
|
|
struct proto_config c;
|
|
struct channel_config *src, *dst;
|
|
uint aggr_on_count;
|
|
uint aggr_on_da_count;
|
|
struct aggr_item *aggr_on;
|
|
const struct f_line *merge_by;
|
|
};
|
|
|
|
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;
|
|
struct f_val aggr_data[0];
|
|
};
|
|
|
|
struct aggregator_proto {
|
|
struct proto p;
|
|
struct channel *src, *dst;
|
|
|
|
/* Buckets by aggregator rule */
|
|
HASH(struct aggregator_bucket) buckets;
|
|
slab *bucket_slab;
|
|
|
|
/* Routes by net and src */
|
|
HASH(struct aggregator_route) routes;
|
|
slab *route_slab;
|
|
|
|
/* 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;
|
|
};
|
|
|
|
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;
|
|
};
|
|
|
|
#endif
|