]> git.ipfire.org Git - thirdparty/bird.git/blame - sysdep/unix/krt.h
KRT: Add support for plenty of kernel route metrics
[thirdparty/bird.git] / sysdep / unix / krt.h
CommitLineData
7e7790c6 1/*
2d140452 2 * BIRD -- UNIX Kernel Route Syncer
7e7790c6 3 *
832fa033 4 * (c) 1998--2000 Martin Mares <mj@ucw.cz>
7e7790c6
MM
5 *
6 * Can be freely distributed and used under the terms of the GNU GPL.
7 */
8
9#ifndef _BIRD_KRT_H_
10#define _BIRD_KRT_H_
11
7de45ba4 12struct config;
2d140452
MM
13struct krt_config;
14struct krt_proto;
7e5f5ffd
MM
15struct kif_config;
16struct kif_proto;
2d140452 17
f1aceff5 18#include "lib/krt-sys.h"
7e7790c6 19
32f95476 20/* Flags stored in net->n.flags, rest are in nest/route.h */
12df4d90 21
c10421d3 22#define KRF_VERDICT_MASK 0x0f
f39e4713 23#define KRF_CREATE 0 /* Not seen in kernel table */
12df4d90
MM
24#define KRF_SEEN 1 /* Seen in kernel table during last scan */
25#define KRF_UPDATE 2 /* Need to update this entry */
f39e4713 26#define KRF_DELETE 3 /* Should be deleted */
c10421d3
MM
27#define KRF_IGNORE 4 /* To be ignored */
28
72aed1a0 29#define EA_KRT_SOURCE EA_CODE(EAP_KRT, 0)
9ba2798c 30#define EA_KRT_METRIC EA_CODE(EAP_KRT, 1)
71ca7716 31
c10421d3
MM
32/* Whenever we recognize our own routes, we allow learing of foreign routes */
33
34#ifdef CONFIG_SELF_CONSCIOUS
35#define KRT_ALLOW_LEARN
36#endif
12df4d90 37
2d140452 38/* krt.c */
7e7790c6
MM
39
40extern struct protocol proto_unix_kernel;
41
10d807d0
MM
42struct krt_config {
43 struct proto_config c;
396dfa90 44 struct krt_params sys; /* Sysdep params */
2d140452 45 int persist; /* Keep routes when we exit */
7e5f5ffd 46 int scan_time; /* How often we re-scan routes */
2d140452 47 int learn; /* Learn routes from other sources */
c429d4a4 48 int devroutes; /* Allow export of device routes */
0c791f87 49 int graceful_restart; /* Regard graceful restart recovery */
7e7790c6
MM
50};
51
10d807d0
MM
52struct krt_proto {
53 struct proto p;
c6964c30
OZ
54 struct krt_state sys; /* Sysdep state */
55
c10421d3
MM
56#ifdef KRT_ALLOW_LEARN
57 struct rtable krt_table; /* Internal table of inherited routes */
7de45ba4 58#endif
c6964c30
OZ
59
60#ifndef CONFIG_ALL_TABLES_AT_ONCE
7de45ba4 61 timer *scan_timer;
c10421d3 62#endif
c6964c30
OZ
63
64 node krt_node; /* Node in krt_proto_list */
0c791f87
OZ
65 byte ready; /* Initial feed has been finished */
66 byte initialized; /* First scan has been finished */
7069fc9e 67 byte reload; /* Next scan is doing reload */
10d807d0
MM
68};
69
7de45ba4 70extern pool *krt_pool;
980ffedb 71
2d140452
MM
72#define KRT_CF ((struct krt_config *)p->p.cf)
73
832fa033
MM
74#define KRT_TRACE(pr, fl, msg, args...) do { \
75 DBG("KRT: " msg "\n" , ## args); \
76 if (pr->p.debug & fl) \
77 { log(L_TRACE "%s: " msg, pr->p.name , ## args); } } while(0)
78
396dfa90 79struct proto_config * kif_init_config(int class);
09686693 80void kif_request_scan(void);
2d140452 81void krt_got_route(struct krt_proto *p, struct rte *e);
e16155ae
MM
82void krt_got_route_async(struct krt_proto *p, struct rte *e, int new);
83
84/* Values for rte->u.krt_sync.src */
85#define KRT_SRC_UNKNOWN -1 /* Nobody knows */
86#define KRT_SRC_BIRD 0 /* Our route (not passed in async mode) */
87#define KRT_SRC_REDIRECT 1 /* Redirect route, delete it */
88#define KRT_SRC_ALIEN 2 /* Route installed by someone else */
ff2857b0 89#define KRT_SRC_KERNEL 3 /* Kernel routes, are ignored by krt syncer */
2d140452 90
7e5f5ffd
MM
91extern struct protocol proto_unix_iface;
92
6f68f066
OZ
93struct kif_primary_item {
94 node n;
95 byte *pattern;
96 ip_addr prefix;
97 int pxlen;
98};
99
7e5f5ffd
MM
100struct kif_config {
101 struct proto_config c;
396dfa90 102 struct kif_params sys; /* Sysdep params */
7e5f5ffd 103 int scan_time; /* How often we re-scan interfaces */
a7f23f58 104 list primary; /* Preferences for primary addresses (struct kif_primary_item) */
7e5f5ffd
MM
105};
106
107struct kif_proto {
108 struct proto p;
c6964c30 109 struct kif_state sys; /* Sysdep state */
7e5f5ffd
MM
110};
111
7e5f5ffd
MM
112#define KIF_CF ((struct kif_config *)p->p.cf)
113
396dfa90
OZ
114struct proto_config * krt_init_config(int class);
115
7e7790c6 116
f1aceff5 117/* krt sysdep */
2d140452 118
396dfa90 119void krt_sys_init(struct krt_proto *);
c6964c30
OZ
120void krt_sys_start(struct krt_proto *);
121void krt_sys_shutdown(struct krt_proto *);
396dfa90 122int krt_sys_reconfigure(struct krt_proto *p UNUSED, struct krt_config *n, struct krt_config *o);
7e7790c6 123
396dfa90
OZ
124void krt_sys_preconfig(struct config *);
125void krt_sys_postconfig(struct krt_config *);
126void krt_sys_init_config(struct krt_config *);
127void krt_sys_copy_config(struct krt_config *, struct krt_config *);
7e7790c6 128
396dfa90
OZ
129int krt_capable(rte *e);
130void krt_do_scan(struct krt_proto *);
7a2c48da 131void krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old, struct ea_list *eattrs);
9fdf9d29 132int krt_sys_get_attr(eattr *a, byte *buf, int buflen);
7e7790c6 133
025d14cd 134
f1aceff5 135/* kif sysdep */
025d14cd 136
396dfa90
OZ
137void kif_sys_init(struct kif_proto *);
138void kif_sys_start(struct kif_proto *);
139void kif_sys_shutdown(struct kif_proto *);
140int kif_sys_reconfigure(struct kif_proto *, struct kif_config *, struct kif_config *);
141
142void kif_sys_init_config(struct kif_config *);
143void kif_sys_copy_config(struct kif_config *, struct kif_config *);
144
145void kif_do_scan(struct kif_proto *);
8e66a0eb 146
e237b28a 147struct ifa *kif_get_primary_ip(struct iface *i);
2d140452 148
7e7790c6 149#endif