Merge pull request #3054 from donaldsharp/zebra_6.0

zebra: Send correct default vrf tableid for MROUTE stats
This commit is contained in:
Martin Winter 2018-09-21 03:23:10 +11:00 committed by GitHub
commit 0248216c0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1752,6 +1752,7 @@ skip:
int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
{
uint32_t actual_table;
int suc = 0;
struct mcast_route_data *mr = (struct mcast_route_data *)in;
struct {
@ -1777,7 +1778,23 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
addattr_l(&req.n, sizeof(req), RTA_OIF, &mroute->ifindex, 4);
addattr_l(&req.n, sizeof(req), RTA_SRC, &mroute->sg.src.s_addr, 4);
addattr_l(&req.n, sizeof(req), RTA_DST, &mroute->sg.grp.s_addr, 4);
addattr_l(&req.n, sizeof(req), RTA_TABLE, &zvrf->table_id, 4);
/*
* What?
*
* So during the namespace cleanup we started storing
* the zvrf table_id for the default table as RT_TABLE_MAIN
* which is what the normal routing table for ip routing is.
* This change caused this to break our lookups of sg data
* because prior to this change the zvrf->table_id was 0
* and when the pim multicast kernel code saw a 0,
* it was auto-translated to RT_TABLE_DEFAULT. But since
* we are now passing in RT_TABLE_MAIN there is no auto-translation
* and the kernel goes screw you and the delicious cookies you
* are trying to give me. So now we have this little hack.
*/
actual_table = (zvrf->table_id == RT_TABLE_MAIN) ? RT_TABLE_DEFAULT :
zvrf->table_id;
addattr_l(&req.n, sizeof(req), RTA_TABLE, &actual_table, 4);
suc = netlink_talk(netlink_route_change_read_multicast, &req.n,
&zns->netlink_cmd, zns, 0);