Noticed while compling with gcc. In kroute_insert() the check for possible
multipath routes is:
if (krm == NULL)
kr_redistribute(IMSG_NETWORK_ADD, kt, kf);
The problem is krm is only set in the IPv4 path but not in the IPv6 one.
The diff below fixes this by using a new variable multipath which is set
in the case where a multipath route is hit.
--
:wq Claudio
Index: kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
retrieving revision 1.293
diff -u -p -r1.293 kroute.c
--- kroute.c 18 Aug 2022 12:14:00 -0000 1.293
+++ kroute.c 18 Aug 2022 13:22:06 -0000
@@ -1607,6 +1607,7 @@ kroute_insert(struct ktable *kt, struct
struct kroute6 *kr6, *kr6m;
struct knexthop *n;
uint32_t mplslabel = 0;
+ int multipath = 0;
if (kf->prefix.aid == AID_VPN_IPv4 ||
kf->prefix.aid == AID_VPN_IPv6) {
@@ -1648,6 +1649,7 @@ kroute_insert(struct ktable *kt, struct
while (krm->next != NULL)
krm = krm->next;
krm->next = kr;
+ multipath = 1;
}
if (kf->flags & F_BGPD)
@@ -1684,6 +1686,7 @@ kroute_insert(struct ktable *kt, struct
while (kr6m->next != NULL)
kr6m = kr6m->next;
kr6m->next = kr6;
+ multipath = 1;
}
if (kf->flags & F_BGPD)
@@ -1699,8 +1702,8 @@ kroute_insert(struct ktable *kt, struct
kf->prefixlen) == 0)
knexthop_validate(kt, n);
- if (krm == NULL)
- /* redistribute multipath routes only once */
+ /* redistribute multipath routes only once */
+ if (!multipath)
kr_redistribute(IMSG_NETWORK_ADD, kt, kf);
}