]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/rt_netlink.c
zebra: Create zebra_dplane.c and .h
[mirror_frr.git] / zebra / rt_netlink.c
index 7d4c68cc01e55155d518827250945374ebc16cad..fe42ab5be601376857fe4e6c807eddd278f9fabc 100644 (file)
@@ -828,15 +828,18 @@ int netlink_route_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
 
        if (!(h->nlmsg_type == RTM_NEWROUTE || h->nlmsg_type == RTM_DELROUTE)) {
                /* If this is not route add/delete message print warning. */
-               zlog_debug("Kernel message: %d NS %u\n", h->nlmsg_type, ns_id);
+               zlog_debug("Kernel message: %s NS %u\n",
+                          nl_msg_type_to_str(h->nlmsg_type), ns_id);
                return 0;
        }
 
-       if (!(rtm->rtm_family == AF_INET || rtm->rtm_family == AF_INET6)) {
+       if (!(rtm->rtm_family == AF_INET ||
+             rtm->rtm_family == AF_INET6 ||
+             rtm->rtm_family == RTNL_FAMILY_IPMR )) {
                flog_warn(
                        EC_ZEBRA_UNKNOWN_FAMILY,
-                       "Invalid address family: %u received from kernel route change: %u",
-                       rtm->rtm_family, h->nlmsg_type);
+                       "Invalid address family: %u received from kernel route change: %s",
+                       rtm->rtm_family, nl_msg_type_to_str(h->nlmsg_type));
                return 0;
        }
 
@@ -1764,6 +1767,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 {
@@ -1789,7 +1793,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);
@@ -1798,11 +1818,11 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
        return suc;
 }
 
-enum dp_req_result kernel_route_rib(struct route_node *rn,
-                                   const struct prefix *p,
-                                   const struct prefix *src_p,
-                                   struct route_entry *old,
-                                   struct route_entry *new)
+enum zebra_dplane_result kernel_route_rib(struct route_node *rn,
+                                         const struct prefix *p,
+                                         const struct prefix *src_p,
+                                         struct route_entry *old,
+                                         struct route_entry *new)
 {
        int ret = 0;
 
@@ -1832,20 +1852,20 @@ enum dp_req_result kernel_route_rib(struct route_node *rn,
                                                      new, 0);
                }
                kernel_route_rib_pass_fail(rn, p, new,
-                                          (!ret) ? DP_INSTALL_SUCCESS
-                                                 : DP_INSTALL_FAILURE);
-               return DP_REQUEST_SUCCESS;
+                                          (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+                                                 : ZEBRA_DPLANE_INSTALL_FAILURE);
+               return ZEBRA_DPLANE_REQUEST_SUCCESS;
        }
 
        if (old) {
                ret = netlink_route_multipath(RTM_DELROUTE, p, src_p, old, 0);
 
                kernel_route_rib_pass_fail(rn, p, old,
-                                          (!ret) ? DP_DELETE_SUCCESS
-                                                 : DP_DELETE_FAILURE);
+                                          (!ret) ? ZEBRA_DPLANE_DELETE_SUCCESS
+                                                 : ZEBRA_DPLANE_DELETE_FAILURE);
        }
 
-       return DP_REQUEST_SUCCESS;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
 int kernel_neigh_update(int add, int ifindex, uint32_t addr, char *lla,
@@ -2487,8 +2507,8 @@ int netlink_neigh_change(struct nlmsghdr *h, ns_id_t ns_id)
        else {
                flog_warn(
                        EC_ZEBRA_UNKNOWN_FAMILY,
-                       "Invalid address family: %u received from kernel neighbor change: %u",
-                       ndm->ndm_family, h->nlmsg_type);
+                       "Invalid address family: %u received from kernel neighbor change: %s",
+                       ndm->ndm_family, nl_msg_type_to_str(h->nlmsg_type));
                return 0;
        }