4 * Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org>
5 * Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org>
6 * Copyright (c) 2004, 2008 Esben Norby <norby@openbsd.org>
7 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
9 * Permission to use, copy, modify, and distribute this software for any
10 * purpose with or without fee is hereby granted, provided that the above
11 * copyright notice and this permission notice appear in all copies.
13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30 #include "ldp_debug.h"
32 #include <lib/version.h>
45 #include "lib_errors.h"
47 static void ldpd_shutdown(void);
48 static pid_t
start_child(enum ldpd_process
, char *, int, int);
49 static int main_dispatch_ldpe(struct thread
*);
50 static int main_dispatch_lde(struct thread
*);
51 static int main_imsg_send_ipc_sockets(struct imsgbuf
*,
53 static void main_imsg_send_net_sockets(int);
54 static void main_imsg_send_net_socket(int, enum socket_type
);
55 static int main_imsg_send_config(struct ldpd_conf
*);
56 static void ldp_config_normalize(struct ldpd_conf
*);
57 static void ldp_config_reset(struct ldpd_conf
*);
58 static void ldp_config_reset_main(struct ldpd_conf
*);
59 static void ldp_config_reset_af(struct ldpd_conf
*, int);
60 static void ldp_config_reset_l2vpns(struct ldpd_conf
*);
61 static void merge_global(struct ldpd_conf
*, struct ldpd_conf
*);
62 static void merge_af(int, struct ldpd_af_conf
*,
63 struct ldpd_af_conf
*);
64 static void merge_ifaces(struct ldpd_conf
*, struct ldpd_conf
*);
65 static void merge_iface_af(struct iface_af
*, struct iface_af
*);
66 static void merge_tnbrs(struct ldpd_conf
*, struct ldpd_conf
*);
67 static void merge_nbrps(struct ldpd_conf
*, struct ldpd_conf
*);
68 static void merge_l2vpns(struct ldpd_conf
*, struct ldpd_conf
*);
69 static void merge_l2vpn(struct ldpd_conf
*, struct l2vpn
*,
72 DEFINE_QOBJ_TYPE(iface
)
73 DEFINE_QOBJ_TYPE(tnbr
)
74 DEFINE_QOBJ_TYPE(nbr_params
)
75 DEFINE_QOBJ_TYPE(l2vpn_if
)
76 DEFINE_QOBJ_TYPE(l2vpn_pw
)
77 DEFINE_QOBJ_TYPE(l2vpn
)
78 DEFINE_QOBJ_TYPE(ldpd_conf
)
80 struct ldpd_global global
;
81 struct ldpd_init init
;
82 struct ldpd_conf
*ldpd_conf
, *vty_conf
;
84 static struct imsgev
*iev_ldpe
, *iev_ldpe_sync
;
85 static struct imsgev
*iev_lde
, *iev_lde_sync
;
86 static pid_t ldpe_pid
;
89 enum ldpd_process ldpd_process
;
91 #define LDP_DEFAULT_CONFIG "ldpd.conf"
92 #define LDP_VTY_PORT 2612
94 /* Master of threads. */
95 struct thread_master
*master
;
97 static struct frr_daemon_info ldpd_di
;
100 static zebra_capabilities_t _caps_p
[] =
106 struct zebra_privs_t ldpd_privs
=
108 #if defined(FRR_USER) && defined(FRR_GROUP)
112 #if defined(VTY_GROUP)
113 .vty_group
= VTY_GROUP
,
116 .cap_num_p
= array_size(_caps_p
),
120 /* CTL Socket path */
121 char ctl_sock_path
[MAXPATHLEN
];
124 #define OPTION_CTLSOCK 1001
125 static const struct option longopts
[] =
127 { "ctl_socket", required_argument
, NULL
, OPTION_CTLSOCK
},
128 { "instance", required_argument
, NULL
, 'n'},
132 /* SIGHUP handler. */
136 log_info("SIGHUP received");
139 * Do a full configuration reload. In other words, reset vty_conf
140 * and build a new configuartion from scratch.
142 ldp_config_reset(vty_conf
);
143 vty_read_config(NULL
, ldpd_di
.config_file
, config_default
);
144 ldp_config_apply(NULL
, vty_conf
);
147 /* SIGINT / SIGTERM handler. */
151 log_info("SIGINT received");
155 /* SIGUSR1 handler. */
162 static struct quagga_signal_t ldp_signals
[] =
182 static const struct frr_yang_module_info
*const ldpd_yang_modules
[] = {
185 FRR_DAEMON_INFO(ldpd
, LDP
,
186 .vty_port
= LDP_VTY_PORT
,
188 .proghelp
= "Implementation of the LDP protocol.",
190 .signals
= ldp_signals
,
191 .n_signals
= array_size(ldp_signals
),
193 .privs
= &ldpd_privs
,
195 .yang_modules
= ldpd_yang_modules
,
196 .n_yang_modules
= array_size(ldpd_yang_modules
),
199 static int ldp_config_fork_apply(struct thread
*t
)
202 * So the frr_config_fork() function schedules
203 * the read of the vty config( if there is a
204 * non-integrated config ) to be after the
205 * end of startup and we are starting the
206 * main process loop. We need to schedule
207 * the application of this if necessary
208 * after the read in of the config.
210 ldp_config_apply(NULL
, vty_conf
);
216 main(int argc
, char *argv
[])
219 int lflag
= 0, eflag
= 0;
220 int pipe_parent2ldpe
[2], pipe_parent2ldpe_sync
[2];
221 int pipe_parent2lde
[2], pipe_parent2lde_sync
[2];
223 struct thread
*thread
= NULL
;
224 bool ctl_sock_used
= false;
226 snprintf(ctl_sock_path
, sizeof(ctl_sock_path
), LDPD_SOCKET
,
229 ldpd_process
= PROC_MAIN
;
230 log_procname
= log_procnames
[ldpd_process
];
232 saved_argv0
= argv
[0];
233 if (saved_argv0
== NULL
)
234 saved_argv0
= (char *)"ldpd";
236 frr_preinit(&ldpd_di
, argc
, argv
);
237 frr_opt_add("LEn:", longopts
,
238 " --ctl_socket Override ctl socket path\n"
239 " -n, --instance Instance id\n");
241 /* set default instance (to differentiate ldpd socket from lde one */
247 opt
= frr_getopt(argc
, argv
, NULL
);
256 ctl_sock_used
= true;
257 ctl_sock_name
= strrchr(LDPD_SOCKET
, '/');
263 * LDPD_SOCKET configured as relative path
264 * during config? Should really never happen for
267 ctl_sock_name
= (char *)LDPD_SOCKET
;
268 strlcpy(ctl_sock_path
, optarg
, sizeof(ctl_sock_path
));
269 strlcat(ctl_sock_path
, "/", sizeof(ctl_sock_path
));
270 strlcat(ctl_sock_path
, ctl_sock_name
,
271 sizeof(ctl_sock_path
));
274 init
.instance
= atoi(optarg
);
275 if (init
.instance
< 1)
290 if (ldpd_di
.pathspace
&& !ctl_sock_used
)
291 snprintf(ctl_sock_path
, sizeof(ctl_sock_path
), LDPD_SOCKET
,
292 "/", ldpd_di
.pathspace
);
294 strlcpy(init
.user
, ldpd_privs
.user
, sizeof(init
.user
));
295 strlcpy(init
.group
, ldpd_privs
.group
, sizeof(init
.group
));
296 strlcpy(init
.ctl_sock_path
, ctl_sock_path
, sizeof(init
.ctl_sock_path
));
297 strlcpy(init
.zclient_serv_path
, frr_zclientpath
,
298 sizeof(init
.zclient_serv_path
));
301 if (argc
> 0 || (lflag
&& eflag
))
304 /* check for root privileges */
305 if (geteuid() != 0) {
307 perror(ldpd_di
.progname
);
312 openzlog(ldpd_di
.progname
, "LDP", 0,
313 LOG_CONS
| LOG_NDELAY
| LOG_PID
, LOG_DAEMON
);
319 if (socketpair(AF_UNIX
, SOCK_STREAM
, PF_UNSPEC
, pipe_parent2ldpe
) == -1)
321 if (socketpair(AF_UNIX
, SOCK_STREAM
, PF_UNSPEC
,
322 pipe_parent2ldpe_sync
) == -1)
324 if (socketpair(AF_UNIX
, SOCK_STREAM
, PF_UNSPEC
, pipe_parent2lde
) == -1)
326 if (socketpair(AF_UNIX
, SOCK_STREAM
, PF_UNSPEC
,
327 pipe_parent2lde_sync
) == -1)
329 sock_set_nonblock(pipe_parent2ldpe
[0]);
330 sock_set_cloexec(pipe_parent2ldpe
[0]);
331 sock_set_nonblock(pipe_parent2ldpe
[1]);
332 sock_set_cloexec(pipe_parent2ldpe
[1]);
333 sock_set_nonblock(pipe_parent2ldpe_sync
[0]);
334 sock_set_cloexec(pipe_parent2ldpe_sync
[0]);
335 sock_set_cloexec(pipe_parent2ldpe_sync
[1]);
336 sock_set_nonblock(pipe_parent2lde
[0]);
337 sock_set_cloexec(pipe_parent2lde
[0]);
338 sock_set_nonblock(pipe_parent2lde
[1]);
339 sock_set_cloexec(pipe_parent2lde
[1]);
340 sock_set_nonblock(pipe_parent2lde_sync
[0]);
341 sock_set_cloexec(pipe_parent2lde_sync
[0]);
342 sock_set_cloexec(pipe_parent2lde_sync
[1]);
345 lde_pid
= start_child(PROC_LDE_ENGINE
, saved_argv0
,
346 pipe_parent2lde
[1], pipe_parent2lde_sync
[1]);
347 ldpe_pid
= start_child(PROC_LDP_ENGINE
, saved_argv0
,
348 pipe_parent2ldpe
[1], pipe_parent2ldpe_sync
[1]);
352 vrf_init(NULL
, NULL
, NULL
, NULL
, NULL
);
355 ldp_zebra_init(master
);
358 * Create base configuration with sane defaults. All configuration
359 * requests (e.g. CLI) act on vty_conf and then call ldp_config_apply()
360 * to merge the changes into ldpd_conf, which contains the actual
361 * running configuration.
363 ldpd_conf
= config_new_empty();
364 vty_conf
= config_new_empty();
365 QOBJ_REG(vty_conf
, ldpd_conf
);
367 /* read configuration file and daemonize */
370 /* apply configuration */
371 thread_add_event(master
, ldp_config_fork_apply
, NULL
, 0, &thread
);
373 /* setup pipes to children */
374 if ((iev_ldpe
= calloc(1, sizeof(struct imsgev
))) == NULL
||
375 (iev_ldpe_sync
= calloc(1, sizeof(struct imsgev
))) == NULL
||
376 (iev_lde
= calloc(1, sizeof(struct imsgev
))) == NULL
||
377 (iev_lde_sync
= calloc(1, sizeof(struct imsgev
))) == NULL
)
379 imsg_init(&iev_ldpe
->ibuf
, pipe_parent2ldpe
[0]);
380 iev_ldpe
->handler_read
= main_dispatch_ldpe
;
381 iev_ldpe
->ev_read
= NULL
;
382 thread_add_read(master
, iev_ldpe
->handler_read
, iev_ldpe
, iev_ldpe
->ibuf
.fd
,
384 iev_ldpe
->handler_write
= ldp_write_handler
;
386 imsg_init(&iev_ldpe_sync
->ibuf
, pipe_parent2ldpe_sync
[0]);
387 iev_ldpe_sync
->handler_read
= main_dispatch_ldpe
;
388 iev_ldpe_sync
->ev_read
= NULL
;
389 thread_add_read(master
, iev_ldpe_sync
->handler_read
, iev_ldpe_sync
, iev_ldpe_sync
->ibuf
.fd
,
390 &iev_ldpe_sync
->ev_read
);
391 iev_ldpe_sync
->handler_write
= ldp_write_handler
;
393 imsg_init(&iev_lde
->ibuf
, pipe_parent2lde
[0]);
394 iev_lde
->handler_read
= main_dispatch_lde
;
395 iev_lde
->ev_read
= NULL
;
396 thread_add_read(master
, iev_lde
->handler_read
, iev_lde
, iev_lde
->ibuf
.fd
,
398 iev_lde
->handler_write
= ldp_write_handler
;
400 imsg_init(&iev_lde_sync
->ibuf
, pipe_parent2lde_sync
[0]);
401 iev_lde_sync
->handler_read
= main_dispatch_lde
;
402 iev_lde_sync
->ev_read
= NULL
;
403 thread_add_read(master
, iev_lde_sync
->handler_read
, iev_lde_sync
, iev_lde_sync
->ibuf
.fd
,
404 &iev_lde_sync
->ev_read
);
405 iev_lde_sync
->handler_write
= ldp_write_handler
;
407 if (main_imsg_send_ipc_sockets(&iev_ldpe
->ibuf
, &iev_lde
->ibuf
))
408 fatal("could not establish imsg links");
409 main_imsg_compose_both(IMSG_DEBUG_UPDATE
, &ldp_debug
,
411 main_imsg_compose_both(IMSG_INIT
, &init
, sizeof(init
));
412 main_imsg_send_config(ldpd_conf
);
414 if (ldpd_conf
->ipv4
.flags
& F_LDPD_AF_ENABLED
)
415 main_imsg_send_net_sockets(AF_INET
);
416 if (ldpd_conf
->ipv6
.flags
& F_LDPD_AF_ENABLED
)
417 main_imsg_send_net_sockets(AF_INET6
);
434 msgbuf_clear(&iev_ldpe
->ibuf
.w
);
435 close(iev_ldpe
->ibuf
.fd
);
436 msgbuf_clear(&iev_lde
->ibuf
.w
);
437 close(iev_lde
->ibuf
.fd
);
439 config_clear(ldpd_conf
);
441 ldp_config_reset(vty_conf
);
442 QOBJ_UNREG(vty_conf
);
445 log_debug("waiting for children to terminate");
448 /* Wait for child process. */
451 /* We got interrupted, try again. */
454 /* No more processes were found. */
458 /* Unhandled errno condition. */
463 /* We found something, lets announce it. */
464 if (WIFSIGNALED(status
))
465 log_warnx("%s terminated; signal %d",
466 (pid
== lde_pid
? "label decision engine"
470 /* Repeat until there are no more child processes. */
476 log_info("terminating");
487 start_child(enum ldpd_process p
, char *argv0
, int fd_async
, int fd_sync
)
490 int argc
= 0, nullfd
;
493 switch (pid
= fork()) {
495 fatal("cannot fork");
504 nullfd
= open("/dev/null", O_RDONLY
| O_NOCTTY
);
506 flog_err_sys(EC_LIB_SYSTEM_CALL
,
507 "%s: failed to open /dev/null: %s", __func__
,
508 safe_strerror(errno
));
516 if (dup2(fd_async
, LDPD_FD_ASYNC
) == -1)
517 fatal("cannot setup imsg async fd");
518 if (dup2(fd_sync
, LDPD_FD_SYNC
) == -1)
519 fatal("cannot setup imsg sync fd");
521 argv
[argc
++] = argv0
;
524 fatalx("Can not start main process");
525 case PROC_LDE_ENGINE
:
526 argv
[argc
++] = (char *)"-L";
528 case PROC_LDP_ENGINE
:
529 argv
[argc
++] = (char *)"-E";
541 main_dispatch_ldpe(struct thread
*thread
)
543 struct imsgev
*iev
= THREAD_ARG(thread
);
544 struct imsgbuf
*ibuf
= &iev
->ibuf
;
552 if ((n
= imsg_read(ibuf
)) == -1 && errno
!= EAGAIN
)
553 fatal("imsg_read error");
554 if (n
== 0) /* connection closed */
558 if ((n
= imsg_get(ibuf
, &imsg
)) == -1)
564 switch (imsg
.hdr
.type
) {
566 logit(imsg
.hdr
.pid
, "%s", (const char *)imsg
.data
);
568 case IMSG_REQUEST_SOCKETS
:
570 main_imsg_send_net_sockets(af
);
573 if (imsg
.hdr
.len
!= IMSG_HEADER_SIZE
+
574 sizeof(struct acl_check
))
575 fatalx("IMSG_ACL_CHECK imsg with wrong len");
576 ldp_acl_reply(iev
, (struct acl_check
*)imsg
.data
);
579 log_debug("%s: error handling imsg %d", __func__
,
588 /* this pipe is dead, so remove the event handlers and exit */
589 THREAD_READ_OFF(iev
->ev_read
);
590 THREAD_WRITE_OFF(iev
->ev_write
);
595 kill(lde_pid
, SIGTERM
);
603 main_dispatch_lde(struct thread
*thread
)
605 struct imsgev
*iev
= THREAD_ARG(thread
);
606 struct imsgbuf
*ibuf
= &iev
->ibuf
;
613 if ((n
= imsg_read(ibuf
)) == -1 && errno
!= EAGAIN
)
614 fatal("imsg_read error");
615 if (n
== 0) /* connection closed */
619 if ((n
= imsg_get(ibuf
, &imsg
)) == -1)
625 switch (imsg
.hdr
.type
) {
627 logit(imsg
.hdr
.pid
, "%s", (const char *)imsg
.data
);
629 case IMSG_KLABEL_CHANGE
:
630 if (imsg
.hdr
.len
- IMSG_HEADER_SIZE
!=
631 sizeof(struct kroute
))
632 fatalx("invalid size of IMSG_KLABEL_CHANGE");
633 if (kr_change(imsg
.data
))
634 log_warnx("%s: error changing route", __func__
);
636 case IMSG_KLABEL_DELETE
:
637 if (imsg
.hdr
.len
- IMSG_HEADER_SIZE
!=
638 sizeof(struct kroute
))
639 fatalx("invalid size of IMSG_KLABEL_DELETE");
640 if (kr_delete(imsg
.data
))
641 log_warnx("%s: error deleting route", __func__
);
644 case IMSG_KPW_DELETE
:
647 if (imsg
.hdr
.len
- IMSG_HEADER_SIZE
!=
648 sizeof(struct zapi_pw
))
649 fatalx("invalid size of IMSG_KPWLABEL_CHANGE");
651 switch (imsg
.hdr
.type
) {
653 if (kmpw_add(imsg
.data
))
654 log_warnx("%s: error adding "
655 "pseudowire", __func__
);
657 case IMSG_KPW_DELETE
:
658 if (kmpw_del(imsg
.data
))
659 log_warnx("%s: error deleting "
660 "pseudowire", __func__
);
663 if (kmpw_set(imsg
.data
))
664 log_warnx("%s: error setting "
665 "pseudowire", __func__
);
668 if (kmpw_unset(imsg
.data
))
669 log_warnx("%s: error unsetting "
670 "pseudowire", __func__
);
675 if (imsg
.hdr
.len
!= IMSG_HEADER_SIZE
+
676 sizeof(struct acl_check
))
677 fatalx("IMSG_ACL_CHECK imsg with wrong len");
678 ldp_acl_reply(iev
, (struct acl_check
*)imsg
.data
);
681 log_debug("%s: error handling imsg %d", __func__
,
690 /* this pipe is dead, so remove the event handlers and exit */
691 THREAD_READ_OFF(iev
->ev_read
);
692 THREAD_WRITE_OFF(iev
->ev_write
);
697 kill(ldpe_pid
, SIGTERM
);
705 ldp_write_handler(struct thread
*thread
)
707 struct imsgev
*iev
= THREAD_ARG(thread
);
708 struct imsgbuf
*ibuf
= &iev
->ibuf
;
711 iev
->ev_write
= NULL
;
713 if ((n
= msgbuf_write(&ibuf
->w
)) == -1 && errno
!= EAGAIN
)
714 fatal("msgbuf_write");
716 /* this pipe is dead, so remove the event handlers */
717 THREAD_READ_OFF(iev
->ev_read
);
718 THREAD_WRITE_OFF(iev
->ev_write
);
728 main_imsg_compose_ldpe(int type
, pid_t pid
, void *data
, uint16_t datalen
)
730 if (iev_ldpe
== NULL
)
732 imsg_compose_event(iev_ldpe
, type
, 0, pid
, -1, data
, datalen
);
736 main_imsg_compose_lde(int type
, pid_t pid
, void *data
, uint16_t datalen
)
738 imsg_compose_event(iev_lde
, type
, 0, pid
, -1, data
, datalen
);
742 main_imsg_compose_both(enum imsg_type type
, void *buf
, uint16_t len
)
744 if (iev_ldpe
== NULL
|| iev_lde
== NULL
)
746 if (imsg_compose_event(iev_ldpe
, type
, 0, 0, -1, buf
, len
) == -1)
748 if (imsg_compose_event(iev_lde
, type
, 0, 0, -1, buf
, len
) == -1)
754 imsg_event_add(struct imsgev
*iev
)
756 if (iev
->handler_read
)
757 thread_add_read(master
, iev
->handler_read
, iev
, iev
->ibuf
.fd
,
760 if (iev
->handler_write
&& iev
->ibuf
.w
.queued
)
761 thread_add_write(master
, iev
->handler_write
, iev
,
762 iev
->ibuf
.fd
, &iev
->ev_write
);
766 imsg_compose_event(struct imsgev
*iev
, uint16_t type
, uint32_t peerid
,
767 pid_t pid
, int fd
, void *data
, uint16_t datalen
)
771 if ((ret
= imsg_compose(&iev
->ibuf
, type
, peerid
,
772 pid
, fd
, data
, datalen
)) != -1)
778 evbuf_enqueue(struct evbuf
*eb
, struct ibuf
*buf
)
780 ibuf_close(&eb
->wbuf
, buf
);
785 evbuf_event_add(struct evbuf
*eb
)
788 thread_add_write(master
, eb
->handler
, eb
->arg
, eb
->wbuf
.fd
,
793 evbuf_init(struct evbuf
*eb
, int fd
, int (*handler
)(struct thread
*),
796 msgbuf_init(&eb
->wbuf
);
798 eb
->handler
= handler
;
803 evbuf_clear(struct evbuf
*eb
)
805 THREAD_WRITE_OFF(eb
->ev
);
806 msgbuf_clear(&eb
->wbuf
);
811 main_imsg_send_ipc_sockets(struct imsgbuf
*ldpe_buf
, struct imsgbuf
*lde_buf
)
813 int pipe_ldpe2lde
[2];
815 if (socketpair(AF_UNIX
, SOCK_STREAM
, PF_UNSPEC
, pipe_ldpe2lde
) == -1)
817 sock_set_nonblock(pipe_ldpe2lde
[0]);
818 sock_set_nonblock(pipe_ldpe2lde
[1]);
820 if (imsg_compose(ldpe_buf
, IMSG_SOCKET_IPC
, 0, 0, pipe_ldpe2lde
[0],
823 if (imsg_compose(lde_buf
, IMSG_SOCKET_IPC
, 0, 0, pipe_ldpe2lde
[1],
831 main_imsg_send_net_sockets(int af
)
833 if (!ldp_addrisset(af
, &(ldp_af_conf_get(ldpd_conf
, af
))->trans_addr
))
836 main_imsg_send_net_socket(af
, LDP_SOCKET_DISC
);
837 main_imsg_send_net_socket(af
, LDP_SOCKET_EDISC
);
838 main_imsg_send_net_socket(af
, LDP_SOCKET_SESSION
);
839 imsg_compose_event(iev_ldpe
, IMSG_SETUP_SOCKETS
, af
, 0, -1, NULL
, 0);
843 main_imsg_send_net_socket(int af
, enum socket_type type
)
847 fd
= ldp_create_socket(af
, type
);
849 log_warnx("%s: failed to create %s socket for address-family "
850 "%s", __func__
, socket_name(type
), af_name(af
));
854 imsg_compose_event(iev_ldpe
, IMSG_SOCKET_NET
, af
, 0, fd
, &type
,
859 ldp_acl_request(struct imsgev
*iev
, char *acl_name
, int af
,
860 union ldpd_addr
*addr
, uint8_t prefixlen
)
863 struct acl_check acl_check
;
865 if (acl_name
[0] == '\0')
866 return FILTER_PERMIT
;
869 strlcpy(acl_check
.acl
, acl_name
, sizeof(acl_check
.acl
));
871 acl_check
.addr
= *addr
;
872 acl_check
.prefixlen
= prefixlen
;
874 /* send (blocking) */
875 imsg_compose_event(iev
, IMSG_ACL_CHECK
, 0, 0, -1, &acl_check
,
877 imsg_flush(&iev
->ibuf
);
879 /* receive (blocking) and parse result */
880 if (imsg_read(&iev
->ibuf
) == -1)
881 fatal("imsg_read error");
882 if (imsg_get(&iev
->ibuf
, &imsg
) == -1)
884 if (imsg
.hdr
.type
!= IMSG_ACL_CHECK
||
885 imsg
.hdr
.len
!= IMSG_HEADER_SIZE
+ sizeof(int))
886 fatalx("ldp_acl_request: invalid response");
888 return (*((int *)imsg
.data
));
892 ldp_acl_reply(struct imsgev
*iev
, struct acl_check
*acl_check
)
894 struct access_list
*alist
;
895 struct prefix prefix
;
898 alist
= access_list_lookup(family2afi(acl_check
->af
), acl_check
->acl
);
900 result
= FILTER_DENY
;
902 prefix
.family
= acl_check
->af
;
903 switch (prefix
.family
) {
905 prefix
.u
.prefix4
= acl_check
->addr
.v4
;
908 prefix
.u
.prefix6
= acl_check
->addr
.v6
;
911 fatalx("ldp_acl_reply: unknown af");
913 prefix
.prefixlen
= acl_check
->prefixlen
;
914 result
= access_list_apply(alist
, &prefix
);
917 imsg_compose_event(iev
, IMSG_ACL_CHECK
, 0, 0, -1, &result
,
921 struct ldpd_af_conf
*
922 ldp_af_conf_get(struct ldpd_conf
*xconf
, int af
)
926 return (&xconf
->ipv4
);
928 return (&xconf
->ipv6
);
930 fatalx("ldp_af_conf_get: unknown af");
934 struct ldpd_af_global
*
935 ldp_af_global_get(struct ldpd_global
*xglobal
, int af
)
939 return (&xglobal
->ipv4
);
941 return (&xglobal
->ipv6
);
943 fatalx("ldp_af_global_get: unknown af");
948 ldp_is_dual_stack(struct ldpd_conf
*xconf
)
950 return ((xconf
->ipv4
.flags
& F_LDPD_AF_ENABLED
) &&
951 (xconf
->ipv6
.flags
& F_LDPD_AF_ENABLED
));
955 ldp_rtr_id_get(struct ldpd_conf
*xconf
)
957 if (xconf
->rtr_id
.s_addr
!= INADDR_ANY
)
958 return (xconf
->rtr_id
.s_addr
);
960 return (global
.rtr_id
.s_addr
);
964 main_imsg_send_config(struct ldpd_conf
*xconf
)
968 struct nbr_params
*nbrp
;
970 struct l2vpn_if
*lif
;
973 if (main_imsg_compose_both(IMSG_RECONF_CONF
, xconf
,
974 sizeof(*xconf
)) == -1)
977 RB_FOREACH(iface
, iface_head
, &xconf
->iface_tree
) {
978 if (main_imsg_compose_both(IMSG_RECONF_IFACE
, iface
,
979 sizeof(*iface
)) == -1)
983 RB_FOREACH(tnbr
, tnbr_head
, &xconf
->tnbr_tree
) {
984 if (main_imsg_compose_both(IMSG_RECONF_TNBR
, tnbr
,
985 sizeof(*tnbr
)) == -1)
989 RB_FOREACH(nbrp
, nbrp_head
, &xconf
->nbrp_tree
) {
990 if (main_imsg_compose_both(IMSG_RECONF_NBRP
, nbrp
,
991 sizeof(*nbrp
)) == -1)
995 RB_FOREACH(l2vpn
, l2vpn_head
, &xconf
->l2vpn_tree
) {
996 if (main_imsg_compose_both(IMSG_RECONF_L2VPN
, l2vpn
,
997 sizeof(*l2vpn
)) == -1)
1000 RB_FOREACH(lif
, l2vpn_if_head
, &l2vpn
->if_tree
) {
1001 if (main_imsg_compose_both(IMSG_RECONF_L2VPN_IF
, lif
,
1002 sizeof(*lif
)) == -1)
1005 RB_FOREACH(pw
, l2vpn_pw_head
, &l2vpn
->pw_tree
) {
1006 if (main_imsg_compose_both(IMSG_RECONF_L2VPN_PW
, pw
,
1010 RB_FOREACH(pw
, l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
) {
1011 if (main_imsg_compose_both(IMSG_RECONF_L2VPN_IPW
, pw
,
1017 if (main_imsg_compose_both(IMSG_RECONF_END
, NULL
, 0) == -1)
1024 ldp_config_apply(struct vty
*vty
, struct ldpd_conf
*xconf
)
1027 * When reading from a configuration file (startup and sighup), we
1028 * call merge_config() only once after the whole config has been read.
1029 * This is the optimal and least disruptive way to update the running
1032 if (vty
&& vty
->type
== VTY_FILE
)
1035 ldp_config_normalize(xconf
);
1037 if (main_imsg_send_config(xconf
) == -1)
1040 merge_config(ldpd_conf
, xconf
);
1046 ldp_config_normalize(struct ldpd_conf
*xconf
)
1048 struct iface
*iface
, *itmp
;
1049 struct nbr_params
*nbrp
, *ntmp
;
1050 struct l2vpn
*l2vpn
;
1051 struct l2vpn_pw
*pw
, *ptmp
;
1053 if (!(xconf
->flags
& F_LDPD_ENABLED
))
1054 ldp_config_reset_main(xconf
);
1056 if (!(xconf
->ipv4
.flags
& F_LDPD_AF_ENABLED
))
1057 ldp_config_reset_af(xconf
, AF_INET
);
1058 if (!(xconf
->ipv6
.flags
& F_LDPD_AF_ENABLED
))
1059 ldp_config_reset_af(xconf
, AF_INET6
);
1061 RB_FOREACH_SAFE(iface
, iface_head
, &xconf
->iface_tree
, itmp
) {
1062 if (iface
->ipv4
.enabled
|| iface
->ipv6
.enabled
)
1066 RB_REMOVE(iface_head
, &vty_conf
->iface_tree
, iface
);
1070 RB_FOREACH_SAFE(nbrp
, nbrp_head
, &xconf
->nbrp_tree
, ntmp
) {
1071 if (nbrp
->flags
& (F_NBRP_KEEPALIVE
|F_NBRP_GTSM
))
1073 if (nbrp
->auth
.method
!= AUTH_NONE
)
1077 RB_REMOVE(nbrp_head
, &vty_conf
->nbrp_tree
, nbrp
);
1082 RB_FOREACH(l2vpn
, l2vpn_head
, &xconf
->l2vpn_tree
) {
1083 RB_FOREACH_SAFE(pw
, l2vpn_pw_head
, &l2vpn
->pw_tree
, ptmp
) {
1084 if (!(pw
->flags
& F_PW_STATIC_NBR_ADDR
)) {
1086 pw
->addr
.v4
= pw
->lsr_id
;
1089 if (pw
->lsr_id
.s_addr
!= INADDR_ANY
&& pw
->pwid
!= 0)
1091 RB_REMOVE(l2vpn_pw_head
, &l2vpn
->pw_tree
, pw
);
1092 RB_INSERT(l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
, pw
);
1094 RB_FOREACH_SAFE(pw
, l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
,
1096 if (!(pw
->flags
& F_PW_STATIC_NBR_ADDR
)) {
1098 pw
->addr
.v4
= pw
->lsr_id
;
1101 if (pw
->lsr_id
.s_addr
== INADDR_ANY
|| pw
->pwid
== 0)
1103 RB_REMOVE(l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
, pw
);
1104 RB_INSERT(l2vpn_pw_head
, &l2vpn
->pw_tree
, pw
);
1110 ldp_config_reset(struct ldpd_conf
*conf
)
1112 ldp_config_reset_main(conf
);
1113 ldp_config_reset_l2vpns(conf
);
1117 ldp_config_reset_main(struct ldpd_conf
*conf
)
1119 struct iface
*iface
;
1120 struct nbr_params
*nbrp
;
1122 while (!RB_EMPTY(iface_head
, &conf
->iface_tree
)) {
1123 iface
= RB_ROOT(iface_head
, &conf
->iface_tree
);
1126 RB_REMOVE(iface_head
, &conf
->iface_tree
, iface
);
1130 while (!RB_EMPTY(nbrp_head
, &conf
->nbrp_tree
)) {
1131 nbrp
= RB_ROOT(nbrp_head
, &conf
->nbrp_tree
);
1134 RB_REMOVE(nbrp_head
, &conf
->nbrp_tree
, nbrp
);
1138 conf
->rtr_id
.s_addr
= INADDR_ANY
;
1139 ldp_config_reset_af(conf
, AF_INET
);
1140 ldp_config_reset_af(conf
, AF_INET6
);
1141 conf
->lhello_holdtime
= LINK_DFLT_HOLDTIME
;
1142 conf
->lhello_interval
= DEFAULT_HELLO_INTERVAL
;
1143 conf
->thello_holdtime
= TARGETED_DFLT_HOLDTIME
;
1144 conf
->thello_interval
= DEFAULT_HELLO_INTERVAL
;
1145 conf
->trans_pref
= DUAL_STACK_LDPOV6
;
1150 ldp_config_reset_af(struct ldpd_conf
*conf
, int af
)
1152 struct ldpd_af_conf
*af_conf
;
1153 struct iface
*iface
;
1154 struct iface_af
*ia
;
1155 struct tnbr
*tnbr
, *ttmp
;
1157 RB_FOREACH(iface
, iface_head
, &conf
->iface_tree
) {
1158 ia
= iface_af_get(iface
, af
);
1162 RB_FOREACH_SAFE(tnbr
, tnbr_head
, &conf
->tnbr_tree
, ttmp
) {
1167 RB_REMOVE(tnbr_head
, &conf
->tnbr_tree
, tnbr
);
1171 af_conf
= ldp_af_conf_get(conf
, af
);
1172 af_conf
->keepalive
= 180;
1173 af_conf
->lhello_holdtime
= 0;
1174 af_conf
->lhello_interval
= 0;
1175 af_conf
->thello_holdtime
= 0;
1176 af_conf
->thello_interval
= 0;
1177 memset(&af_conf
->trans_addr
, 0, sizeof(af_conf
->trans_addr
));
1182 ldp_config_reset_l2vpns(struct ldpd_conf
*conf
)
1184 struct l2vpn
*l2vpn
;
1185 struct l2vpn_if
*lif
;
1186 struct l2vpn_pw
*pw
;
1188 while (!RB_EMPTY(l2vpn_head
, &conf
->l2vpn_tree
)) {
1189 l2vpn
= RB_ROOT(l2vpn_head
, &conf
->l2vpn_tree
);
1190 while (!RB_EMPTY(l2vpn_if_head
, &l2vpn
->if_tree
)) {
1191 lif
= RB_ROOT(l2vpn_if_head
, &l2vpn
->if_tree
);
1194 RB_REMOVE(l2vpn_if_head
, &l2vpn
->if_tree
, lif
);
1197 while (!RB_EMPTY(l2vpn_pw_head
, &l2vpn
->pw_tree
)) {
1198 pw
= RB_ROOT(l2vpn_pw_head
, &l2vpn
->pw_tree
);
1201 RB_REMOVE(l2vpn_pw_head
, &l2vpn
->pw_tree
, pw
);
1204 while (!RB_EMPTY(l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
)) {
1205 pw
= RB_ROOT(l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
);
1208 RB_REMOVE(l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
, pw
);
1212 RB_REMOVE(l2vpn_head
, &conf
->l2vpn_tree
, l2vpn
);
1218 ldp_clear_config(struct ldpd_conf
*xconf
)
1220 struct iface
*iface
;
1222 struct nbr_params
*nbrp
;
1223 struct l2vpn
*l2vpn
;
1225 while (!RB_EMPTY(iface_head
, &xconf
->iface_tree
)) {
1226 iface
= RB_ROOT(iface_head
, &xconf
->iface_tree
);
1228 RB_REMOVE(iface_head
, &xconf
->iface_tree
, iface
);
1231 while (!RB_EMPTY(tnbr_head
, &xconf
->tnbr_tree
)) {
1232 tnbr
= RB_ROOT(tnbr_head
, &xconf
->tnbr_tree
);
1234 RB_REMOVE(tnbr_head
, &xconf
->tnbr_tree
, tnbr
);
1237 while (!RB_EMPTY(nbrp_head
, &xconf
->nbrp_tree
)) {
1238 nbrp
= RB_ROOT(nbrp_head
, &xconf
->nbrp_tree
);
1240 RB_REMOVE(nbrp_head
, &xconf
->nbrp_tree
, nbrp
);
1243 while (!RB_EMPTY(l2vpn_head
, &xconf
->l2vpn_tree
)) {
1244 l2vpn
= RB_ROOT(l2vpn_head
, &xconf
->l2vpn_tree
);
1246 RB_REMOVE(l2vpn_head
, &xconf
->l2vpn_tree
, l2vpn
);
1253 #define COPY(a, b) do { \
1254 a = malloc(sizeof(*a)); \
1261 merge_config(struct ldpd_conf
*conf
, struct ldpd_conf
*xconf
)
1263 merge_global(conf
, xconf
);
1264 merge_af(AF_INET
, &conf
->ipv4
, &xconf
->ipv4
);
1265 merge_af(AF_INET6
, &conf
->ipv6
, &xconf
->ipv6
);
1266 merge_ifaces(conf
, xconf
);
1267 merge_tnbrs(conf
, xconf
);
1268 merge_nbrps(conf
, xconf
);
1269 merge_l2vpns(conf
, xconf
);
1273 merge_global(struct ldpd_conf
*conf
, struct ldpd_conf
*xconf
)
1275 /* change of router-id requires resetting all neighborships */
1276 if (conf
->rtr_id
.s_addr
!= xconf
->rtr_id
.s_addr
) {
1277 if (ldpd_process
== PROC_LDP_ENGINE
) {
1278 ldpe_reset_nbrs(AF_UNSPEC
);
1279 if (conf
->rtr_id
.s_addr
== INADDR_ANY
||
1280 xconf
->rtr_id
.s_addr
== INADDR_ANY
) {
1281 if_update_all(AF_UNSPEC
);
1282 tnbr_update_all(AF_UNSPEC
);
1285 conf
->rtr_id
= xconf
->rtr_id
;
1288 conf
->lhello_holdtime
= xconf
->lhello_holdtime
;
1289 conf
->lhello_interval
= xconf
->lhello_interval
;
1290 conf
->thello_holdtime
= xconf
->thello_holdtime
;
1291 conf
->thello_interval
= xconf
->thello_interval
;
1293 if (conf
->trans_pref
!= xconf
->trans_pref
) {
1294 if (ldpd_process
== PROC_LDP_ENGINE
)
1295 ldpe_reset_ds_nbrs();
1296 conf
->trans_pref
= xconf
->trans_pref
;
1299 if ((conf
->flags
& F_LDPD_DS_CISCO_INTEROP
) !=
1300 (xconf
->flags
& F_LDPD_DS_CISCO_INTEROP
)) {
1301 if (ldpd_process
== PROC_LDP_ENGINE
)
1302 ldpe_reset_ds_nbrs();
1305 conf
->flags
= xconf
->flags
;
1309 merge_af(int af
, struct ldpd_af_conf
*af_conf
, struct ldpd_af_conf
*xa
)
1311 int stop_init_backoff
= 0;
1312 int remove_dynamic_tnbrs
= 0;
1313 int change_egress_label
= 0;
1314 int reset_nbrs_ipv4
= 0;
1316 int update_sockets
= 0;
1319 if (af_conf
->keepalive
!= xa
->keepalive
) {
1320 af_conf
->keepalive
= xa
->keepalive
;
1321 stop_init_backoff
= 1;
1323 af_conf
->lhello_holdtime
= xa
->lhello_holdtime
;
1324 af_conf
->lhello_interval
= xa
->lhello_interval
;
1325 af_conf
->thello_holdtime
= xa
->thello_holdtime
;
1326 af_conf
->thello_interval
= xa
->thello_interval
;
1329 if ((af_conf
->flags
& F_LDPD_AF_THELLO_ACCEPT
) &&
1330 !(xa
->flags
& F_LDPD_AF_THELLO_ACCEPT
))
1331 remove_dynamic_tnbrs
= 1;
1332 if ((af_conf
->flags
& F_LDPD_AF_NO_GTSM
) !=
1333 (xa
->flags
& F_LDPD_AF_NO_GTSM
)) {
1335 /* need to set/unset IPV6_MINHOPCOUNT */
1338 /* for LDPv4 just resetting the neighbors is enough */
1339 reset_nbrs_ipv4
= 1;
1341 if ((af_conf
->flags
& F_LDPD_AF_EXPNULL
) !=
1342 (xa
->flags
& F_LDPD_AF_EXPNULL
))
1343 change_egress_label
= 1;
1344 af_conf
->flags
= xa
->flags
;
1346 /* update the transport address */
1347 if (ldp_addrcmp(af
, &af_conf
->trans_addr
, &xa
->trans_addr
)) {
1348 af_conf
->trans_addr
= xa
->trans_addr
;
1353 if (strcmp(af_conf
->acl_label_advertise_to
,
1354 xa
->acl_label_advertise_to
) ||
1355 strcmp(af_conf
->acl_label_advertise_for
,
1356 xa
->acl_label_advertise_for
) ||
1357 strcmp(af_conf
->acl_label_accept_from
,
1358 xa
->acl_label_accept_from
) ||
1359 strcmp(af_conf
->acl_label_accept_for
,
1360 xa
->acl_label_accept_for
))
1362 if (strcmp(af_conf
->acl_thello_accept_from
, xa
->acl_thello_accept_from
))
1363 remove_dynamic_tnbrs
= 1;
1364 if (strcmp(af_conf
->acl_label_expnull_for
, xa
->acl_label_expnull_for
))
1365 change_egress_label
= 1;
1366 strlcpy(af_conf
->acl_thello_accept_from
, xa
->acl_thello_accept_from
,
1367 sizeof(af_conf
->acl_thello_accept_from
));
1368 strlcpy(af_conf
->acl_label_allocate_for
, xa
->acl_label_allocate_for
,
1369 sizeof(af_conf
->acl_label_allocate_for
));
1370 strlcpy(af_conf
->acl_label_advertise_to
, xa
->acl_label_advertise_to
,
1371 sizeof(af_conf
->acl_label_advertise_to
));
1372 strlcpy(af_conf
->acl_label_advertise_for
, xa
->acl_label_advertise_for
,
1373 sizeof(af_conf
->acl_label_advertise_for
));
1374 strlcpy(af_conf
->acl_label_accept_from
, xa
->acl_label_accept_from
,
1375 sizeof(af_conf
->acl_label_accept_from
));
1376 strlcpy(af_conf
->acl_label_accept_for
, xa
->acl_label_accept_for
,
1377 sizeof(af_conf
->acl_label_accept_for
));
1378 strlcpy(af_conf
->acl_label_expnull_for
, xa
->acl_label_expnull_for
,
1379 sizeof(af_conf
->acl_label_expnull_for
));
1381 /* apply the new configuration */
1382 switch (ldpd_process
) {
1383 case PROC_LDE_ENGINE
:
1384 if (change_egress_label
)
1385 lde_change_egress_label(af
);
1387 case PROC_LDP_ENGINE
:
1388 if (stop_init_backoff
)
1389 ldpe_stop_init_backoff(af
);
1390 if (remove_dynamic_tnbrs
)
1391 ldpe_remove_dynamic_tnbrs(af
);
1393 ldpe_reset_nbrs(AF_UNSPEC
);
1394 else if (reset_nbrs_ipv4
)
1395 ldpe_reset_nbrs(AF_INET
);
1398 if (update_sockets
&& iev_ldpe
)
1399 imsg_compose_event(iev_ldpe
, IMSG_CLOSE_SOCKETS
, af
,
1406 merge_ifaces(struct ldpd_conf
*conf
, struct ldpd_conf
*xconf
)
1408 struct iface
*iface
, *itmp
, *xi
;
1410 RB_FOREACH_SAFE(iface
, iface_head
, &conf
->iface_tree
, itmp
) {
1411 /* find deleted interfaces */
1412 if (if_lookup_name(xconf
, iface
->name
) == NULL
) {
1413 switch (ldpd_process
) {
1414 case PROC_LDP_ENGINE
:
1415 ldpe_if_exit(iface
);
1417 case PROC_LDE_ENGINE
:
1421 RB_REMOVE(iface_head
, &conf
->iface_tree
, iface
);
1425 RB_FOREACH_SAFE(xi
, iface_head
, &xconf
->iface_tree
, itmp
) {
1426 /* find new interfaces */
1427 if ((iface
= if_lookup_name(conf
, xi
->name
)) == NULL
) {
1429 RB_INSERT(iface_head
, &conf
->iface_tree
, iface
);
1431 switch (ldpd_process
) {
1432 case PROC_LDP_ENGINE
:
1433 ldpe_if_init(iface
);
1435 case PROC_LDE_ENGINE
:
1438 /* resend addresses to activate new interfaces */
1439 kif_redistribute(iface
->name
);
1445 /* update existing interfaces */
1446 merge_iface_af(&iface
->ipv4
, &xi
->ipv4
);
1447 merge_iface_af(&iface
->ipv6
, &xi
->ipv6
);
1452 merge_iface_af(struct iface_af
*ia
, struct iface_af
*xi
)
1454 if (ia
->enabled
!= xi
->enabled
) {
1455 ia
->enabled
= xi
->enabled
;
1456 if (ldpd_process
== PROC_LDP_ENGINE
)
1457 ldp_if_update(ia
->iface
, ia
->af
);
1459 ia
->hello_holdtime
= xi
->hello_holdtime
;
1460 ia
->hello_interval
= xi
->hello_interval
;
1464 merge_tnbrs(struct ldpd_conf
*conf
, struct ldpd_conf
*xconf
)
1466 struct tnbr
*tnbr
, *ttmp
, *xt
;
1468 RB_FOREACH_SAFE(tnbr
, tnbr_head
, &conf
->tnbr_tree
, ttmp
) {
1469 if (!(tnbr
->flags
& F_TNBR_CONFIGURED
))
1472 /* find deleted tnbrs */
1473 if (tnbr_find(xconf
, tnbr
->af
, &tnbr
->addr
) == NULL
) {
1474 switch (ldpd_process
) {
1475 case PROC_LDP_ENGINE
:
1476 tnbr
->flags
&= ~F_TNBR_CONFIGURED
;
1477 tnbr_check(conf
, tnbr
);
1479 case PROC_LDE_ENGINE
:
1481 RB_REMOVE(tnbr_head
, &conf
->tnbr_tree
, tnbr
);
1487 RB_FOREACH_SAFE(xt
, tnbr_head
, &xconf
->tnbr_tree
, ttmp
) {
1488 /* find new tnbrs */
1489 if ((tnbr
= tnbr_find(conf
, xt
->af
, &xt
->addr
)) == NULL
) {
1491 RB_INSERT(tnbr_head
, &conf
->tnbr_tree
, tnbr
);
1493 switch (ldpd_process
) {
1494 case PROC_LDP_ENGINE
:
1497 case PROC_LDE_ENGINE
:
1504 /* update existing tnbrs */
1505 if (!(tnbr
->flags
& F_TNBR_CONFIGURED
))
1506 tnbr
->flags
|= F_TNBR_CONFIGURED
;
1511 merge_nbrps(struct ldpd_conf
*conf
, struct ldpd_conf
*xconf
)
1513 struct nbr_params
*nbrp
, *ntmp
, *xn
;
1517 RB_FOREACH_SAFE(nbrp
, nbrp_head
, &conf
->nbrp_tree
, ntmp
) {
1518 /* find deleted nbrps */
1519 if (nbr_params_find(xconf
, nbrp
->lsr_id
) != NULL
)
1522 switch (ldpd_process
) {
1523 case PROC_LDP_ENGINE
:
1524 nbr
= nbr_find_ldpid(nbrp
->lsr_id
.s_addr
);
1526 session_shutdown(nbr
, S_SHUTDOWN
, 0, 0);
1531 (ldp_af_global_get(&global
, nbr
->af
))
1532 ->ldp_session_socket
,
1533 nbr
->af
, &nbr
->raddr
, NULL
);
1535 nbr
->auth
.method
= AUTH_NONE
;
1536 if (nbr_session_active_role(nbr
))
1537 nbr_establish_connection(nbr
);
1540 case PROC_LDE_ENGINE
:
1544 RB_REMOVE(nbrp_head
, &conf
->nbrp_tree
, nbrp
);
1548 RB_FOREACH_SAFE(xn
, nbrp_head
, &xconf
->nbrp_tree
, ntmp
) {
1549 /* find new nbrps */
1550 if ((nbrp
= nbr_params_find(conf
, xn
->lsr_id
)) == NULL
) {
1552 RB_INSERT(nbrp_head
, &conf
->nbrp_tree
, nbrp
);
1554 switch (ldpd_process
) {
1555 case PROC_LDP_ENGINE
:
1556 nbr
= nbr_find_ldpid(nbrp
->lsr_id
.s_addr
);
1558 session_shutdown(nbr
, S_SHUTDOWN
, 0, 0);
1559 nbr
->auth
.method
= nbrp
->auth
.method
;
1561 if (pfkey_establish(nbr
, nbrp
) == -1)
1562 fatalx("pfkey setup failed");
1565 (ldp_af_global_get(&global
,
1566 nbr
->af
))->ldp_session_socket
,
1567 nbr
->af
, &nbr
->raddr
,
1570 if (nbr_session_active_role(nbr
))
1571 nbr_establish_connection(nbr
);
1574 case PROC_LDE_ENGINE
:
1581 /* update existing nbrps */
1582 if (nbrp
->flags
!= xn
->flags
||
1583 nbrp
->keepalive
!= xn
->keepalive
||
1584 nbrp
->gtsm_enabled
!= xn
->gtsm_enabled
||
1585 nbrp
->gtsm_hops
!= xn
->gtsm_hops
||
1586 nbrp
->auth
.method
!= xn
->auth
.method
||
1587 strcmp(nbrp
->auth
.md5key
, xn
->auth
.md5key
) != 0)
1592 nbrp
->keepalive
= xn
->keepalive
;
1593 nbrp
->gtsm_enabled
= xn
->gtsm_enabled
;
1594 nbrp
->gtsm_hops
= xn
->gtsm_hops
;
1595 nbrp
->auth
.method
= xn
->auth
.method
;
1596 strlcpy(nbrp
->auth
.md5key
, xn
->auth
.md5key
,
1597 sizeof(nbrp
->auth
.md5key
));
1598 nbrp
->auth
.md5key_len
= xn
->auth
.md5key_len
;
1599 nbrp
->flags
= xn
->flags
;
1601 if (ldpd_process
== PROC_LDP_ENGINE
) {
1602 nbr
= nbr_find_ldpid(nbrp
->lsr_id
.s_addr
);
1603 if (nbr
&& nbrp_changed
) {
1604 session_shutdown(nbr
, S_SHUTDOWN
, 0, 0);
1607 nbr
->auth
.method
= nbrp
->auth
.method
;
1608 if (pfkey_establish(nbr
, nbrp
) == -1)
1609 fatalx("pfkey setup failed");
1611 nbr
->auth
.method
= nbrp
->auth
.method
;
1612 sock_set_md5sig((ldp_af_global_get(&global
,
1613 nbr
->af
))->ldp_session_socket
, nbr
->af
,
1614 &nbr
->raddr
, nbrp
->auth
.md5key
);
1616 if (nbr_session_active_role(nbr
))
1617 nbr_establish_connection(nbr
);
1624 merge_l2vpns(struct ldpd_conf
*conf
, struct ldpd_conf
*xconf
)
1626 struct l2vpn
*l2vpn
, *ltmp
, *xl
;
1628 RB_FOREACH_SAFE(l2vpn
, l2vpn_head
, &conf
->l2vpn_tree
, ltmp
) {
1629 /* find deleted l2vpns */
1630 if (l2vpn_find(xconf
, l2vpn
->name
) == NULL
) {
1631 switch (ldpd_process
) {
1632 case PROC_LDE_ENGINE
:
1635 case PROC_LDP_ENGINE
:
1636 ldpe_l2vpn_exit(l2vpn
);
1641 RB_REMOVE(l2vpn_head
, &conf
->l2vpn_tree
, l2vpn
);
1645 RB_FOREACH_SAFE(xl
, l2vpn_head
, &xconf
->l2vpn_tree
, ltmp
) {
1646 /* find new l2vpns */
1647 if ((l2vpn
= l2vpn_find(conf
, xl
->name
)) == NULL
) {
1649 RB_INSERT(l2vpn_head
, &conf
->l2vpn_tree
, l2vpn
);
1650 RB_INIT(l2vpn_if_head
, &l2vpn
->if_tree
);
1651 RB_INIT(l2vpn_pw_head
, &l2vpn
->pw_tree
);
1652 RB_INIT(l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
);
1654 switch (ldpd_process
) {
1655 case PROC_LDE_ENGINE
:
1658 case PROC_LDP_ENGINE
:
1659 ldpe_l2vpn_init(l2vpn
);
1666 /* update existing l2vpns */
1667 merge_l2vpn(conf
, l2vpn
, xl
);
1672 merge_l2vpn(struct ldpd_conf
*xconf
, struct l2vpn
*l2vpn
, struct l2vpn
*xl
)
1674 struct l2vpn_if
*lif
, *ftmp
, *xf
;
1675 struct l2vpn_pw
*pw
, *ptmp
, *xp
;
1677 int reset_nbr
, reinstall_pwfec
, reinstall_tnbr
;
1678 int previous_pw_type
, previous_mtu
;
1680 previous_pw_type
= l2vpn
->pw_type
;
1681 previous_mtu
= l2vpn
->mtu
;
1683 /* merge intefaces */
1684 RB_FOREACH_SAFE(lif
, l2vpn_if_head
, &l2vpn
->if_tree
, ftmp
) {
1685 /* find deleted interfaces */
1686 if (l2vpn_if_find(xl
, lif
->ifname
) == NULL
) {
1687 RB_REMOVE(l2vpn_if_head
, &l2vpn
->if_tree
, lif
);
1691 RB_FOREACH_SAFE(xf
, l2vpn_if_head
, &xl
->if_tree
, ftmp
) {
1692 /* find new interfaces */
1693 if (l2vpn_if_find(l2vpn
, xf
->ifname
) == NULL
) {
1695 RB_INSERT(l2vpn_if_head
, &l2vpn
->if_tree
, lif
);
1698 switch (ldpd_process
) {
1699 case PROC_LDP_ENGINE
:
1700 case PROC_LDE_ENGINE
:
1703 kif_redistribute(lif
->ifname
);
1709 /* merge active pseudowires */
1710 RB_FOREACH_SAFE(pw
, l2vpn_pw_head
, &l2vpn
->pw_tree
, ptmp
) {
1711 /* find deleted active pseudowires */
1712 if (l2vpn_pw_find_active(xl
, pw
->ifname
) == NULL
) {
1713 switch (ldpd_process
) {
1714 case PROC_LDE_ENGINE
:
1717 case PROC_LDP_ENGINE
:
1718 ldpe_l2vpn_pw_exit(pw
);
1724 RB_REMOVE(l2vpn_pw_head
, &l2vpn
->pw_tree
, pw
);
1728 RB_FOREACH_SAFE(xp
, l2vpn_pw_head
, &xl
->pw_tree
, ptmp
) {
1729 /* find new active pseudowires */
1730 if ((pw
= l2vpn_pw_find_active(l2vpn
, xp
->ifname
)) == NULL
) {
1732 RB_INSERT(l2vpn_pw_head
, &l2vpn
->pw_tree
, pw
);
1735 switch (ldpd_process
) {
1736 case PROC_LDE_ENGINE
:
1739 case PROC_LDP_ENGINE
:
1740 ldpe_l2vpn_pw_init(pw
);
1743 kif_redistribute(pw
->ifname
);
1749 /* update existing active pseudowire */
1750 if (pw
->af
!= xp
->af
||
1751 ldp_addrcmp(pw
->af
, &pw
->addr
, &xp
->addr
))
1756 /* changes that require a session restart */
1757 if ((pw
->flags
& (F_PW_STATUSTLV_CONF
|F_PW_CWORD_CONF
)) !=
1758 (xp
->flags
& (F_PW_STATUSTLV_CONF
|F_PW_CWORD_CONF
)))
1763 if (l2vpn
->pw_type
!= xl
->pw_type
|| l2vpn
->mtu
!= xl
->mtu
||
1764 pw
->pwid
!= xp
->pwid
|| reinstall_tnbr
|| reset_nbr
||
1765 pw
->lsr_id
.s_addr
!= xp
->lsr_id
.s_addr
)
1766 reinstall_pwfec
= 1;
1768 reinstall_pwfec
= 0;
1770 if (ldpd_process
== PROC_LDP_ENGINE
) {
1772 ldpe_l2vpn_pw_exit(pw
);
1774 nbr
= nbr_find_ldpid(pw
->lsr_id
.s_addr
);
1775 if (nbr
&& nbr
->state
== NBR_STA_OPER
)
1776 session_shutdown(nbr
, S_SHUTDOWN
, 0, 0);
1779 if (ldpd_process
== PROC_LDE_ENGINE
&& reinstall_pwfec
)
1781 pw
->lsr_id
= xp
->lsr_id
;
1783 pw
->addr
= xp
->addr
;
1784 pw
->pwid
= xp
->pwid
;
1785 strlcpy(pw
->ifname
, xp
->ifname
, sizeof(pw
->ifname
));
1786 pw
->ifindex
= xp
->ifindex
;
1787 if (xp
->flags
& F_PW_CWORD_CONF
)
1788 pw
->flags
|= F_PW_CWORD_CONF
;
1790 pw
->flags
&= ~F_PW_CWORD_CONF
;
1791 if (xp
->flags
& F_PW_STATUSTLV_CONF
)
1792 pw
->flags
|= F_PW_STATUSTLV_CONF
;
1794 pw
->flags
&= ~F_PW_STATUSTLV_CONF
;
1795 if (xp
->flags
& F_PW_STATIC_NBR_ADDR
)
1796 pw
->flags
|= F_PW_STATIC_NBR_ADDR
;
1798 pw
->flags
&= ~F_PW_STATIC_NBR_ADDR
;
1799 if (ldpd_process
== PROC_LDP_ENGINE
&& reinstall_tnbr
)
1800 ldpe_l2vpn_pw_init(pw
);
1801 if (ldpd_process
== PROC_LDE_ENGINE
&& reinstall_pwfec
) {
1802 l2vpn
->pw_type
= xl
->pw_type
;
1803 l2vpn
->mtu
= xl
->mtu
;
1805 l2vpn
->pw_type
= previous_pw_type
;
1806 l2vpn
->mtu
= previous_mtu
;
1810 /* merge inactive pseudowires */
1811 RB_FOREACH_SAFE(pw
, l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
, ptmp
) {
1812 /* find deleted inactive pseudowires */
1813 if (l2vpn_pw_find_inactive(xl
, pw
->ifname
) == NULL
) {
1814 RB_REMOVE(l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
, pw
);
1818 RB_FOREACH_SAFE(xp
, l2vpn_pw_head
, &xl
->pw_inactive_tree
, ptmp
) {
1819 /* find new inactive pseudowires */
1820 if ((pw
= l2vpn_pw_find_inactive(l2vpn
, xp
->ifname
)) == NULL
) {
1822 RB_INSERT(l2vpn_pw_head
, &l2vpn
->pw_inactive_tree
, pw
);
1825 switch (ldpd_process
) {
1826 case PROC_LDE_ENGINE
:
1827 case PROC_LDP_ENGINE
:
1830 kif_redistribute(pw
->ifname
);
1836 /* update existing inactive pseudowire */
1837 pw
->lsr_id
.s_addr
= xp
->lsr_id
.s_addr
;
1839 pw
->addr
= xp
->addr
;
1840 pw
->pwid
= xp
->pwid
;
1841 strlcpy(pw
->ifname
, xp
->ifname
, sizeof(pw
->ifname
));
1842 pw
->ifindex
= xp
->ifindex
;
1843 pw
->flags
= xp
->flags
;
1846 l2vpn
->pw_type
= xl
->pw_type
;
1847 l2vpn
->mtu
= xl
->mtu
;
1848 strlcpy(l2vpn
->br_ifname
, xl
->br_ifname
, sizeof(l2vpn
->br_ifname
));
1849 l2vpn
->br_ifindex
= xl
->br_ifindex
;
1853 config_new_empty(void)
1855 struct ldpd_conf
*xconf
;
1857 xconf
= calloc(1, sizeof(*xconf
));
1861 RB_INIT(iface_head
, &xconf
->iface_tree
);
1862 RB_INIT(tnbr_head
, &xconf
->tnbr_tree
);
1863 RB_INIT(nbrp_head
, &xconf
->nbrp_tree
);
1864 RB_INIT(l2vpn_head
, &xconf
->l2vpn_tree
);
1866 /* set default values */
1867 ldp_config_reset(xconf
);
1873 config_clear(struct ldpd_conf
*conf
)
1875 struct ldpd_conf
*xconf
;
1878 * Merge current config with an empty config, this will deactivate
1879 * and deallocate all the interfaces, pseudowires and so on. Before
1880 * merging, copy the router-id and other variables to avoid some
1881 * unnecessary operations, like trying to reset the neighborships.
1883 xconf
= config_new_empty();
1884 xconf
->ipv4
= conf
->ipv4
;
1885 xconf
->ipv6
= conf
->ipv6
;
1886 xconf
->rtr_id
= conf
->rtr_id
;
1887 xconf
->trans_pref
= conf
->trans_pref
;
1888 xconf
->flags
= conf
->flags
;
1889 merge_config(conf
, xconf
);