Merge pull request #384 from donaldsharp/dr2

Add source of route as protocol string in ip route pushed into kernel
This commit is contained in:
Martin Winter 2017-04-26 16:24:48 -07:00 committed by GitHub
commit 77e17a6ae5
7 changed files with 75 additions and 4 deletions

1
debian/frr.dirs vendored
View File

@ -1,5 +1,6 @@
etc/logrotate.d/ etc/logrotate.d/
etc/frr/ etc/frr/
etc/iproute2/rt_protos.d/
usr/share/doc/frr/ usr/share/doc/frr/
usr/share/doc/frr/examples/ usr/share/doc/frr/examples/
usr/share/lintian/overrides/ usr/share/lintian/overrides/

1
debian/frr.install vendored
View File

@ -18,5 +18,6 @@ usr/share/man/man8/isisd.8
usr/share/man/man8/watchfrr.8 usr/share/man/man8/watchfrr.8
usr/share/snmp/mibs/ usr/share/snmp/mibs/
cumulus/etc/* etc/ cumulus/etc/* etc/
tools/etc/* etc/
tools/*.service lib/systemd/system tools/*.service lib/systemd/system
debian/frr.conf usr/lib/tmpfiles.d debian/frr.conf usr/lib/tmpfiles.d

View File

@ -0,0 +1,8 @@
# Additional protocol strings defined by frr for each of its daemons
186 bgp
187 isis
188 ospf
189 rip
190 ripng
191 static

View File

@ -532,8 +532,15 @@ case "$1" in
fi fi
if [ -z "$dmn" -o "$dmn" = "zebra" ]; then if [ -z "$dmn" -o "$dmn" = "zebra" ]; then
echo "Removing all routes made by zebra." echo "Removing all routes made by FRR."
ip route flush proto bgp
ip route flush proto ospf
ip route flush proto static
ip route flush proto rip
ip route flush proto ripng
ip route flush proto zebra ip route flush proto zebra
ip route flush proto isis
else else
[ -n "$dmn" ] && eval "${dmn/-/_}=0" [ -n "$dmn" ] && eval "${dmn/-/_}=0"
start_watchfrr start_watchfrr

View File

@ -100,6 +100,11 @@ static const struct message rtproto_str[] = {
{RTPROT_BIRD, "BIRD"}, {RTPROT_BIRD, "BIRD"},
#endif /* RTPROT_BIRD */ #endif /* RTPROT_BIRD */
{RTPROT_MROUTED, "mroute"}, {RTPROT_MROUTED, "mroute"},
{RTPROT_BGP, "BGP"},
{RTPROT_OSPF, "OSPF"},
{RTPROT_ISIS, "IS-IS"},
{RTPROT_RIP, "RIP"},
{RTPROT_RIPNG, "RIPNG"},
{0, NULL} {0, NULL}
}; };

View File

@ -103,6 +103,47 @@ struct gw_family_t
union g_addr gate; union g_addr gate;
}; };
static inline int is_selfroute(int proto)
{
if ((proto == RTPROT_BGP) || (proto == RTPROT_OSPF) ||
(proto == RTPROT_STATIC) || (proto == RTPROT_ZEBRA) ||
(proto == RTPROT_ISIS) || (proto == RTPROT_RIPNG)) {
return 1;
}
return 0;
}
static inline int get_rt_proto(int proto)
{
switch (proto) {
case ZEBRA_ROUTE_BGP:
proto = RTPROT_BGP;
break;
case ZEBRA_ROUTE_OSPF:
case ZEBRA_ROUTE_OSPF6:
proto = RTPROT_OSPF;
break;
case ZEBRA_ROUTE_STATIC:
proto = RTPROT_STATIC;
break;
case ZEBRA_ROUTE_ISIS:
proto = RTPROT_ISIS;
break;
case ZEBRA_ROUTE_RIP:
proto = RTPROT_RIP;
break;
case ZEBRA_ROUTE_RIPNG:
proto = RTPROT_RIPNG;
break;
default:
proto = RTPROT_ZEBRA;
break;
}
return proto;
}
/* /*
Pending: create an efficient table_id (in a tree/hash) based lookup) Pending: create an efficient table_id (in a tree/hash) based lookup)
*/ */
@ -171,7 +212,7 @@ netlink_route_change_read_unicast (struct sockaddr_nl *snl, struct nlmsghdr *h,
return 0; return 0;
if (!startup && if (!startup &&
rtm->rtm_protocol == RTPROT_ZEBRA && is_selfroute (rtm->rtm_protocol) &&
h->nlmsg_type == RTM_NEWROUTE) h->nlmsg_type == RTM_NEWROUTE)
return 0; return 0;
@ -196,7 +237,7 @@ netlink_route_change_read_unicast (struct sockaddr_nl *snl, struct nlmsghdr *h,
} }
/* Route which inserted by Zebra. */ /* Route which inserted by Zebra. */
if (rtm->rtm_protocol == RTPROT_ZEBRA) if (is_selfroute(rtm->rtm_protocol))
flags |= ZEBRA_FLAG_SELFROUTE; flags |= ZEBRA_FLAG_SELFROUTE;
if (tb[RTA_OIF]) if (tb[RTA_OIF])
@ -1137,7 +1178,7 @@ netlink_route_multipath (int cmd, struct prefix *p, struct prefix *src_p,
req.r.rtm_family = family; req.r.rtm_family = family;
req.r.rtm_dst_len = p->prefixlen; req.r.rtm_dst_len = p->prefixlen;
req.r.rtm_src_len = src_p ? src_p->prefixlen : 0; req.r.rtm_src_len = src_p ? src_p->prefixlen : 0;
req.r.rtm_protocol = RTPROT_ZEBRA; req.r.rtm_protocol = get_rt_proto(rib->type);
req.r.rtm_scope = RT_SCOPE_UNIVERSE; req.r.rtm_scope = RT_SCOPE_UNIVERSE;
if ((rib->flags & ZEBRA_FLAG_BLACKHOLE) || (rib->flags & ZEBRA_FLAG_REJECT)) if ((rib->flags & ZEBRA_FLAG_BLACKHOLE) || (rib->flags & ZEBRA_FLAG_REJECT))

View File

@ -28,6 +28,14 @@
#define NL_DEFAULT_ROUTE_METRIC 20 #define NL_DEFAULT_ROUTE_METRIC 20
/* Additional protocol strings to push into routes */
#define RTPROT_BGP 186
#define RTPROT_ISIS 187
#define RTPROT_OSPF 188
#define RTPROT_RIP 189
#define RTPROT_RIPNG 190
extern void extern void
clear_nhlfe_installed (zebra_lsp_t *lsp); clear_nhlfe_installed (zebra_lsp_t *lsp);
extern int extern int