summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ospfd/rde.c
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2007-09-25 11:25:41 +0000
committerclaudio <claudio@openbsd.org>2007-09-25 11:25:41 +0000
commitd5218eb1a4d7850a20df5caf1bb471563423c68e (patch)
tree0770c7905fa7b48dd27efaa5706014ae2e17631d /usr.sbin/ospfd/rde.c
parenthandle empty strings returned by fgets (diff)
downloadwireguard-openbsd-d5218eb1a4d7850a20df5caf1bb471563423c68e.tar.xz
wireguard-openbsd-d5218eb1a4d7850a20df5caf1bb471563423c68e.zip
Last missing piece in the equal cost multipath support for ospfd.
Send all possible nexthops to the parent process and correctly sync the RIB, FIB and kernel routing table. Based on initial work by pyr@. OK pyr@ norby@ PS: don't forget that you need to enable multipath support via a sysctl
Diffstat (limited to 'usr.sbin/ospfd/rde.c')
-rw-r--r--usr.sbin/ospfd/rde.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/usr.sbin/ospfd/rde.c b/usr.sbin/ospfd/rde.c
index 7949a087d12..35426f5b7b9 100644
--- a/usr.sbin/ospfd/rde.c
+++ b/usr.sbin/ospfd/rde.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.c,v 1.69 2007/07/25 19:11:27 claudio Exp $ */
+/* $OpenBSD: rde.c,v 1.70 2007/09/25 11:25:41 claudio Exp $ */
/*
* Copyright (c) 2004, 2005 Claudio Jeker <claudio@openbsd.org>
@@ -717,23 +717,31 @@ rde_router_id(void)
void
rde_send_change_kroute(struct rt_node *r)
{
+ int krcount = 0;
struct kroute kr;
struct rt_nexthop *rn;
+ struct buf *wbuf;
+
+ if ((wbuf = imsg_create(ibuf_main, IMSG_KROUTE_CHANGE, 0, 0,
+ sizeof(kr))) == NULL) {
+ return;
+ }
TAILQ_FOREACH(rn, &r->nexthop, entry) {
- if (!rn->invalid)
- break;
+ if (rn->invalid)
+ continue;
+ krcount++;
+
+ bzero(&kr, sizeof(kr));
+ kr.prefix.s_addr = r->prefix.s_addr;
+ kr.nexthop.s_addr = rn->nexthop.s_addr;
+ kr.prefixlen = r->prefixlen;
+ kr.ext_tag = r->ext_tag;
+ imsg_add(wbuf, &kr, sizeof(kr));
}
- if (!rn)
+ if (krcount == 0)
fatalx("rde_send_change_kroute: no valid nexthop found");
-
- bzero(&kr, sizeof(kr));
- kr.prefix.s_addr = r->prefix.s_addr;
- kr.nexthop.s_addr = rn->nexthop.s_addr;
- kr.prefixlen = r->prefixlen;
- kr.ext_tag = r->ext_tag;
-
- imsg_compose(ibuf_main, IMSG_KROUTE_CHANGE, 0, 0, &kr, sizeof(kr));
+ imsg_close(ibuf_main, wbuf);
}
void