]>
Commit | Line | Data |
---|---|---|
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 | 12 | struct config; |
2d140452 MM |
13 | struct krt_config; |
14 | struct krt_proto; | |
7e5f5ffd MM |
15 | struct kif_config; |
16 | struct 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 | |
40 | extern struct protocol proto_unix_kernel; | |
41 | ||
10d807d0 MM |
42 | struct 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 |
52 | struct 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 | 70 | extern 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 | 79 | struct proto_config * kif_init_config(int class); |
09686693 | 80 | void kif_request_scan(void); |
2d140452 | 81 | void krt_got_route(struct krt_proto *p, struct rte *e); |
e16155ae MM |
82 | void 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 |
91 | extern struct protocol proto_unix_iface; |
92 | ||
6f68f066 OZ |
93 | struct kif_primary_item { |
94 | node n; | |
95 | byte *pattern; | |
96 | ip_addr prefix; | |
97 | int pxlen; | |
98 | }; | |
99 | ||
7e5f5ffd MM |
100 | struct 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 | ||
107 | struct 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 |
114 | struct proto_config * krt_init_config(int class); |
115 | ||
7e7790c6 | 116 | |
f1aceff5 | 117 | /* krt sysdep */ |
2d140452 | 118 | |
396dfa90 | 119 | void krt_sys_init(struct krt_proto *); |
c6964c30 OZ |
120 | void krt_sys_start(struct krt_proto *); |
121 | void krt_sys_shutdown(struct krt_proto *); | |
396dfa90 | 122 | int krt_sys_reconfigure(struct krt_proto *p UNUSED, struct krt_config *n, struct krt_config *o); |
7e7790c6 | 123 | |
396dfa90 OZ |
124 | void krt_sys_preconfig(struct config *); |
125 | void krt_sys_postconfig(struct krt_config *); | |
126 | void krt_sys_init_config(struct krt_config *); | |
127 | void krt_sys_copy_config(struct krt_config *, struct krt_config *); | |
7e7790c6 | 128 | |
396dfa90 OZ |
129 | int krt_capable(rte *e); |
130 | void krt_do_scan(struct krt_proto *); | |
7a2c48da | 131 | void krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old, struct ea_list *eattrs); |
9fdf9d29 | 132 | int krt_sys_get_attr(eattr *a, byte *buf, int buflen); |
7e7790c6 | 133 | |
025d14cd | 134 | |
f1aceff5 | 135 | /* kif sysdep */ |
025d14cd | 136 | |
396dfa90 OZ |
137 | void kif_sys_init(struct kif_proto *); |
138 | void kif_sys_start(struct kif_proto *); | |
139 | void kif_sys_shutdown(struct kif_proto *); | |
140 | int kif_sys_reconfigure(struct kif_proto *, struct kif_config *, struct kif_config *); | |
141 | ||
142 | void kif_sys_init_config(struct kif_config *); | |
143 | void kif_sys_copy_config(struct kif_config *, struct kif_config *); | |
144 | ||
145 | void kif_do_scan(struct kif_proto *); | |
8e66a0eb | 146 | |
e237b28a | 147 | struct ifa *kif_get_primary_ip(struct iface *i); |
2d140452 | 148 | |
7e7790c6 | 149 | #endif |