char gbuf[40];
char oif_list[256] = "\0";
vrf_id_t vrf = ns_id;
+ int table;
+ struct in_addr src = {.s_addr = 0};
+ struct in_addr grp = {.s_addr = 0};
if (mroute)
m = mroute;
memset(tb, 0, sizeof tb);
netlink_parse_rtattr(tb, RTA_MAX, RTM_RTA(rtm), len);
+ if (tb[RTA_TABLE])
+ table = *(int *)RTA_DATA(tb[RTA_TABLE]);
+ else
+ table = rtm->rtm_table;
+
+ vrf = vrf_lookup_by_table(table);
+
if (tb[RTA_IIF])
iif = *(int *)RTA_DATA(tb[RTA_IIF]);
if (tb[RTA_SRC])
- m->sg.src = *(struct in_addr *)RTA_DATA(tb[RTA_SRC]);
+ src = *(struct in_addr *)RTA_DATA(tb[RTA_SRC]);
if (tb[RTA_DST])
- m->sg.grp = *(struct in_addr *)RTA_DATA(tb[RTA_DST]);
+ grp = *(struct in_addr *)RTA_DATA(tb[RTA_DST]);
+
+ if (m->sg.src.s_addr != src.s_addr || m->sg.grp.s_addr != grp.s_addr)
+ return 0;
if ((RTA_EXPIRES <= RTA_MAX) && tb[RTA_EXPIRES])
m->lastused = *(unsigned long long *)RTA_DATA(tb[RTA_EXPIRES]);
sprintf(temp, "%s ", ifp->name);
strcat(oif_list, temp);
}
+ struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(vrf);
ifp = if_lookup_by_index(iif, vrf);
- zlog_debug("MCAST %s (%s,%s) IIF: %s OIF: %s jiffies: %lld",
- nl_msg_type_to_str(h->nlmsg_type), sbuf, gbuf,
- ifp->name, oif_list, m->lastused);
+ zlog_debug(
+ "MCAST VRF: %s(%d) %s (%s,%s) IIF: %s OIF: %s jiffies: %lld",
+ zvrf->vrf->name, vrf, nl_msg_type_to_str(h->nlmsg_type),
+ sbuf, gbuf, ifp->name, oif_list, m->lastused);
}
return 0;
}
0);
}
-int kernel_get_ipmr_sg_stats(void *in)
+int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
{
int suc = 0;
struct mcast_route_data *mr = (struct mcast_route_data *)in;
- struct {
- struct nlmsghdr n;
- struct ndmsg ndm;
- char buf[256];
- } req;
+ struct zebra_ns *zns = zvrf->zns;
mroute = mr;
- struct zebra_ns *zns = zebra_ns_lookup(NS_DEFAULT);
-
- memset(&req.n, 0, sizeof(req.n));
- memset(&req.ndm, 0, sizeof(req.ndm));
-
- req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg));
- req.n.nlmsg_flags = NLM_F_REQUEST;
- req.n.nlmsg_pid = zns->netlink_cmd.snl.nl_pid;
-
- req.ndm.ndm_family = AF_INET;
- req.n.nlmsg_type = RTM_GETROUTE;
-
- addattr_l(&req.n, sizeof(req), RTA_IIF, &mroute->ifindex, 4);
- 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);
+ suc = netlink_request(RTNL_FAMILY_IPMR, RTM_GETROUTE,
+ &zns->netlink_cmd);
+ if (suc < 0)
+ return suc;
- suc = netlink_talk(netlink_route_change_read_multicast, &req.n,
- &zns->netlink_cmd, zns, 0);
+ suc = netlink_parse_info(netlink_route_change_read_multicast,
+ &zns->netlink_cmd, zns, 0, 0);
- mroute = NULL;
return suc;
}