]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: Modify base code to get ipv6 stats from kernel
authorMobashshera Rasool <mrasool@vmware.com>
Mon, 4 Apr 2022 11:05:07 +0000 (04:05 -0700)
committerMobashshera Rasool <mrasool@vmware.com>
Thu, 28 Apr 2022 08:10:49 +0000 (01:10 -0700)
Modify the structure mcast_route_data to store ipv4/ipv6
addr and lastused multicast information from kernel.
Adjust the related APIs to parse ipv4/ipv6 informations.

Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
zebra/rt_netlink.c
zebra/zebra_mroute.c
zebra/zebra_mroute.h

index 7b377aad6d0b04fb6014e93d023a91606465a0ed..4e97323cf6f10d0e1aae9e73e4b1a45139b4a8dc 100644 (file)
@@ -1045,11 +1045,23 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h,
        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]);
+       if (tb[RTA_SRC]) {
+               if (rtm->rtm_family == RTNL_FAMILY_IPMR)
+                       m->src.ipaddr_v4 =
+                               *(struct in_addr *)RTA_DATA(tb[RTA_SRC]);
+               else
+                       m->src.ipaddr_v6 =
+                               *(struct in6_addr *)RTA_DATA(tb[RTA_SRC]);
+       }
 
-       if (tb[RTA_DST])
-               m->sg.grp = *(struct in_addr *)RTA_DATA(tb[RTA_DST]);
+       if (tb[RTA_DST]) {
+               if (rtm->rtm_family == RTNL_FAMILY_IPMR)
+                       m->grp.ipaddr_v4 =
+                               *(struct in_addr *)RTA_DATA(tb[RTA_DST]);
+               else
+                       m->grp.ipaddr_v6 =
+                               *(struct in6_addr *)RTA_DATA(tb[RTA_DST]);
+       }
 
        if (tb[RTA_EXPIRES])
                m->lastused = *(unsigned long long *)RTA_DATA(tb[RTA_EXPIRES]);
@@ -1074,6 +1086,17 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h,
                }
        }
 
+       if (rtm->rtm_family == RTNL_FAMILY_IPMR) {
+               SET_IPADDR_V4(&m->src);
+               SET_IPADDR_V4(&m->grp);
+       } else if (rtm->rtm_family == RTNL_FAMILY_IP6MR) {
+               SET_IPADDR_V6(&m->src);
+               SET_IPADDR_V6(&m->grp);
+       } else {
+               zlog_warn("%s: Invalid rtm_family received", __func__);
+               return 0;
+       }
+
        if (IS_ZEBRA_DEBUG_KERNEL) {
                struct interface *ifp = NULL;
                struct zebra_vrf *zvrf = NULL;
@@ -1089,11 +1112,10 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h,
                zvrf = zebra_vrf_lookup_by_id(vrf);
                ifp = if_lookup_by_index(iif, vrf);
                zlog_debug(
-                       "MCAST VRF: %s(%d) %s (%pI4,%pI4) IIF: %s(%d) OIF: %s jiffies: %lld",
+                       "MCAST VRF: %s(%d) %s (%pIA,%pIA) IIF: %s(%d) OIF: %s jiffies: %lld",
                        zvrf_name(zvrf), vrf, nl_msg_type_to_str(h->nlmsg_type),
-                       &m->sg.src, &m->sg.grp, ifp ? ifp->name : "Unknown",
-                       iif, oif_list,
-                       m->lastused);
+                       &m->src, &m->grp, ifp ? ifp->name : "Unknown", iif,
+                       oif_list, m->lastused);
        }
        return 0;
 }
@@ -2263,13 +2285,29 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
        req.n.nlmsg_flags = NLM_F_REQUEST;
        req.n.nlmsg_pid = zns->netlink_cmd.snl.nl_pid;
 
-       req.ndm.ndm_family = RTNL_FAMILY_IPMR;
        req.n.nlmsg_type = RTM_GETROUTE;
 
        nl_attr_put32(&req.n, sizeof(req), RTA_IIF, mroute->ifindex);
        nl_attr_put32(&req.n, sizeof(req), RTA_OIF, mroute->ifindex);
