#define FILTER_REJECT ((struct filter *) 1)
#define FILTER_UNDEF ((struct filter *) 2) /* Used in BGP */
+#define TRIVIAL_FILTER(f) (((f) == FILTER_REJECT) || ((f) == FILTER_ACCEPT))
+
#define FF_SILENT 2 /* Silent filter execution */
/* Custom route attributes */
CF_KEYWORDS(INTERFACE, PREFERRED)
%type <i> kern_mp_limit
+%type <cc> kern_channel_start kern_proto_channel
CF_GRAMMAR
| LIMIT expr { $$ = $2; if (($2 <= 0) || ($2 > 255)) cf_error("Merge paths limit must be in range 1-255"); }
;
+kern_channel_start: net_type
+{
+ $$ = this_channel = channel_config_get(&channel_krt, net_label[$1], $1, this_proto);
+ this_proto->net_type = $1;
+};
+
+kern_proto_channel: kern_channel_start channel_opt_list channel_end;
+
kern_item:
proto_item
- | proto_channel { this_proto->net_type = $1->net_type; }
+ | kern_proto_channel
| PERSIST bool { THIS_KRT->persist = $2; }
| SCAN TIME expr {
/* Scan time of 0 means scan on startup only */
default: log(L_ERR "KRT: Tried to start with strange net type: %d", p->p.net_type); return PS_START; break;
}
+ /* If it is needed, setup out table automagically */
+ if (!TRIVIAL_FILTER(p->p.main_channel->out_filter))
+ channel_setup_out_table(p->p.main_channel);
+
+
bmap_init(&p->sync_map, p->p.pool, 1024);
bmap_init(&p->seen_map, p->p.pool, 1024);
add_tail(&krt_proto_list, &p->krt_node);
return PS_DOWN;
}
+static int
+krt_channel_reconfigure(struct channel *C, struct channel_config *CC, int *import_changed UNUSED, int *export_changed)
+{
+ if (!*export_changed)
+ return 1;
+
+ return (TRIVIAL_FILTER(C->out_filter) == TRIVIAL_FILTER(CC->out_filter));
+}
+
static int
krt_reconfigure(struct proto *p, struct proto_config *CF)
{
#define MAYBE_MPLS 0
#endif
+struct channel_class channel_krt = {
+ .channel_size = sizeof(struct channel),
+ .config_size = sizeof(struct channel_config),
+ .reconfigure = krt_channel_reconfigure,
+};
+
struct protocol proto_unix_kernel = {
.name = "Kernel",
.template = "kernel%d",