]>
git.ipfire.org Git - thirdparty/bird.git/blob - sysdep/unix/krt-set.c
bd5644864468b645bb0250169ce0213645b850e1
2 * BIRD -- Unix Routing Table Syncing
4 * (c) 1998--2000 Martin Mares <mj@ucw.cz>
6 * Can be freely distributed and used under the terms of the GNU GPL.
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <sys/ioctl.h>
13 #include <net/route.h>
17 #include "nest/bird.h"
18 #include "nest/iface.h"
19 #include "nest/route.h"
20 #include "nest/protocol.h"
23 #include "lib/string.h"
30 #ifdef CONFIG_AUTO_ROUTES
31 if (a
->source
== RTS_DEVICE
)
35 a
->cast
== RTC_UNICAST
&&
36 (a
->dest
== RTD_ROUTER
37 || a
->dest
== RTD_DEVICE
39 || a
->dest
== RTD_UNREACHABLE
45 krt_ioctl(int ioc
, rte
*e
, char *name
)
51 bzero(&re
, sizeof(re
));
52 fill_in_sockaddr((struct sockaddr_in
*) &re
.rt_dst
, net
->n
.prefix
, 0);
53 fill_in_sockaddr((struct sockaddr_in
*) &re
.rt_genmask
, ipa_mkmask(net
->n
.pxlen
), 0);
55 if (net
->n
.pxlen
== 32)
56 re
.rt_flags
|= RTF_HOST
;
60 fill_in_sockaddr((struct sockaddr_in
*) &re
.rt_gateway
, a
->gw
, 0);
61 re
.rt_flags
|= RTF_GATEWAY
;
64 re
.rt_dev
= a
->iface
->name
;
68 re
.rt_flags
|= RTF_REJECT
;
72 bug("krt set: unknown flags, but not filtered");
75 if (ioctl(if_scan_sock
, ioc
, &re
) < 0)
76 log(L_ERR
"%s(%I/%d): %m", name
, net
->n
.prefix
, net
->n
.pxlen
);
80 krt_set_notify(struct krt_proto
*p
, net
*net
, rte
*new, rte
*old
)
84 DBG("krt_remove_route(%I/%d)\n", net
->n
.prefix
, net
->n
.pxlen
);
85 krt_ioctl(SIOCDELRT
, old
, "SIOCDELRT");
89 DBG("krt_add_route(%I/%d)\n", net
->n
.prefix
, net
->n
.pxlen
);
90 krt_ioctl(SIOCADDRT
, new, "SIOCADDRT");
95 krt_set_start(struct krt_proto
*x
, int first
)
98 bug("krt set: missing socket");
102 krt_set_construct(struct krt_config
*c
)
107 krt_set_shutdown(struct krt_proto
*x
, int last
)