-       nl_attr_put32(&req.n, sizeof(req), RTA_SRC, mroute->sg.src.s_addr);
-       nl_attr_put32(&req.n, sizeof(req), RTA_DST, mroute->sg.grp.s_addr);
+
+       if (mroute->family == AF_INET) {
+               req.ndm.ndm_family = RTNL_FAMILY_IPMR;
+               nl_attr_put(&req.n, sizeof(req), RTA_SRC,
+                           &mroute->src.ipaddr_v4,
+                           sizeof(mroute->src.ipaddr_v4));
+               nl_attr_put(&req.n, sizeof(req), RTA_DST,
+                           &mroute->grp.ipaddr_v4,
+                           sizeof(mroute->grp.ipaddr_v4));
+       } else {
+               req.ndm.ndm_family = RTNL_FAMILY_IP6MR;
+               nl_attr_put(&req.n, sizeof(req), RTA_SRC,
+                           &mroute->src.ipaddr_v6,
+                           sizeof(mroute->src.ipaddr_v6));
+               nl_attr_put(&req.n, sizeof(req), RTA_DST,
+                           &mroute->grp.ipaddr_v6,
+                           sizeof(mroute->grp.ipaddr_v6));
+       }
+
        /*
         * What?
         *
index ef0f2d8924ab4c4750dac8ce7a8ba4358ca949e5..d9a94bb0c6f9950fd5040dda0e681b50fa128b1b 100644 (file)
@@ -39,20 +39,14 @@ void zebra_ipmr_route_stats(ZAPI_HANDLER_ARGS)
        int suc = -1;
 
        memset(&mroute, 0, sizeof(mroute));
-       STREAM_GET(&mroute.sg.src, msg, 4);
-       STREAM_GET(&mroute.sg.grp, msg, 4);
+       STREAM_GET(&mroute.src.ipaddr_v4, msg, 4);
+       STREAM_GET(&mroute.grp.ipaddr_v4, msg, 4);
        STREAM_GETL(msg, mroute.ifindex);
 
-       if (IS_ZEBRA_DEBUG_KERNEL) {
-               char sbuf[40];
-               char gbuf[40];
-
-               inet_ntop(AF_INET, &mroute.sg.src, sbuf, sizeof(sbuf));
-               inet_ntop(AF_INET, &mroute.sg.grp, gbuf, sizeof(gbuf));
-
-               zlog_debug("Asking for (%s,%s)[%s(%u)] mroute information",
-                          sbuf, gbuf, zvrf->vrf->name, zvrf->vrf->vrf_id);
-       }
+       if (IS_ZEBRA_DEBUG_KERNEL)
+               zlog_debug("Asking for (%pI4,%pI4)[%s(%u)] mroute information",
+                          &mroute.src.ipaddr_v4, &mroute.grp.ipaddr_v4,
+                          zvrf->vrf->name, zvrf->vrf->vrf_id);
 
        suc = kernel_get_ipmr_sg_stats(zvrf, &mroute);
 
@@ -62,8 +56,8 @@ stream_failure:
        stream_reset(s);
 
        zclient_create_header(s, ZEBRA_IPMR_ROUTE_STATS, zvrf_id(zvrf));
-       stream_put_in_addr(s, &mroute.sg.src);
-       stream_put_in_addr(s, &mroute.sg.grp);
+       stream_put_in_addr(s, &mroute.src.ipaddr_v4);
+       stream_put_in_addr(s, &mroute.grp.ipaddr_v4);
        stream_put(s, &mroute.lastused, sizeof(mroute.lastused));
        stream_putl(s, (uint32_t)suc);
 
index 3c12b82da3ed2380bd279304522430d043513127..6c56c2e41d885bc73e8d7ad475a0a9de44d50afd 100644 (file)
@@ -29,7 +29,9 @@ extern "C" {
 #endif
 
 struct mcast_route_data {
-       struct prefix_sg sg;
+       int family;
+       struct ipaddr src;
+       struct ipaddr grp;
        unsigned int ifindex;
        unsigned long long lastused;
 };