]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: default originate transactional callbacks
authorChirag Shah <chirag@nvidia.com>
Sun, 25 Oct 2020 18:04:32 +0000 (11:04 -0700)
committerChirag Shah <chirag@nvidia.com>
Tue, 27 Oct 2020 18:39:41 +0000 (11:39 -0700)
Signed-off-by: Chirag Shah <chirag@nvidia.com>
bgpd/bgp_nb.c
bgpd/bgp_nb.h
bgpd/bgp_nb_config.c

index a001980fc2165a73ef6be63d0b234224beb0466e..644b03dff0880a2979dd6f256a5ee6e72bad585f 100644 (file)
@@ -2570,6 +2570,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate/originate",
                        .cbs = {
@@ -2872,6 +2878,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv6-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv6-unicast/default-originate/originate",
                        .cbs = {
@@ -3098,6 +3110,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_multicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-multicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-multicast/default-originate/originate",
                        .cbs = {
@@ -3324,6 +3342,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_multicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv6-multicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv6-multicast/default-originate/originate",
                        .cbs = {
@@ -3550,6 +3574,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_labeled_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-labeled-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-labeled-unicast/default-originate/originate",
                        .cbs = {
@@ -3776,6 +3806,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_labeled_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv6-labeled-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv6-labeled-unicast/default-originate/originate",
                        .cbs = {
@@ -4490,6 +4526,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv4_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_unnumbered_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate/originate",
                        .cbs = {
@@ -4792,6 +4834,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv6_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv6-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_unnumbered_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv6-unicast/default-originate/originate",
                        .cbs = {
@@ -5018,6 +5066,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv4_multicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-multicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_unnumbered_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-multicast/default-originate/originate",
                        .cbs = {
@@ -5243,6 +5297,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv6_multicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv6-multicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_unnumbered_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv6-multicast/default-originate/originate",
                        .cbs = {
@@ -5468,6 +5528,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv4_labeled_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-labeled-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_unnumbered_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-labeled-unicast/default-originate/originate",
                        .cbs = {
@@ -5694,6 +5760,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv6_labeled_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv6-labeled-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_unnumbered_neighbor_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv6-labeled-unicast/default-originate/originate",
                        .cbs = {
@@ -6408,6 +6480,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv4-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_peer_group_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv4-unicast/default-originate/originate",
                        .cbs = {
@@ -6710,6 +6788,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv6-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_peer_group_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv6-unicast/default-originate/originate",
                        .cbs = {
@@ -6936,6 +7020,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_multicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv4-multicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_peer_group_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv4-multicast/default-originate/originate",
                        .cbs = {
@@ -7168,6 +7258,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_multicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv6-multicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_peer_group_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv6-multicast/default-originate/originate",
                        .cbs = {
@@ -7400,6 +7496,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_labeled_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv4-labeled-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_peer_group_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv4-labeled-unicast/default-originate/originate",
                        .cbs = {
@@ -7626,6 +7728,12 @@ const struct frr_yang_module_info frr_bgp_info = {
                                .modify = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_labeled_unicast_as_path_options_replace_peer_as_modify,
                        }
                },
+               {
+                       .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv6-labeled-unicast/default-originate",
+                       .cbs = {
+                               .apply_finish = bgp_peer_group_afi_safi_default_originate_apply_finish,
+                       }
+               },
                {
                        .xpath = "/frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv6-labeled-unicast/default-originate/originate",
                        .cbs = {
index 9655cce40d2bbf82b736257fbf790498adbc38c5..c78c9c34ad221faf164e68f10cbf243e78173290 100644 (file)
@@ -3761,6 +3761,12 @@ void bgp_unnumbered_neighbor_afi_safi_prefix_limit_apply_finish(
        struct nb_cb_apply_finish_args *args);
 void bgp_peer_group_afi_safi_prefix_limit_apply_finish(
        struct nb_cb_apply_finish_args *args);
+void bgp_neighbor_afi_safi_default_originate_apply_finish(
+       struct nb_cb_apply_finish_args *args);
+void bgp_unnumbered_neighbor_afi_safi_default_originate_apply_finish(
+       struct nb_cb_apply_finish_args *args);
+void bgp_peer_group_afi_safi_default_originate_apply_finish(
+       struct nb_cb_apply_finish_args *args);
 
 /* xpath macros */
 /* route-list */
index bb19011ec0f4c1b4481424947356c3d59931fdc3..096fd11d18837dff9c1ceb84d6183f4b39d92bd1 100644 (file)
@@ -13978,6 +13978,70 @@ int bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_unicast_as_path_options_repla
        return NB_OK;
 }
 
+static int
+bgp_peer_afi_safi_default_originate_apply(struct nb_cb_apply_finish_args *args,
+                                         struct peer *peer, afi_t afi,
+                                         safi_t safi)
+{
+       bool originate = false;
+       int ret = 0;
+       struct route_map *route_map = NULL;
+       const char *rmap = NULL;
+
+       originate = yang_dnode_get_bool(args->dnode, "./originate");
+
+       if (yang_dnode_exists(args->dnode, "./route-map")) {
+               rmap = yang_dnode_get_string(args->dnode, "./route-map");
+               route_map = route_map_lookup_by_name(rmap);
+               if (!route_map) {
+                       snprintf(args->errmsg, args->errmsg_len,
+                                "The route-map '%s' does not exist.", rmap);
+                       return -1;
+               }
+       }
+
+       // zlog_debug("%s: originate %u route-map %s", __func__, originate,
+       // rmap);
+       if (originate)
+               ret = peer_default_originate_set(peer, afi, safi, rmap,
+                                                route_map);
+       else
+               ret = peer_default_originate_unset(peer, afi, safi);
+
+       return bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+}
+
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate
+ */
+void bgp_neighbor_afi_safi_default_originate_apply_finish(
+       struct nb_cb_apply_finish_args *args)
+{
+       struct bgp *bgp;
+       const char *peer_str;
+       struct peer *peer;
+       const struct lyd_node *nbr_dnode;
+       const struct lyd_node *nbr_af_dnode;
+       const char *af_name;
+       afi_t afi;
+       safi_t safi;
+
+       nbr_af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi");
+       af_name = yang_dnode_get_string(nbr_af_dnode, "./afi-safi-name");
+       yang_afi_safi_identity2value(af_name, &afi, &safi);
+
+       nbr_dnode = yang_dnode_get_parent(nbr_af_dnode, "neighbor");
+       bgp = nb_running_get_entry(nbr_dnode, NULL, true);
+       peer_str = yang_dnode_get_string(nbr_dnode, "./remote-address");
+       peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+                                       args->errmsg_len);
+       if (!peer)
+               return;
+
+       bgp_peer_afi_safi_default_originate_apply(args, peer, afi, safi);
+}
+
 /*
  * XPath:
  * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate/originate
@@ -22323,6 +22387,37 @@ int bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv4_unicast_as_path_op
        return NB_OK;
 }
 
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate
+ */
+void bgp_unnumbered_neighbor_afi_safi_default_originate_apply_finish(
+       struct nb_cb_apply_finish_args *args)
+{
+       struct bgp *bgp;
+       const char *peer_str;
+       struct peer *peer;
+       const struct lyd_node *nbr_dnode;
+       const struct lyd_node *nbr_af_dnode;
+       const char *af_name;
+       afi_t afi;
+       safi_t safi;
+
+       nbr_af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi");
+       af_name = yang_dnode_get_string(nbr_af_dnode, "./afi-safi-name");
+       yang_afi_safi_identity2value(af_name, &afi, &safi);
+
+       nbr_dnode = yang_dnode_get_parent(nbr_af_dnode, "unnumbered-neighbor");
+       bgp = nb_running_get_entry(nbr_dnode, NULL, true);
+       peer_str = yang_dnode_get_string(nbr_dnode, "./interface");
+       peer = bgp_unnumbered_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+                                                  args->errmsg_len);
+       if (!peer)
+               return;
+
+       bgp_peer_afi_safi_default_originate_apply(args, peer, afi, safi);
+}
+
 /*
  * XPath:
  * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate/originate
@@ -30614,6 +30709,36 @@ int bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_unicast_as_path_options_r
        return NB_OK;
 }
 
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/ipv4-unicast/default-originate
+ */
+void bgp_peer_group_afi_safi_default_originate_apply_finish(
+       struct nb_cb_apply_finish_args *args)
+{
+       struct bgp *bgp;
+       const char *peer_str;
+       struct peer *peer;
+       const struct lyd_node *nbr_dnode;
+       const struct lyd_node *nbr_af_dnode;
+       const char *af_name;
+       afi_t afi;
+       safi_t safi;
+
+       nbr_af_dnode = yang_dnode_get_parent(args->dnode, "afi-safi");
+       af_name = yang_dnode_get_string(nbr_af_dnode, "./afi-safi-name");
+       yang_afi_safi_identity2value(af_name, &afi, &safi);
+
+       nbr_dnode = yang_dnode_get_parent(nbr_af_dnode, "peer-group");
+       bgp = nb_running_get_entry(nbr_dnode, NULL, true);
+       peer_str = yang_dnode_get_string(nbr_dnode, "./peer-group-name");
+       peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+       if (!peer)
+               return;
+
+       bgp_peer_afi_safi_default_originate_apply(args, peer, afi, safi);
+}
+
 /*
  * XPath:
  * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv4-unicast/default-originate/originate