summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmanuel Haupt <ehaupt@FreeBSD.org>2008-11-27 20:54:31 +0000
committerEmanuel Haupt <ehaupt@FreeBSD.org>2008-11-27 20:54:31 +0000
commit86cd9787064088334776af097c8b2fd2e5ec3f22 (patch)
tree7d57c9e24a6d3e72bfe293e3d3edab07b1bfc540
parentUpdate to the 20081126 snapshot of GCC 4.2.5. Mostly assorted bugfixes (diff)
Update to 4.2
PR: 120788 Submitted by: Eygene Ryabinkin <rea-fbsd@codelabs.ru> Tested by: Doichin Dokov <root@net1.cc> Approved by: maintainer timeout
Notes
Notes: svn path=/head/; revision=223467
-rw-r--r--net/openospfd/Makefile3
-rw-r--r--net/openospfd/distinfo6
-rw-r--r--net/openospfd/files/patch-ospfctl_parser.c4
-rw-r--r--net/openospfd/files/patch-ospfctl_parser.h19
-rw-r--r--net/openospfd/files/patch-ospfd_carp.c22
-rw-r--r--net/openospfd/files/patch-ospfd_kroute.c138
-rw-r--r--net/openospfd/files/patch-ospfd_ospfd.c27
-rw-r--r--net/openospfd/files/patch-ospfd_ospfd.h13
-rw-r--r--net/openospfd/files/patch-ospfd_packet.c23
-rw-r--r--net/openospfd/files/patch-ospfd_parse.y42
-rw-r--r--net/openospfd/files/patch-ospfd_rde_spf.c133
11 files changed, 393 insertions, 37 deletions
diff --git a/net/openospfd/Makefile b/net/openospfd/Makefile
index f484cba538eb..1d047ed39216 100644
--- a/net/openospfd/Makefile
+++ b/net/openospfd/Makefile
@@ -6,8 +6,7 @@
#
PORTNAME= openospfd
-PORTVERSION= 4.0
-PORTREVISION= 3
+PORTVERSION= 4.2
CATEGORIES= net
MASTER_SITES= ftp://ftp.dkuug.dk/pub/OpenBSD/OpenBGPD/:openbsd \
${MASTER_SITE_LOCAL:S/$/:freebsd/g}
diff --git a/net/openospfd/distinfo b/net/openospfd/distinfo
index 84810c858037..870d6441b170 100644
--- a/net/openospfd/distinfo
+++ b/net/openospfd/distinfo
@@ -1,6 +1,6 @@
-MD5 (openospfd/openospfd-4.0.tgz) = 6dcf9170627120f009ff9d5917b49376
-SHA256 (openospfd/openospfd-4.0.tgz) = c9e87e849664a6674a4a650a453754b53d6c0bd1110ee5e82a7b6cc7fbad6ee7
-SIZE (openospfd/openospfd-4.0.tgz) = 84459
+MD5 (openospfd/openospfd-4.2.tgz) = ac919e4883105b28a846106e7c60bb80
+SHA256 (openospfd/openospfd-4.2.tgz) = 896a9e29447d7da46a1c7c1717e1527b3770425840e8f0180419ec313d3d7b00
+SIZE (openospfd/openospfd-4.2.tgz) = 93661
MD5 (openospfd/if_media.h) = 4ff9297f5c133425dafe3ca565c0f811
SHA256 (openospfd/if_media.h) = 58225d0ed363c2beb23426f0f8254089d4541c3334776f3750ba434d4491a1d1
SIZE (openospfd/if_media.h) = 23762
diff --git a/net/openospfd/files/patch-ospfctl_parser.c b/net/openospfd/files/patch-ospfctl_parser.c
index c4f7fc886d01..ad85723e6850 100644
--- a/net/openospfd/files/patch-ospfctl_parser.c
+++ b/net/openospfd/files/patch-ospfctl_parser.c
@@ -1,5 +1,5 @@
---- ospfctl/parser.c.orig Fri Jul 27 15:11:46 2007
-+++ ospfctl/parser.c Fri Jul 27 15:12:01 2007
+--- ospfctl/parser.c.orig 2008-02-07 19:13:50.000000000 +0300
++++ ospfctl/parser.c 2008-02-07 19:15:47.000000000 +0300
@@ -32,23 +32,6 @@
#include "parser.h"
diff --git a/net/openospfd/files/patch-ospfctl_parser.h b/net/openospfd/files/patch-ospfctl_parser.h
index b4eab4960d00..677bee2809f2 100644
--- a/net/openospfd/files/patch-ospfctl_parser.h
+++ b/net/openospfd/files/patch-ospfctl_parser.h
@@ -1,6 +1,6 @@
---- ospfctl/parser.h.orig Fri Jul 27 15:11:55 2007
-+++ ospfctl/parser.h Fri Jul 27 15:12:01 2007
-@@ -50,6 +50,23 @@
+--- ospfctl/parser.h.orig 2008-02-07 19:12:58.000000000 +0300
++++ ospfctl/parser.h 2008-02-07 19:15:45.000000000 +0300
+@@ -50,6 +50,16 @@
RELOAD
};
@@ -14,6 +14,13 @@
+ IFNAME
+};
+
+ struct parse_result {
+ struct in_addr addr;
+ char ifname[IF_NAMESIZE];
+@@ -58,6 +68,13 @@
+ u_int8_t prefixlen;
+ };
+
+struct token {
+ enum token_type type;
+ const char *keyword;
@@ -21,6 +28,6 @@
+ const struct token *next;
+};
+
- struct parse_result {
- struct in_addr addr;
- char ifname[IF_NAMESIZE];
+ struct parse_result *parse(int, char *[]);
+ const struct token *match_token(const char *, const struct token []);
+ void show_valid_args(const struct token []);
diff --git a/net/openospfd/files/patch-ospfd_carp.c b/net/openospfd/files/patch-ospfd_carp.c
new file mode 100644
index 000000000000..798643bf5cfc
--- /dev/null
+++ b/net/openospfd/files/patch-ospfd_carp.c
@@ -0,0 +1,22 @@
+--- ospfd/carp.c.orig 2008-02-07 18:26:32.000000000 +0300
++++ ospfd/carp.c 2008-02-07 18:39:58.000000000 +0300
+@@ -29,6 +29,13 @@
+ #include "ospfd.h"
+ #include "log.h"
+
++#if defined(__FreeBSD__) /* XXX: FreeBSD has no CARP demotion support */
++
++#warning "CARP demotion is not supported for FreeBSD."
++#warning "Demotion code is disconnected from the build."
++
++#else
++
+ struct carpgroup {
+ TAILQ_ENTRY(carpgroup) entry;
+ char *group;
+@@ -179,3 +186,5 @@
+ close(s);
+ return (res);
+ }
++
++#endif /* defined(__FreeBSD__) */
diff --git a/net/openospfd/files/patch-ospfd_kroute.c b/net/openospfd/files/patch-ospfd_kroute.c
index 6415a3b80316..2b1bd77f96eb 100644
--- a/net/openospfd/files/patch-ospfd_kroute.c
+++ b/net/openospfd/files/patch-ospfd_kroute.c
@@ -1,36 +1,136 @@
---- ospfd/kroute.c.orig Mon Nov 20 14:41:22 2006
-+++ ospfd/kroute.c Mon Nov 20 14:42:17 2006
-@@ -875,10 +875,6 @@
+--- ospfd/kroute.c.orig 2008-02-07 18:58:38.000000000 +0300
++++ ospfd/kroute.c 2008-02-07 19:09:58.000000000 +0300
+@@ -955,9 +955,11 @@
+ struct sockaddr_in prefix;
+ struct sockaddr_in nexthop;
+ struct sockaddr_in mask;
++#if !defined(__FreeBSD__)
+ struct sockaddr_rtlabel sa_rl;
+- int iovcnt = 0;
+ const char *label;
++#endif /* !defined(__FreeBSD__) */
++ int iovcnt = 0;
+
+ if (kr_state.fib_sync == 0)
+ return (0);
+@@ -1011,6 +1013,7 @@
+ iov[iovcnt].iov_base = &mask;
+ iov[iovcnt++].iov_len = sizeof(mask);
+
++#if !defined(__FreeBSD__) /* FreeBSD has no route labeling. */
+ if (kroute->rtlabel != 0) {
+ sa_rl.sr_len = sizeof(sa_rl);
+ sa_rl.sr_family = AF_UNSPEC;
+@@ -1027,6 +1030,7 @@
+ iov[iovcnt].iov_base = &sa_rl;
+ iov[iovcnt++].iov_len = sizeof(sa_rl);
+ }
++#endif /* !defined(__FreeBSD__) */
+
+
+ retry:
+@@ -1069,7 +1073,9 @@
+ struct rt_msghdr *rtm;
+ struct sockaddr *sa, *rti_info[RTAX_MAX];
+ struct sockaddr_in *sa_in;
++#if !defined(__FreeBSD__)
+ struct sockaddr_rtlabel *label;
++#endif
+ struct kroute_node *kr;
+
+ mib[0] = CTL_NET;
+@@ -1078,9 +1084,13 @@
+ mib[3] = AF_INET;
+ mib[4] = NET_RT_DUMP;
+ mib[5] = 0;
++#if !defined(__FreeBSD__) /* FreeBSD has no multiple routing tables */
+ mib[6] = 0; /* rtableid */
+
+ if (sysctl(mib, 7, NULL, &len, NULL, 0) == -1) {
++#else
++ if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1) {
++#endif /* !defined(__FreeBSD__) */
+ log_warn("sysctl");
+ return (-1);
+ }
+@@ -1098,7 +1098,11 @@
+ log_warn("fetchtable");
+ return (-1);
+ }
++#if !defined(__FreeBSD__) /* FreeBSD has no multiple routing tables */
+ if (sysctl(mib, 7, buf, &len, NULL, 0) == -1) {
++#else
++ if (sysctl(mib, 6, buf, &len, NULL, 0) == -1) {
++#endif /* !defined(__FreeBSD__) */
+ log_warn("sysctl");
+ free(buf);
+ return (-1);
+@@ -1157,6 +1163,7 @@
send_rtmsg(kr_state.fd, RTM_DELETE, &kr->r);
free(kr);
} else {
-- if ((label = (struct sockaddr_rtlabel *)
-- rti_info[RTAX_LABEL]) != NULL)
-- kr->r.rtlabel =
-- rtlabel_name2id(label->sr_label);
++#if !defined(__FreeBSD__) /* FreeBSD has no route labeling. */
+ if ((label = (struct sockaddr_rtlabel *)
+ rti_info[RTAX_LABEL]) != NULL) {
+ kr->r.rtlabel =
+@@ -1164,6 +1171,7 @@
+ kr->r.ext_tag =
+ rtlabel_id2tag(kr->r.rtlabel);
+ }
++#endif /* !defined(__FreeBSD__) */
kroute_insert(kr);
}
-@@ -1075,10 +1071,6 @@
+@@ -1257,7 +1265,9 @@
+ struct ifa_msghdr *ifam;
+ struct sockaddr *sa, *rti_info[RTAX_MAX];
+ struct sockaddr_in *sa_in;
++#if !defined(__FreeBSD__)
+ struct sockaddr_rtlabel *label;
++#endif /* !defined(__FreeBSD__) */
+ struct kroute_node *kr, *okr;
+ struct in_addr prefix, nexthop;
+ u_int8_t prefixlen;
+@@ -1289,8 +1299,10 @@
+ sa = (struct sockaddr *)(rtm + 1);
+ get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
++#if !defined(__FreeBSD__) /* XXX: FreeBSD has no multiple routing tables */
+ if (rtm->rtm_tableid != 0)
+ continue;
++#endif
+
+ if (rtm->rtm_pid == kr_state.pid) /* caused by us */
+ continue;
+@@ -1385,6 +1397,7 @@
rtlabel_unref(kr->r.rtlabel);
kr->r.rtlabel = 0;
-- if ((label = (struct sockaddr_rtlabel *)
-- rti_info[RTAX_LABEL]) != NULL)
-- kr->r.rtlabel =
-- rtlabel_name2id(label->sr_label);
+ kr->r.ext_tag = 0;
++#if !defined(__FreeBSD__) /* FreeBSD has no route labeling. */
+ if ((label = (struct sockaddr_rtlabel *)
+ rti_info[RTAX_LABEL]) != NULL) {
+ kr->r.rtlabel =
+@@ -1392,6 +1405,7 @@
+ kr->r.ext_tag =
+ rtlabel_id2tag(kr->r.rtlabel);
+ }
++#endif /* !defined(__FreeBSD__) */
if (kif_validate(kr->r.ifindex))
kr->r.flags &= ~F_DOWN;
-@@ -1098,11 +1090,6 @@
- kr->r.nexthop.s_addr = nexthop.s_addr;
+@@ -1413,6 +1427,7 @@
kr->r.flags = flags;
kr->r.ifindex = ifindex;
--
-- if ((label = (struct sockaddr_rtlabel *)
-- rti_info[RTAX_LABEL]) != NULL)
-- kr->r.rtlabel =
-- rtlabel_name2id(label->sr_label);
+
++#if !defined(__FreeBSD__) /* FreeBSD has no route labeling */
+ if ((label = (struct sockaddr_rtlabel *)
+ rti_info[RTAX_LABEL]) != NULL) {
+ kr->r.rtlabel =
+@@ -1420,6 +1435,7 @@
+ kr->r.ext_tag =
+ rtlabel_id2tag(kr->r.rtlabel);
+ }
++#endif /* !defined(__FreeBSD__) */
kroute_insert(kr);
}
diff --git a/net/openospfd/files/patch-ospfd_ospfd.c b/net/openospfd/files/patch-ospfd_ospfd.c
new file mode 100644
index 000000000000..419eb4f77c37
--- /dev/null
+++ b/net/openospfd/files/patch-ospfd_ospfd.c
@@ -0,0 +1,27 @@
+--- ospfd/ospfd.c.orig 2008-02-07 18:31:27.000000000 +0300
++++ ospfd/ospfd.c 2008-02-07 18:41:46.000000000 +0300
+@@ -300,7 +300,9 @@
+
+ control_cleanup();
+ kr_shutdown();
++#if !defined(__FreeBSD__) /* XXX: FreeBSD has no carp demotion. */
+ carp_demote_shutdown();
++#endif /* defined(__FreeBSD__) */
+
+ do {
+ if ((pid = wait(NULL)) == -1 &&
+@@ -398,10 +400,14 @@
+ log_warnx("IFINFO request with wrong len");
+ break;
+ case IMSG_DEMOTE:
++#if !defined(__FreeBSD__) /* XXX: FreeBSD has no carp demotion support. */
+ if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(dmsg))
+ fatalx("invalid size of OE request");
+ memcpy(&dmsg, imsg.data, sizeof(dmsg));
+ carp_demote_set(dmsg.demote_group, dmsg.level);
++#else
++ log_debug("main_dispatch_ospfe: no carp demotion support for FreeBSD");
++#endif /* defined(__FreeBSD__) */
+ break;
+ default:
+ log_debug("main_dispatch_ospfe: error handling imsg %d",
diff --git a/net/openospfd/files/patch-ospfd_ospfd.h b/net/openospfd/files/patch-ospfd_ospfd.h
new file mode 100644
index 000000000000..bcd1f6d85eff
--- /dev/null
+++ b/net/openospfd/files/patch-ospfd_ospfd.h
@@ -0,0 +1,13 @@
+--- ospfd/ospfd.h.orig 2008-02-07 18:57:03.000000000 +0300
++++ ospfd/ospfd.h 2008-02-07 18:56:54.000000000 +0300
+@@ -320,6 +320,10 @@
+ TAILQ_HEAD(lsa_head, lsa_entry);
+ TAILQ_HEAD(auth_md_head, auth_md);
+
++#if defined(__FreeBSD__) /* FreeBSD has no LINK_STATE_IS_UP macro. */
++#define LINK_STATE_IS_UP(_s) ((_s) >= LINK_STATE_UP)
++#endif /* defined(__FreeBSD__) */
++
+ struct iface {
+ LIST_ENTRY(iface) entry;
+ struct event hello_timer;
diff --git a/net/openospfd/files/patch-ospfd_packet.c b/net/openospfd/files/patch-ospfd_packet.c
index 414554a9a169..cceb30283f86 100644
--- a/net/openospfd/files/patch-ospfd_packet.c
+++ b/net/openospfd/files/patch-ospfd_packet.c
@@ -1,6 +1,6 @@
---- ospfd/packet.c.orig 9 Mar 2006 13:31:57 -0000 1.20
-+++ ospfd/packet.c 16 Mar 2006 18:21:38 -0000
-@@ -34,7 +34,7 @@
+--- ospfd/packet.c.orig 2006-11-17 11:55:31.000000000 +0300
++++ ospfd/packet.c 2008-02-13 22:13:04.000000000 +0300
+@@ -36,7 +36,7 @@
#include "log.h"
#include "ospfe.h"
@@ -8,8 +8,21 @@
+int ip_hdr_sanity_check(struct ip *, u_int16_t);
int ospf_hdr_sanity_check(const struct ip *,
struct ospf_hdr *, u_int16_t, const struct iface *);
- struct iface *find_iface(struct ospfd_conf *, struct in_addr);
-@@ -196,8 +196,13 @@ recv_packet(int fd, short event, void *b
+ struct iface *find_iface(struct ospfd_conf *, unsigned int, struct in_addr);
+@@ -70,7 +70,12 @@
+ ip_hdr.ip_v = IPVERSION;
+ ip_hdr.ip_hl = sizeof(ip_hdr) >> 2;
+ ip_hdr.ip_tos = IPTOS_PREC_INTERNETCONTROL;
++#if defined(__FreeBSD__) || defined(__NetBSD__)
++ /* FreeBSD/NetBSD wants the length in the native host byte order. */
++ ip_hdr.ip_len = len + sizeof(ip_hdr);
++#else
+ ip_hdr.ip_len = htons(len + sizeof(ip_hdr));
++#endif
+ ip_hdr.ip_id = 0; /* 0 means kernel set appropriate value */
+ ip_hdr.ip_off = 0;
+ ip_hdr.ip_ttl = iface->type != IF_TYPE_VIRTUALLINK ?
+@@ -248,8 +253,13 @@
}
int
diff --git a/net/openospfd/files/patch-ospfd_parse.y b/net/openospfd/files/patch-ospfd_parse.y
new file mode 100644
index 000000000000..7023a9d35ded
--- /dev/null
+++ b/net/openospfd/files/patch-ospfd_parse.y
@@ -0,0 +1,42 @@
+--- ospfd/parse.y.orig 2008-02-07 18:34:22.000000000 +0300
++++ ospfd/parse.y 2008-02-07 18:37:46.000000000 +0300
+@@ -485,6 +485,11 @@
+
+ areaoptsl : interface
+ | DEMOTE STRING demotecount {
++#ifdef __FreeBSD__ /* XXX: FreeBSD has no carp demotion support. */
++ yyerror("FreeBSD has no CARP demotion support");
++ free($2);
++ YYERROR;
++#else
+ if ($3 > 255) {
+ yyerror("demote count too big: max 255");
+ free($2);
+@@ -505,6 +510,7 @@
+ area->demote_group);
+ YYERROR;
+ }
++#endif
+ }
+ | defaults
+ ;
+@@ -581,6 +587,11 @@
+
+ interfaceoptsl : PASSIVE { iface->passive = 1; }
+ | DEMOTE STRING {
++#ifdef __FreeBSD__ /* XXX: FreeBSD has no carp demotion support */
++ yyerror("FreeBSD has no CARP demotion support");
++ free($2);
++ YYERROR;
++#else
+ if (strlcpy(iface->demote_group, $2,
+ sizeof(iface->demote_group)) >=
+ sizeof(iface->demote_group)) {
+@@ -595,6 +606,7 @@
+ iface->demote_group);
+ YYERROR;
+ }
++#endif
+ }
+ | defaults
+ ;
diff --git a/net/openospfd/files/patch-ospfd_rde_spf.c b/net/openospfd/files/patch-ospfd_rde_spf.c
new file mode 100644
index 000000000000..e0391f3fb88b
--- /dev/null
+++ b/net/openospfd/files/patch-ospfd_rde_spf.c
@@ -0,0 +1,133 @@
+--- ospfd/rde_spf.c 2007/08/06 11:32:34 1.63
++++ ospfd/rde_spf.c 2007/09/16 15:00:11 1.64
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: rde_spf.c,v 1.63 2007/08/06 11:32:34 claudio Exp $ */
++/* $OpenBSD: rde_spf.c,v 1.64 2007/09/16 15:00:11 claudio Exp $ */
+
+ /*
+ * Copyright (c) 2005 Esben Norby <norby@openbsd.org>
+@@ -37,7 +37,8 @@
+
+ void calc_nexthop_clear(struct vertex *);
+ void calc_nexthop_add(struct vertex *, struct vertex *, u_int32_t);
+-void calc_nexthop(struct vertex *, struct vertex *);
++void calc_nexthop(struct vertex *, struct vertex *,
++ struct area *, struct lsa_rtr_link *);
+ void rt_nexthop_clear(struct rt_node *);
+ void rt_nexthop_add(struct rt_node *, struct v_nexthead *,
+ struct in_addr);
+@@ -134,7 +135,7 @@
+ if (d < w->cost) {
+ w->cost = d;
+ calc_nexthop_clear(w);
+- calc_nexthop(w, v);
++ calc_nexthop(w, v, area, rtr_link);
+ /*
+ * need to readd to candidate list
+ * because the list is sorted
+@@ -143,12 +144,12 @@
+ cand_list_add(w);
+ } else
+ /* equal cost path */
+- calc_nexthop(w, v);
++ calc_nexthop(w, v, area, rtr_link);
+ } else if (w->cost == LS_INFINITY && d < LS_INFINITY) {
+ w->cost = d;
+
+ calc_nexthop_clear(w);
+- calc_nexthop(w, v);
++ calc_nexthop(w, v, area, rtr_link);
+ cand_list_add(w);
+ }
+ }
+@@ -384,54 +385,51 @@
+ }
+
+ void
+-calc_nexthop(struct vertex *dst, struct vertex *parent)
++calc_nexthop(struct vertex *dst, struct vertex *parent,
++ struct area *area, struct lsa_rtr_link *rtr_link)
+ {
+- struct lsa_rtr_link *rtr_link = NULL;
+ struct v_nexthop *vn;
++ struct iface *iface;
+ int i;
+
+ /* case 1 */
+ if (parent == spf_root) {
+ switch (dst->type) {
+ case LSA_TYPE_ROUTER:
+- for (i = 0; i < lsa_num_links(dst); i++) {
+- rtr_link = get_rtr_link(dst, i);
+- if (rtr_link->type == LINK_TYPE_POINTTOPOINT &&
+- ntohl(rtr_link->id) == parent->ls_id) {
++ if (rtr_link->type != LINK_TYPE_POINTTOPOINT)
++ fatalx("inconsistent SPF tree");
++ LIST_FOREACH(iface, &area->iface_list, entry) {
++ if (rtr_link->data == iface->addr.s_addr) {
+ calc_nexthop_add(dst, parent,
+- rtr_link->data);
+- break;
++ iface->dst.s_addr);
++ return;
+ }
+ }
+- return;
++ fatalx("no interface found for interface");
+ case LSA_TYPE_NETWORK:
+- for (i = 0; i < lsa_num_links(parent); i++) {
+- rtr_link = get_rtr_link(parent, i);
+- switch (rtr_link->type) {
+- case LINK_TYPE_POINTTOPOINT:
+- /* ignore */
+- break;
+- case LINK_TYPE_TRANSIT_NET:
+- if ((htonl(dst->ls_id) &
+- dst->lsa->data.net.mask) ==
+- (rtr_link->data &
+- dst->lsa->data.net.mask)) {
+- calc_nexthop_add(dst, parent,
+- rtr_link->data);
+- }
+- break;
+- case LINK_TYPE_STUB_NET:
+- break;
+-
+- default:
+- fatalx("calc_nexthop: invalid link "
+- "type");
++ switch (rtr_link->type) {
++ case LINK_TYPE_POINTTOPOINT:
++ case LINK_TYPE_STUB_NET:
++ /* ignore */
++ break;
++ case LINK_TYPE_TRANSIT_NET:
++ if ((htonl(dst->ls_id) &
++ dst->lsa->data.net.mask) ==
++ (rtr_link->data &
++ dst->lsa->data.net.mask)) {
++ calc_nexthop_add(dst, parent,
++ rtr_link->data);
+ }
++ break;
++ default:
++ fatalx("calc_nexthop: invalid link "
++ "type");
+ }
+ return;
+ default:
+ fatalx("calc_nexthop: invalid dst type");
+ }
++ return;
+ }
+
+ /* case 2 */
+@@ -459,7 +457,7 @@
+
+ /* case 3 */
+ TAILQ_FOREACH(vn, &parent->nexthop, entry)
+- calc_nexthop_add(dst, parent, vn->nexthop.s_addr);
++ calc_nexthop_add(dst, parent, vn->nexthop.s_addr);
+ }
+
+ /* candidate list */