mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-05 06:34:44 +00:00
Add source of route as protocol string in ip route pushed into kernel
Ticket: CM-14313 Reviewed By: Testing Done: bgpmin, ospfmin, bgp_kitchen_sink_test 'ip route show' displays all routes as belonging to protocol zebra. The user has to run an additional command (in vtysh) to get the actual source of a route (bgp/ospf/static etc.). This patch addresses that by pushing the appropriate protocol string into the protocol field of the netlink route update message. Now you can see routes with the correct origin as well as filter on them (ip route show proto ospf). 'ospf' is used for both IPv4 and IPv6 routes, even though the OSPF version is different in both cases. Sample output (old): 9.9.12.13 via 69.254.2.38 dev swp3.2 proto zebra metric 20 9.9.13.3 proto zebra metric 20 nexthop via 69.254.2.30 dev swp1.2 weight 1 nexthop via 69.254.2.34 dev swp2.2 weight 1 nexthop via 69.254.2.38 dev swp3.2 weight 1 Sample output (new): 9.9.12.13 via 69.254.2.38 dev swp3.2 proto bgp metric 20 9.9.13.3 proto bgp metric 20 nexthop via 69.254.2.30 dev swp1.2 weight 1 nexthop via 69.254.2.34 dev swp2.2 weight 1 nexthop via 69.254.2.38 dev swp3.2 weight 1
This commit is contained in:
parent
9134c9e958
commit
23b1f33451
8
cumulus/etc/iproute2/rt_protos.d/frr.conf
Normal file
8
cumulus/etc/iproute2/rt_protos.d/frr.conf
Normal 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
|
1
debian/frr.dirs
vendored
1
debian/frr.dirs
vendored
@ -1,5 +1,6 @@
|
||||
etc/logrotate.d/
|
||||
etc/frr/
|
||||
etc/iproute2/rt_protos.d/
|
||||
usr/share/doc/frr/
|
||||
usr/share/doc/frr/examples/
|
||||
usr/share/lintian/overrides/
|
||||
|
@ -532,8 +532,15 @@ case "$1" in
|
||||
fi
|
||||
|
||||
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 isis
|
||||
|
||||
else
|
||||
[ -n "$dmn" ] && eval "${dmn/-/_}=0"
|
||||
start_watchfrr
|
||||
|
@ -100,6 +100,11 @@ static const struct message rtproto_str[] = {
|
||||
{RTPROT_BIRD, "BIRD"},
|
||||
#endif /* RTPROT_BIRD */
|
||||
{RTPROT_MROUTED, "mroute"},
|
||||
{RTPROT_BGP, "BGP"},
|
||||
{RTPROT_OSPF, "OSPF"},
|
||||
{RTPROT_ISIS, "IS-IS"},
|
||||
{RTPROT_RIP, "RIP"},
|
||||
{RTPROT_RIPNG, "RIPNG"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
|
@ -103,6 +103,47 @@ struct gw_family_t
|
||||
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)
|
||||
*/
|
||||
@ -171,7 +212,7 @@ netlink_route_change_read_unicast (struct sockaddr_nl *snl, struct nlmsghdr *h,
|
||||
return 0;
|
||||
|
||||
if (!startup &&
|
||||
rtm->rtm_protocol == RTPROT_ZEBRA &&
|
||||
is_selfroute (rtm->rtm_protocol) &&
|
||||
h->nlmsg_type == RTM_NEWROUTE)
|
||||
return 0;
|
||||
|
||||
@ -196,7 +237,7 @@ netlink_route_change_read_unicast (struct sockaddr_nl *snl, struct nlmsghdr *h,
|
||||
}
|
||||
|
||||
/* Route which inserted by Zebra. */
|
||||
if (rtm->rtm_protocol == RTPROT_ZEBRA)
|
||||
if (is_selfroute(rtm->rtm_protocol))
|
||||
flags |= ZEBRA_FLAG_SELFROUTE;
|
||||
|
||||
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_dst_len = p->prefixlen;
|
||||
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;
|
||||
|
||||
if ((rib->flags & ZEBRA_FLAG_BLACKHOLE) || (rib->flags & ZEBRA_FLAG_REJECT))
|
||||
|
@ -28,6 +28,14 @@
|
||||
|
||||
#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
|
||||
clear_nhlfe_installed (zebra_lsp_t *lsp);
|
||||
extern int
|
||||
|
Loading…
Reference in New Issue
Block a user