2 * BIRD -- UNIX Kernel Route Syncer
4 * (c) 1998--2000 Martin Mares <mj@ucw.cz>
6 * Can be freely distributed and used under the terms of the GNU GPL.
18 #include "nest/iface.h"
19 #include "sysdep/config.h"
20 #include CONFIG_INCLUDE_KRTSYS_H
22 /* Flags stored in net->n.flags, rest are in nest/route.h */
24 #define KRF_VERDICT_MASK 0x0f
25 #define KRF_CREATE 0 /* Not seen in kernel table */
26 #define KRF_SEEN 1 /* Seen in kernel table during last scan */
27 #define KRF_UPDATE 2 /* Need to update this entry */
28 #define KRF_DELETE 3 /* Should be deleted */
29 #define KRF_IGNORE 4 /* To be ignored */
31 #define KRT_DEFAULT_ECMP_LIMIT 16
33 #define EA_KRT_SOURCE EA_CODE(EAP_KRT, 0)
34 #define EA_KRT_METRIC EA_CODE(EAP_KRT, 1)
36 /* Whenever we recognize our own routes, we allow learing of foreign routes */
38 #ifdef CONFIG_SELF_CONSCIOUS
39 #define KRT_ALLOW_LEARN
44 extern struct protocol proto_unix_kernel
;
47 struct proto_config c
;
48 struct krt_params sys
; /* Sysdep params */
49 btime scan_time
; /* How often we re-scan routes */
50 int persist
; /* Keep routes when we exit */
51 int learn
; /* Learn routes from other sources */
52 int graceful_restart
; /* Regard graceful restart recovery */
53 int merge_paths
; /* Exported routes are merged for ECMP */
58 struct krt_state sys
; /* Sysdep state */
60 #ifdef KRT_ALLOW_LEARN
61 struct rtable krt_table
; /* Internal table of inherited routes */
64 #ifndef CONFIG_ALL_TABLES_AT_ONCE
68 node krt_node
; /* Node in krt_proto_list */
69 byte af
; /* Kernel address family (AF_*) */
70 byte ready
; /* Initial feed has been finished */
71 byte initialized
; /* First scan has been finished */
72 byte reload
; /* Next scan is doing reload */
75 extern pool
*krt_pool
;
77 #define KRT_CF ((struct krt_config *)p->p.cf)
79 #define KRT_TRACE(pr, fl, msg, args...) do { \
80 DBG("KRT: " msg "\n" , ## args); \
81 if (pr->p.debug & fl) \
82 { log(L_TRACE "%s: " msg, pr->p.name , ## args); } } while(0)
84 struct proto_config
* kif_init_config(int class);
85 void kif_request_scan(void);
86 void krt_got_route(struct krt_proto
*p
, struct rte
*e
);
87 void krt_got_route_async(struct krt_proto
*p
, struct rte
*e
, int new);
89 /* Values for rte->u.krt_sync.src */
90 #define KRT_SRC_UNKNOWN -1 /* Nobody knows */
91 #define KRT_SRC_BIRD 0 /* Our route (not passed in async mode) */
92 #define KRT_SRC_REDIRECT 1 /* Redirect route, delete it */
93 #define KRT_SRC_ALIEN 2 /* Route installed by someone else */
94 #define KRT_SRC_KERNEL 3 /* Kernel routes, are ignored by krt syncer */
96 extern struct protocol proto_unix_iface
;
99 struct proto_config c
;
100 struct kif_params sys
; /* Sysdep params */
102 list iface_list
; /* List of iface configs (struct kif_iface_config) */
103 btime scan_time
; /* How often we re-scan interfaces */
106 struct kif_iface_config
{
116 struct kif_state sys
; /* Sysdep state */
119 extern struct kif_proto
*kif_proto
;
121 #define KIF_CF ((struct kif_config *)p->p.cf)
123 struct kif_iface_config
* kif_get_iface_config(struct iface
*iface
);
124 struct proto_config
* krt_init_config(int class);
129 void krt_sys_io_init(void);
130 void krt_sys_init(struct krt_proto
*);
131 int krt_sys_start(struct krt_proto
*);
132 void krt_sys_shutdown(struct krt_proto
*);
133 int krt_sys_reconfigure(struct krt_proto
*p UNUSED
, struct krt_config
*n
, struct krt_config
*o
);
135 void krt_sys_preconfig(struct config
*);
136 void krt_sys_postconfig(struct krt_config
*);
137 void krt_sys_init_config(struct krt_config
*);
138 void krt_sys_copy_config(struct krt_config
*, struct krt_config
*);
140 int krt_capable(rte
*e
);
141 void krt_do_scan(struct krt_proto
*);
142 void krt_replace_rte(struct krt_proto
*p
, net
*n
, rte
*new, rte
*old
, struct ea_list
*eattrs
);
143 int krt_sys_get_attr(eattr
*a
, byte
*buf
, int buflen
);
148 void kif_sys_init(struct kif_proto
*);
149 void kif_sys_start(struct kif_proto
*);
150 void kif_sys_shutdown(struct kif_proto
*);
151 int kif_sys_reconfigure(struct kif_proto
*, struct kif_config
*, struct kif_config
*);
153 void kif_sys_init_config(struct kif_config
*);
154 void kif_sys_copy_config(struct kif_config
*, struct kif_config
*);
156 void kif_do_scan(struct kif_proto
*);
158 int kif_update_sysdep_addr(struct iface
*i
);