From: Chirag Shah Date: Sun, 25 Oct 2020 18:04:32 +0000 (-0700) Subject: bgpd: default originate transactional callbacks X-Git-Tag: base_7.6~312^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=refs%2Fpull%2F7227%2Fhead;p=mirror%2Ffrr.git bgpd: default originate transactional callbacks Signed-off-by: Chirag Shah --- diff --git a/bgpd/bgp_nb.c b/bgpd/bgp_nb.c index a001980fc2..644b03dff0 100644 --- a/bgpd/bgp_nb.c +++ b/bgpd/bgp_nb.c @@ -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 = { diff --git a/bgpd/bgp_nb.h b/bgpd/bgp_nb.h index 9655cce40d..c78c9c34ad 100644 --- a/bgpd/bgp_nb.h +++ b/bgpd/bgp_nb.h @@ -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 */ diff --git a/bgpd/bgp_nb_config.c b/bgpd/bgp_nb_config.c index bb19011ec0..096fd11d18 100644 --- a/bgpd/bgp_nb_config.c +++ b/bgpd/bgp_nb_config.c @@ -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