diff options
Diffstat (limited to 'usr.sbin/ldpd')
-rw-r--r-- | usr.sbin/ldpd/kroute.c | 17 | ||||
-rw-r--r-- | usr.sbin/ldpd/lde.c | 21 | ||||
-rw-r--r-- | usr.sbin/ldpd/lde.h | 3 | ||||
-rw-r--r-- | usr.sbin/ldpd/lde_lib.c | 35 | ||||
-rw-r--r-- | usr.sbin/ldpd/ldpd.h | 3 |
5 files changed, 49 insertions, 30 deletions
diff --git a/usr.sbin/ldpd/kroute.c b/usr.sbin/ldpd/kroute.c index 0e8b50be5f1..2c20f48e54e 100644 --- a/usr.sbin/ldpd/kroute.c +++ b/usr.sbin/ldpd/kroute.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kroute.c,v 1.4 2009/08/06 09:07:49 michele Exp $ */ +/* $OpenBSD: kroute.c,v 1.5 2009/09/28 09:48:46 michele Exp $ */ /* * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org> @@ -412,7 +412,7 @@ kr_redist_remove(struct kroute_node *kn) rr.kr = kn->r; if (kn == NULL) { - main_imsg_compose_lde(IMSG_NETWORK_DEL, 0, &rr, + main_imsg_compose_lde(IMSG_NETWORK_DEL, 0, &rr.kr, sizeof(struct rroute)); } } @@ -484,7 +484,7 @@ kr_redistribute(struct kroute_node *kh) sizeof(struct rroute)); } else { rr.kr = kh->r; - main_imsg_compose_lde(IMSG_NETWORK_DEL, 0, &rr, + main_imsg_compose_lde(IMSG_NETWORK_DEL, 0, &rr.kr, sizeof(struct rroute)); } } @@ -1530,14 +1530,15 @@ dispatch_rtmsg(void) continue; if (!(kr->r.flags & F_KERNEL)) continue; - /* - * last route is getting removed request the - * ldp route from the RDE to insert instead - */ + if (kr->r.flags & F_LDPD_INSERTED) { - main_imsg_compose_lde(IMSG_KROUTE_GET, 0, + main_imsg_compose_lde(IMSG_NETWORK_DEL, 0, &kr->r, sizeof(struct kroute)); + + send_rtlabelmsg(kr_state.fd, RTM_DELETE, + &kr->r, AF_MPLS); } + if (kroute_remove(kr) == -1) return (-1); break; diff --git a/usr.sbin/ldpd/lde.c b/usr.sbin/ldpd/lde.c index f9756334754..521d7076356 100644 --- a/usr.sbin/ldpd/lde.c +++ b/usr.sbin/ldpd/lde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: lde.c,v 1.5 2009/08/01 13:30:55 michele Exp $ */ +/* $OpenBSD: lde.c,v 1.6 2009/09/28 09:48:46 michele Exp $ */ /* * Copyright (c) 2004, 2005 Claudio Jeker <claudio@openbsd.org> @@ -385,15 +385,6 @@ lde_dispatch_parent(int fd, short event, void *bula) break; case IMSG_NETWORK_DEL: - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(rr)) { - log_warnx("lde_dispatch_parent: " - "wrong imsg len"); - break; - } - memcpy(&rr, imsg.data, sizeof(rr)); - - break; - case IMSG_KROUTE_GET: if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(kr)) { log_warnx("lde_dispatch_parent: " "wrong imsg len"); @@ -401,14 +392,8 @@ lde_dispatch_parent(int fd, short event, void *bula) } memcpy(&kr, imsg.data, sizeof(kr)); -/* if ((rn = rt_find(kr.prefix.s_addr, kr.prefixlen, - DT_NET)) != NULL) - lde_send_change_kroute(rn); - else*/ - /* should not happen */ - imsg_compose_event(iev_main, - IMSG_KLABEL_DELETE, 0, - 0, -1, &kr, sizeof(kr)); + lde_kernel_remove(&kr); + break; case IMSG_RECONF_CONF: if ((nconf = malloc(sizeof(struct ldpd_conf))) == diff --git a/usr.sbin/ldpd/lde.h b/usr.sbin/ldpd/lde.h index a338ee9d33c..e93079bd4eb 100644 --- a/usr.sbin/ldpd/lde.h +++ b/usr.sbin/ldpd/lde.h @@ -1,4 +1,4 @@ -/* $OpenBSD: lde.h,v 1.4 2009/07/08 18:59:29 michele Exp $ */ +/* $OpenBSD: lde.h,v 1.5 2009/09/28 09:48:46 michele Exp $ */ /* * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org> @@ -123,6 +123,7 @@ void route_start_garbage(struct rt_node *); void rt_dump(pid_t); void rt_snap(u_int32_t); void lde_kernel_insert(struct kroute *); +void lde_kernel_remove(struct kroute *); void lde_check_mapping(struct map *, struct lde_nbr *); void lde_check_request(struct map *, struct lde_nbr *); diff --git a/usr.sbin/ldpd/lde_lib.c b/usr.sbin/ldpd/lde_lib.c index cb9bfaf0d93..a6022a83dd5 100644 --- a/usr.sbin/ldpd/lde_lib.c +++ b/usr.sbin/ldpd/lde_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: lde_lib.c,v 1.5 2009/08/02 16:19:17 michele Exp $ */ +/* $OpenBSD: lde_lib.c,v 1.6 2009/09/28 09:48:46 michele Exp $ */ /* * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org> @@ -253,6 +253,39 @@ lde_kernel_insert(struct kroute *kr) } void +lde_kernel_remove(struct kroute *kr) +{ + struct rt_node *rn; + struct rt_label *rl; + struct lde_nbr *ln; + + rn = rt_find(kr->prefix.s_addr, kr->prefixlen); + if (rn == NULL) + return; + + if (ldeconf->mode & MODE_RET_LIBERAL) { + rl = calloc(1, sizeof(*rl)); + if (rl == NULL) + fatal("lde_kernel_remove"); + + rl->label = rn->remote_label; + + ln = lde_find_address(rn->nexthop); + if (ln == NULL) + fatalx("lde_kernel_remove: unable to find neighbor"); + + rl->nexthop = ln; + + TAILQ_INSERT_TAIL(&rn->labels_list, rl, entry); + } + + /* XXX */ + rn->remote_label = 0; + rn->nexthop.s_addr = INADDR_ANY; + rn->present = 0; +} + +void lde_check_mapping(struct map *map, struct lde_nbr *ln) { struct rt_node *rn; diff --git a/usr.sbin/ldpd/ldpd.h b/usr.sbin/ldpd/ldpd.h index a11a559e420..3f8eb00f3ce 100644 --- a/usr.sbin/ldpd/ldpd.h +++ b/usr.sbin/ldpd/ldpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpd.h,v 1.6 2009/08/02 16:19:17 michele Exp $ */ +/* $OpenBSD: ldpd.h,v 1.7 2009/09/28 09:48:46 michele Exp $ */ /* * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org> @@ -80,7 +80,6 @@ enum imsg_type { IMSG_KLABEL_INSERT, IMSG_KLABEL_CHANGE, IMSG_KLABEL_DELETE, - IMSG_KROUTE_GET, IMSG_IFINFO, IMSG_LABEL_MAPPING, IMSG_LABEL_MAPPING_FULL, |