]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/rt_netlink.c
zebra: let /32 host route with same IP cross VRF
[mirror_frr.git] / zebra / rt_netlink.c
index 064c86b161b952778e54b65c1a552bbad9add77c..c6423dce99cc8d74a9a1c8d539760682ae901301 100644 (file)
@@ -924,7 +924,7 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
                        }
                        rib_add(afi, SAFI_UNICAST, vrf_id, proto, 0, flags, &p,
                                &src_p, &nh, nhe_id, table, metric, mtu,
-                               distance, tag);
+                               distance, tag, startup);
                } else {
                        /* This is a multipath route */
                        struct route_entry *re;
@@ -968,7 +968,7 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
 
                        if (nhe_id || ng)
                                rib_add_multipath(afi, SAFI_UNICAST, &p,
-                                                 &src_p, re, ng);
+                                                 &src_p, re, ng, startup);
                        else
                                XFREE(MTYPE_RE, re);
                }
@@ -1898,6 +1898,7 @@ ssize_t netlink_route_multipath_msg_encode(int cmd,
        union g_addr src;
        const struct prefix *p, *src_p;
        uint32_t table_id;
+       struct nlsock *nl;
 
        struct {
                struct nlmsghdr n;
@@ -1911,6 +1912,8 @@ ssize_t netlink_route_multipath_msg_encode(int cmd,
        if (datalen < sizeof(*req))
                return 0;
 
+       nl = kernel_netlink_nlsock_lookup(dplane_ctx_get_ns_sock(ctx));
+
        memset(req, 0, sizeof(*req));
 
        bytelen = (p->family == AF_INET ? 4 : 16);
@@ -1924,7 +1927,7 @@ ssize_t netlink_route_multipath_msg_encode(int cmd,
 
        req->n.nlmsg_type = cmd;
 
-       req->n.nlmsg_pid = dplane_ctx_get_ns(ctx)->nls.snl.nl_pid;
+       req->n.nlmsg_pid = nl->snl.nl_pid;
 
        req->r.rtm_family = p->family;
        req->r.rtm_dst_len = p->prefixlen;
@@ -2360,6 +2363,8 @@ ssize_t netlink_nexthop_msg_encode(uint16_t cmd,
        int type = dplane_ctx_get_nhe_type(ctx);
        struct rtattr *nest;
        uint16_t encap;
+       struct nlsock *nl =
+               kernel_netlink_nlsock_lookup(dplane_ctx_get_ns_sock(ctx));
 
        if (!id) {
                flog_err(
@@ -2402,7 +2407,7 @@ ssize_t netlink_nexthop_msg_encode(uint16_t cmd,
                req->n.nlmsg_flags |= NLM_F_REPLACE;
 
        req->n.nlmsg_type = cmd;
-       req->n.nlmsg_pid = dplane_ctx_get_ns(ctx)->nls.snl.nl_pid;
+       req->n.nlmsg_pid = nl->snl.nl_pid;
 
        req->nhm.nh_family = AF_UNSPEC;
        /* TODO: Scope? */
@@ -4283,6 +4288,8 @@ ssize_t netlink_mpls_multipath_msg_encode(int cmd, struct zebra_dplane_ctx *ctx,
        const char *routedesc;
        int route_type;
        struct prefix p = {0};
+       struct nlsock *nl =
+               kernel_netlink_nlsock_lookup(dplane_ctx_get_ns_sock(ctx));
 
        struct {
                struct nlmsghdr n;
@@ -4325,7 +4332,7 @@ ssize_t netlink_mpls_multipath_msg_encode(int cmd, struct zebra_dplane_ctx *ctx,
        req->n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
        req->n.nlmsg_flags = NLM_F_CREATE | NLM_F_REQUEST;
        req->n.nlmsg_type = cmd;
-       req->n.nlmsg_pid = dplane_ctx_get_ns(ctx)->nls.snl.nl_pid;
+       req->n.nlmsg_pid = nl->snl.nl_pid;
 
        req->r.rtm_family = AF_MPLS;
        req->r.rtm_table = RT_TABLE_MAIN;