Lines 1-14
Link Here
|
1 |
diff -urN sysdep/bsd/Modules sysdep/bsd/Modules |
1 |
Index: sysdep/unix/krt.h |
2 |
--- sysdep/bsd/Modules 2011-03-31 12:29:42.000000000 +0400 |
2 |
=================================================================== |
3 |
+++ sysdep/bsd/Modules 2011-05-10 12:04:30.643950460 +0400 |
3 |
--- sysdep/unix/krt.h (revision 4869) |
4 |
@@ -4,3 +4,4 @@ |
4 |
+++ sysdep/unix/krt.h (working copy) |
5 |
krt-set.h |
5 |
@@ -67,6 +67,7 @@ |
6 |
krt-sock.c |
6 |
#ifdef CONFIG_ALL_TABLES_AT_ONCE |
7 |
krt-sock.h |
7 |
node instance_node; /* Node in krt instance list */ |
8 |
+fib.Y |
8 |
#endif |
9 |
diff -urN sysdep/bsd/fib.Y sysdep/bsd/fib.Y |
9 |
+ int rt_sock; /* Routing socket descriptor */ |
10 |
--- sysdep/bsd/fib.Y 1970-01-01 03:00:00.000000000 +0300 |
10 |
int initialized; /* First scan has already been finished */ |
11 |
+++ sysdep/bsd/fib.Y 2011-05-10 12:04:05.724272679 +0400 |
11 |
}; |
|
|
12 |
|
13 |
Index: sysdep/bsd/krt-sock.h |
14 |
=================================================================== |
15 |
--- sysdep/bsd/krt-sock.h (revision 4869) |
16 |
+++ sysdep/bsd/krt-sock.h (working copy) |
17 |
@@ -42,5 +42,8 @@ |
18 |
|
19 |
static inline int krt_set_params_same(struct krt_set_params *o UNUSED, struct krt_set_params *n UNUSED) { return 1; } |
20 |
void krt_read_msg(struct proto *p, struct ks_msg *msg, int scan); |
21 |
+int max_fib_num(void); |
22 |
+int my_fib_get(void); |
23 |
+int my_fib_set(int fib); |
24 |
|
25 |
#endif |
26 |
Index: sysdep/bsd/fib.Y |
27 |
=================================================================== |
28 |
--- sysdep/bsd/fib.Y (revision 0) |
29 |
+++ sysdep/bsd/fib.Y (revision 0) |
12 |
@@ -0,0 +1,29 @@ |
30 |
@@ -0,0 +1,29 @@ |
13 |
+/* |
31 |
+/* |
14 |
+ * BIRD -- FreeBSD rtsock configuration |
32 |
+ * BIRD -- FreeBSD rtsock configuration |
Lines 30-36
Link Here
|
30 |
+ |
48 |
+ |
31 |
+rtsock_item: |
49 |
+rtsock_item: |
32 |
+ KERNEL TABLE expr { |
50 |
+ KERNEL TABLE expr { |
33 |
+ if ($3 <= 0 || $3 >= max_fib_num()) |
51 |
+ if ($3 < 0 || $3 >= max_fib_num()) |
34 |
+ cf_error("Kernel routing table number out of range"); |
52 |
+ cf_error("Kernel routing table number out of range"); |
35 |
+ THIS_KRT->scan.table_id = $3; |
53 |
+ THIS_KRT->scan.table_id = $3; |
36 |
+ } |
54 |
+ } |
Lines 39-47
Link Here
|
39 |
+CF_CODE |
57 |
+CF_CODE |
40 |
+ |
58 |
+ |
41 |
+CF_END |
59 |
+CF_END |
42 |
diff -urN sysdep/bsd/krt-scan.h sysdep/bsd/krt-scan.h |
60 |
Index: sysdep/bsd/Modules |
43 |
--- sysdep/bsd/krt-scan.h 2011-03-31 12:29:42.000000000 +0400 |
61 |
=================================================================== |
44 |
+++ sysdep/bsd/krt-scan.h 2011-05-10 11:58:54.812942887 +0400 |
62 |
--- sysdep/bsd/Modules (revision 4869) |
|
|
63 |
+++ sysdep/bsd/Modules (working copy) |
64 |
@@ -4,3 +4,4 @@ |
65 |
krt-set.h |
66 |
krt-sock.c |
67 |
krt-sock.h |
68 |
+fib.Y |
69 |
Index: sysdep/bsd/krt-scan.h |
70 |
=================================================================== |
71 |
--- sysdep/bsd/krt-scan.h (revision 4869) |
72 |
+++ sysdep/bsd/krt-scan.h (working copy) |
45 |
@@ -10,6 +10,7 @@ |
73 |
@@ -10,6 +10,7 @@ |
46 |
#define _BIRD_KRT_SCAN_H_ |
74 |
#define _BIRD_KRT_SCAN_H_ |
47 |
|
75 |
|
Lines 50-59
Link Here
|
50 |
}; |
78 |
}; |
51 |
|
79 |
|
52 |
struct krt_scan_status { |
80 |
struct krt_scan_status { |
53 |
diff -urN sysdep/bsd/krt-sock.c sysdep/bsd/krt-sock.c |
81 |
Index: sysdep/bsd/krt-sock.c |
54 |
--- sysdep/bsd/krt-sock.c 2011-05-02 12:13:18.000000000 +0400 |
82 |
=================================================================== |
55 |
+++ sysdep/bsd/krt-sock.c 2011-05-10 12:25:22.075267568 +0400 |
83 |
--- sysdep/bsd/krt-sock.c (revision 4869) |
56 |
@@ -53,6 +53,21 @@ |
84 |
+++ sysdep/bsd/krt-sock.c (working copy) |
|
|
85 |
@@ -33,8 +33,6 @@ |
86 |
#include "lib/string.h" |
87 |
#include "lib/socket.h" |
88 |
|
89 |
-int rt_sock = 0; |
90 |
- |
91 |
int |
92 |
krt_capable(rte *e) |
93 |
{ |
94 |
@@ -53,6 +51,49 @@ |
57 |
); |
95 |
); |
58 |
} |
96 |
} |
59 |
|
97 |
|
Lines 68-108
Link Here
|
68 |
+ return 1; |
106 |
+ return 1; |
69 |
+ } |
107 |
+ } |
70 |
+ |
108 |
+ |
71 |
+ log(L_TRACE "Max fibs: %d\n", fibs); |
109 |
+ //log(L_TRACE "Max fibs: %d", fibs); |
72 |
+ return fibs; |
110 |
+ return fibs; |
73 |
+} |
111 |
+} |
74 |
+ |
112 |
+ |
|
|
113 |
+int |
114 |
+my_fib_get() |
115 |
+{ |
116 |
+ int fib = 0; |
117 |
+ size_t fib_len = sizeof(fib); |
118 |
+ if (sysctlbyname("net.my_fibnum", &fib, &fib_len, NULL, 0) == -1) |
119 |
+ { |
120 |
+ log(L_ERR "KRT: unable to get fib number, assuming 0. error: %s", strerror(errno)); |
121 |
+ return 0; |
122 |
+ } |
123 |
+ |
124 |
+ return fib; |
125 |
+} |
126 |
+ |
127 |
+int |
128 |
+my_fib_set(int fib) |
129 |
+{ |
130 |
+ int old_fib = my_fib_get(); |
131 |
+ |
132 |
+ if ((fib != old_fib) && (setfib(fib) == -1)) |
133 |
+ { |
134 |
+ log(L_ERR "KRT: setfib(%d) failed: %s", fib, strerror(errno)); |
135 |
+ die("Cannot set fib for kernel socket"); |
136 |
+ } |
137 |
+ |
138 |
+ return old_fib; |
139 |
+} |
140 |
+ |
75 |
#define ROUNDUP(a) \ |
141 |
#define ROUNDUP(a) \ |
76 |
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) |
142 |
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) |
77 |
|
143 |
|
78 |
@@ -219,6 +234,7 @@ |
144 |
@@ -69,7 +110,7 @@ |
|
|
145 |
body += l;} |
146 |
|
147 |
static void |
148 |
-krt_sock_send(int cmd, rte *e) |
149 |
+krt_sock_send(struct krt_proto *p, int cmd, rte *e) |
150 |
{ |
151 |
net *net = e->net; |
152 |
rta *a = e->attrs; |
153 |
@@ -180,23 +221,23 @@ |
154 |
l = body - (char *)&msg; |
155 |
msg.rtm.rtm_msglen = l; |
156 |
|
157 |
- if ((l = write(rt_sock, (char *)&msg, l)) < 0) { |
158 |
+ if ((l = write(p->rt_sock, (char *)&msg, l)) < 0) { |
159 |
log(L_ERR "KRT: Error sending route %I/%d to kernel", net->n.prefix, net->n.pxlen); |
160 |
} |
161 |
} |
162 |
|
163 |
void |
164 |
-krt_set_notify(struct krt_proto *p UNUSED, net *net, rte *new, rte *old) |
165 |
+krt_set_notify(struct krt_proto *p, net *net, rte *new, rte *old) |
166 |
{ |
167 |
if (old) |
168 |
{ |
169 |
DBG("krt_remove_route(%I/%d)\n", net->n.prefix, net->n.pxlen); |
170 |
- krt_sock_send(RTM_DELETE, old); |
171 |
+ krt_sock_send(p, RTM_DELETE, old); |
172 |
} |
173 |
if (new) |
174 |
{ |
175 |
DBG("krt_add_route(%I/%d)\n", net->n.prefix, net->n.pxlen); |
176 |
- krt_sock_send(RTM_ADD, new); |
177 |
+ krt_sock_send(p, RTM_ADD, new); |
178 |
} |
179 |
} |
180 |
|
181 |
@@ -218,25 +259,34 @@ |
182 |
krt_set_start(struct krt_proto *x, int first UNUSED) |
79 |
{ |
183 |
{ |
80 |
sock *sk_rt; |
184 |
sock *sk_rt; |
81 |
static int ks_open_tried = 0; |
185 |
- static int ks_open_tried = 0; |
82 |
+ int fib = 0; |
186 |
+ struct krt_config *c; |
|
|
187 |
+ int fib = 0, old_fib = 0; |
188 |
|
189 |
- if (ks_open_tried) |
190 |
- return; |
191 |
+ if (!strcmp(x->p.proto->name, "Kernel")) |
192 |
+ { |
193 |
+ c = (struct krt_config *)x->p.cf; |
194 |
+ fib = c->scan.table_id; |
83 |
|
195 |
|
84 |
if (ks_open_tried) |
196 |
- ks_open_tried = 1; |
85 |
return; |
197 |
+ DBG("KRT: Opening kernel route socket to fib %d\n", fib); |
86 |
@@ -230,6 +246,16 @@ |
198 |
+ if (x->p.debug & D_ROUTES) |
87 |
if( (rt_sock = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC)) < 0) |
199 |
+ log(L_TRACE "Opening route socket to fib %d", fib); |
|
|
200 |
|
201 |
- DBG("KRT: Opening kernel socket\n"); |
202 |
- |
203 |
- if( (rt_sock = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC)) < 0) |
204 |
+ old_fib = my_fib_set(fib); |
205 |
+ } |
206 |
+ |
207 |
+ if( (x->rt_sock = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC)) < 0) |
88 |
die("Cannot open kernel socket for routes"); |
208 |
die("Cannot open kernel socket for routes"); |
89 |
|
209 |
|
90 |
+ fib = ((struct krt_config *)x)->scan.table_id; |
210 |
sk_rt = sk_new(krt_pool); |
91 |
+ log(L_TRACE "KRT: Setting fib %d", fib); |
211 |
sk_rt->type = SK_MAGIC; |
92 |
+ |
212 |
sk_rt->rx_hook = krt_set_hook; |
|
|
213 |
- sk_rt->fd = rt_sock; |
214 |
+ sk_rt->fd = x->rt_sock; |
215 |
sk_rt->data = x; |
216 |
if (sk_open(sk_rt)) |
217 |
bug("krt-sock: sk_open failed"); |
93 |
+ |
218 |
+ |
94 |
+ if ((fib != 0) && (setsockopt(rt_sock, SOL_SOCKET, SO_SETFIB, &fib, sizeof(fib)) == -1)) |
219 |
+ /* Rollback fib */ |
|
|
220 |
+ my_fib_set(old_fib); |
221 |
} |
222 |
|
223 |
#define SKIP(ARG...) do { DBG("KRT: Ignoring route - " ARG); return; } while(0) |
224 |
@@ -624,6 +674,8 @@ |
225 |
size_t obl, needed; |
226 |
struct ks_msg *m; |
227 |
int retries = 3; |
228 |
+ struct krt_config *c; |
229 |
+ int fib = 0, old_fib = 0; |
230 |
|
231 |
mib[0] = CTL_NET; |
232 |
mib[1] = PF_ROUTE; |
233 |
@@ -632,6 +684,17 @@ |
234 |
mib[4] = cmd; |
235 |
mib[5] = 0; |
236 |
|
237 |
+ if (!strcmp(p->proto->name, "Kernel")) |
95 |
+ { |
238 |
+ { |
96 |
+ log(L_ERR "KRT: setsockopt() failed for socket %d: %s", rt_sock, strerror(errno)); |
239 |
+ c = (struct krt_config *)p->cf; |
97 |
+ die("Cannot set fib for kernel socket"); |
240 |
+ fib = c->scan.table_id; |
|
|
241 |
+ |
242 |
+ DBG("KRT: Setting fib to %d for route dump\n", fib); |
243 |
+ if (p->debug & D_ROUTES) |
244 |
+ log(L_TRACE "Setting fib to %d for route dump", fib); |
245 |
+ |
246 |
+ old_fib = my_fib_set(fib); |
98 |
+ } |
247 |
+ } |
|
|
248 |
try: |
249 |
if (sysctl(mib, 6 , NULL , &needed, NULL, 0) < 0) |
250 |
die("krt_sysctl_scan 1: %m"); |
251 |
@@ -656,6 +719,7 @@ |
252 |
goto try; |
253 |
|
254 |
log(L_ERR "KRT: Route scan failed"); |
255 |
+ my_fib_set(old_fib); |
256 |
return; |
257 |
} |
258 |
die("krt_sysctl_scan 2: %m"); |
259 |
@@ -666,6 +730,8 @@ |
260 |
m = (struct ks_msg *)next; |
261 |
krt_read_msg(p, m, 1); |
262 |
} |
99 |
+ |
263 |
+ |
100 |
sk_rt = sk_new(krt_pool); |
264 |
+ my_fib_set(old_fib); |
101 |
sk_rt->type = SK_MAGIC; |
265 |
} |
102 |
sk_rt->rx_hook = krt_set_hook; |
266 |
|
103 |
diff -urN sysdep/cf/bsd-v6.h sysdep/cf/bsd-v6.h |
267 |
static byte *krt_buffer = NULL; |
104 |
--- sysdep/cf/bsd-v6.h 2011-03-31 12:29:42.000000000 +0400 |
268 |
Index: sysdep/cf/bsd-v6.h |
105 |
+++ sysdep/cf/bsd-v6.h 2011-05-10 11:19:01.394166479 +0400 |
269 |
=================================================================== |
|
|
270 |
--- sysdep/cf/bsd-v6.h (revision 4869) |
271 |
+++ sysdep/cf/bsd-v6.h (working copy) |
106 |
@@ -10,7 +10,7 @@ |
272 |
@@ -10,7 +10,7 @@ |
107 |
|
273 |
|
108 |
#define CONFIG_AUTO_ROUTES |
274 |
#define CONFIG_AUTO_ROUTES |
Lines 112-120
Link Here
|
112 |
|
278 |
|
113 |
#undef CONFIG_UNIX_IFACE |
279 |
#undef CONFIG_UNIX_IFACE |
114 |
#undef CONFIG_UNIX_SET |
280 |
#undef CONFIG_UNIX_SET |
115 |
diff -urN sysdep/cf/bsd.h sysdep/cf/bsd.h |
281 |
Index: sysdep/cf/bsd.h |
116 |
--- sysdep/cf/bsd.h 2011-03-31 12:29:42.000000000 +0400 |
282 |
=================================================================== |
117 |
+++ sysdep/cf/bsd.h 2011-05-10 11:19:01.398182352 +0400 |
283 |
--- sysdep/cf/bsd.h (revision 4869) |
|
|
284 |
+++ sysdep/cf/bsd.h (working copy) |
118 |
@@ -8,7 +8,7 @@ |
285 |
@@ -8,7 +8,7 @@ |
119 |
|
286 |
|
120 |
#define CONFIG_AUTO_ROUTES |
287 |
#define CONFIG_AUTO_ROUTES |