ports/144054: opnbgpd doesn't announce a host routes
Alexander Zagrebin
alexz at visp.ru
Thu Feb 18 06:30:02 UTC 2010
>Number: 144054
>Category: ports
>Synopsis: opnbgpd doesn't announce a host routes
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Feb 18 06:30:01 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Alexander Zagrebin
>Release: 7.1-RELEASE
>Organization:
>Environment:
FreeBSD xxx.visp.ru 7.1-RELEASE-p4 FreeBSD 7.1-RELEASE-p4 #0: Fri Dec 25 23:06:40 MSK 2009 root at xxx.visp.ru:/usr/src/sys/amd64/compile/KERNEL amd64
>Description:
I have noticed that openbgpd (including the latest openbgpd-4.6.20100215) doesn't announce a host routes.
The reason is in fact that openbgpd doesn't interpret a host routes as "connected".
>How-To-Repeat:
Create point-to-point link:
# ifconfig tun0 create inet 1.2.3.4 5.6.7.8
or add host route
# route add 6.7.8.9 some_gateway
# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
..
5.6.7.8 1.2.3.4 UH 0 0 tun0
6.7.8.9 x.y.z.t UGHS 0 0 vlan20
..
Now use `bgpctl show rib`, `bgpctl show ip bgp out nei gw` etc to see that openbgpd doesn't "see" and doesn't announce a host routes
>Fix:
The attached patch solves the problem.
Patch attached with submission follows:
--- bgpd/kroute.c.orig 2009-12-26 09:03:41.000000000 +0300
+++ bgpd/kroute.c 2009-12-26 09:27:42.000000000 +0300
@@ -2255,8 +2255,10 @@
break;
kr->r.prefixlen =
mask2prefixlen(sa_in->sin_addr.s_addr);
- } else if (rtm->rtm_flags & RTF_HOST)
+ } else if (rtm->rtm_flags & RTF_HOST) {
kr->r.prefixlen = 32;
+ kr->r.flags |= F_CONNECTED;
+ }
else
kr->r.prefixlen =
prefixlen_classful(kr->r.prefix.s_addr);
@@ -2293,8 +2295,10 @@
if (sa_in6->sin6_len == 0)
break;
kr6->r.prefixlen = mask2prefixlen6(sa_in6);
- } else if (rtm->rtm_flags & RTF_HOST)
+ } else if (rtm->rtm_flags & RTF_HOST) {
kr6->r.prefixlen = 128;
+ kr->r.flags |= F_CONNECTED;
+ }
else
fatalx("INET6 route without netmask");
break;
@@ -2560,8 +2564,10 @@
if (sa_in->sin_len != 0)
prefixlen = mask2prefixlen(
sa_in->sin_addr.s_addr);
- } else if (rtm->rtm_flags & RTF_HOST)
+ } else if (rtm->rtm_flags & RTF_HOST) {
prefixlen = 32;
+ flags |= F_CONNECTED;
+ }
else
prefixlen =
prefixlen_classful(prefix.v4.s_addr);
@@ -2573,8 +2579,10 @@
if (sa_in6 != NULL) {
if (sa_in6->sin6_len != 0)
prefixlen = mask2prefixlen6(sa_in6);
- } else if (rtm->rtm_flags & RTF_HOST)
+ } else if (rtm->rtm_flags & RTF_HOST) {
prefixlen = 128;
+ kr->r.flags |= F_CONNECTED;
+ }
else
fatalx("in6 net addr without netmask");
break;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list