Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / sysdep / unix / krt.h @ 6b3f1a54

History | View | Annotate | Download (4.39 KB)

1
/*
2
 *        BIRD -- UNIX Kernel Route Syncer
3
 *
4
 *        (c) 1998--2000 Martin Mares <mj@ucw.cz>
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

    
12
struct config;
13
struct krt_config;
14
struct krt_proto;
15
struct kif_config;
16
struct kif_proto;
17

    
18
#include "nest/iface.h"
19
#include "sysdep/config.h"
20
#include CONFIG_INCLUDE_KRTSYS_H
21

    
22
/* Flags stored in net->n.flags, rest are in nest/route.h */
23

    
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 */
30

    
31
#define KRT_DEFAULT_ECMP_LIMIT        16
32

    
33
#define EA_KRT_SOURCE        EA_CODE(EAP_KRT, 0)
34
#define EA_KRT_METRIC        EA_CODE(EAP_KRT, 1)
35

    
36
/* Whenever we recognize our own routes, we allow learing of foreign routes */
37

    
38
#ifdef CONFIG_SELF_CONSCIOUS
39
#define KRT_ALLOW_LEARN
40
#endif
41

    
42
/* krt.c */
43

    
44
extern struct protocol proto_unix_kernel;
45

    
46
struct krt_config {
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 devroutes;                /* XXX: remove */
53
  int graceful_restart;                /* Regard graceful restart recovery */
54
};
55

    
56
struct krt_proto {
57
  struct proto p;
58
  struct krt_state sys;                /* Sysdep state */
59

    
60
#ifdef KRT_ALLOW_LEARN
61
  struct rtable krt_table;        /* Internal table of inherited routes */
62
#endif
63

    
64
#ifndef CONFIG_ALL_TABLES_AT_ONCE
65
  timer *scan_timer;
66
#endif
67

    
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 */
73
};
74

    
75
extern pool *krt_pool;
76

    
77
#define KRT_CF ((struct krt_config *)p->p.cf)
78

    
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)
83

    
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);
88

    
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 */
95

    
96
extern struct protocol proto_unix_iface;
97

    
98
struct kif_config {
99
  struct proto_config c;
100
  struct kif_params sys;        /* Sysdep params */
101

    
102
  list iface_list;                /* List of iface configs (struct kif_iface_config) */
103
  btime scan_time;                /* How often we re-scan interfaces */
104
};
105

    
106
struct kif_iface_config {
107
  struct iface_patt i;
108

    
109
  ip_addr pref_v4;
110
  ip_addr pref_v6;
111
  ip_addr pref_ll;
112
};
113

    
114
struct kif_proto {
115
  struct proto p;
116
  struct kif_state sys;                /* Sysdep state */
117
};
118

    
119
extern struct kif_proto *kif_proto;
120

    
121
#define KIF_CF ((struct kif_config *)p->p.cf)
122

    
123
struct kif_iface_config * kif_get_iface_config(struct iface *iface);
124
struct proto_config * krt_init_config(int class);
125

    
126

    
127
/* krt sysdep */
128

    
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);
134

    
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 *);
139

    
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);
144

    
145

    
146
/* kif sysdep */
147

    
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 *);
152

    
153
void kif_sys_init_config(struct kif_config *);
154
void kif_sys_copy_config(struct kif_config *, struct kif_config *);
155

    
156
void kif_do_scan(struct kif_proto *);
157

    
158
int kif_update_sysdep_addr(struct iface *i);
159

    
160
#endif