.cbs = {
.create = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_neighbors_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_neighbors_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_multicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_multicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_neighbors_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_multicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_multicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_neighbors_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_labeled_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_labeled_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_neighbors_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_labeled_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_neighbor_afi_safis_afi_safi_ipv6_labeled_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_neighbors_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_neighbor_afi_safis_afi_safi_l3vpn_ipv4_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_neighbor_afi_safis_afi_safi_l3vpn_ipv4_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_neighbors_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_neighbor_afi_safis_afi_safi_l3vpn_ipv6_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_neighbor_afi_safis_afi_safi_l3vpn_ipv6_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_neighbors_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv4_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv4_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_unnumbered_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv6_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv6_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_unnumbered_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv4_labeled_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv4_labeled_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_unnumbered_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv6_labeled_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_ipv6_labeled_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_unnumbered_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_l3vpn_ipv4_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_l3vpn_ipv4_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_unnumbered_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_l3vpn_ipv6_unicast_prefix_limit_direction_list_create,
.destroy = bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_l3vpn_ipv6_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_unnumbered_neighbor_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_unicast_prefix_limit_direction_list_create,
.destroy = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_peer_group_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_unicast_prefix_limit_direction_list_create,
.destroy = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_peer_group_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_multicast_prefix_limit_direction_list_create,
.destroy = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_multicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_peer_group_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_multicast_prefix_limit_direction_list_create,
.destroy = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_multicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_peer_group_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_labeled_unicast_prefix_limit_direction_list_create,
.destroy = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv4_labeled_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_peer_group_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_labeled_unicast_prefix_limit_direction_list_create,
.destroy = bgp_peer_groups_peer_group_afi_safis_afi_safi_ipv6_labeled_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_peer_group_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_peer_groups_peer_group_afi_safis_afi_safi_l3vpn_ipv4_unicast_prefix_limit_direction_list_create,
.destroy = bgp_peer_groups_peer_group_afi_safis_afi_safi_l3vpn_ipv4_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_peer_group_afi_safi_prefix_limit_apply_finish,
}
},
{
.cbs = {
.create = bgp_peer_groups_peer_group_afi_safis_afi_safi_l3vpn_ipv6_unicast_prefix_limit_direction_list_create,
.destroy = bgp_peer_groups_peer_group_afi_safis_afi_safi_l3vpn_ipv6_unicast_prefix_limit_direction_list_destroy,
+ .apply_finish = bgp_peer_group_afi_safi_prefix_limit_apply_finish,
}
},
{
return NB_OK;
}
+static int
+bgp_neighbor_afi_safi_prefix_limit_list_destroy(struct nb_cb_destroy_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;
+ int direction;
+
+ 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 NB_ERR_INCONSISTENCY;
+
+ direction = yang_dnode_get_enum(args->dnode, "./direction");
+
+ switch (direction) {
+ case 1:
+ peer_maximum_prefix_unset(peer, afi, safi);
+ break;
+ case 2:
+ UNSET_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT);
+ peer->pmax_out[afi][safi] = 0;
+ break;
+ }
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-unicast/prefix-limit/direction-list
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_neighbor_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
}
+static void
+bgp_peer_afi_safi_maximum_prefix_set(struct nb_cb_apply_finish_args *args,
+ struct peer *peer, afi_t afi, safi_t safi)
+{
+ int direction;
+ uint32_t max;
+ uint8_t threshold = MAXIMUM_PREFIX_THRESHOLD_DEFAULT;
+ uint16_t restart = 0;
+ bool warning = false;
+ bool force;
+
+ max = yang_dnode_get_uint32(args->dnode, "./max-prefixes");
+ direction = yang_dnode_get_enum(args->dnode, "./direction");
+ switch (direction) {
+ case 1:
+ force = yang_dnode_get_bool(args->dnode, "./force-check");
+
+ if (yang_dnode_exists(args->dnode,
+ "./options/shutdown-threshold-pct"))
+ threshold = yang_dnode_get_uint8(
+ args->dnode,
+ "./options/shutdown-threshold-pct");
+ if (yang_dnode_exists(args->dnode,
+ "./options/tw-shutdown-threshold-pct"))
+ threshold = yang_dnode_get_uint8(
+ args->dnode,
+ "./options/tw-shutdown-threshold-pct");
+ if (yang_dnode_exists(args->dnode,
+ "./options/tr-shutdown-threshold-pct"))
+ threshold = yang_dnode_get_uint8(
+ args->dnode,
+ "./options/tr-shutdown-threshold-pct");
+
+ if (yang_dnode_exists(args->dnode, "./options/warning-only"))
+ warning = yang_dnode_get_bool(args->dnode,
+ "./options/warning-only");
+ if (yang_dnode_exists(args->dnode, "./options/tw-warning-only"))
+ warning = yang_dnode_get_bool(
+ args->dnode, "./options/tw-warning-only");
+
+ if (yang_dnode_exists(args->dnode, "./options/restart-timer"))
+ restart = yang_dnode_get_uint16(
+ args->dnode, "./options/restart-timer");
+ if (yang_dnode_exists(args->dnode,
+ "./options/tr-restart-timer"))
+ restart = yang_dnode_get_uint16(
+ args->dnode, "./options/tr-restart-timer");
+
+ peer_maximum_prefix_set(peer, afi, safi, max, threshold,
+ warning, restart, force);
+
+ break;
+ case 2:
+ SET_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT);
+ peer->pmax_out[afi][safi] = max;
+
+ break;
+ }
+}
+
+void bgp_neighbors_neighbor_afi_safi_prefix_limit_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_maximum_prefix_set(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/prefix-limit/direction-list/max-prefixes
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_neighbor_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_neighbor_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_neighbor_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_neighbor_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_neighbor_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_neighbor_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_neighbor_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
return NB_OK;
}
+static int bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ struct nb_cb_destroy_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;
+ int direction;
+
+ 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 NB_ERR_INCONSISTENCY;
+
+ direction = yang_dnode_get_enum(args->dnode, "./direction");
+
+ switch (direction) {
+ case 1:
+ peer_maximum_prefix_unset(peer, afi, safi);
+ break;
+ case 2:
+ UNSET_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT);
+ peer->pmax_out[afi][safi] = 0;
+ break;
+ }
+
+ 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/prefix-limit/direction-list
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ args);
}
return NB_OK;
}
+void bgp_unnumbered_neighbor_afi_safi_prefix_limit_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_maximum_prefix_set(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/prefix-limit/direction-list/max-prefixes
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_unnumbered_neighbor_afi_safi_prefix_limit_list_destroy(
+ args);
}
return NB_OK;
return NB_OK;
}
+static int bgp_peer_group_afi_safi_prefix_limit_list_destroy(
+ struct nb_cb_destroy_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;
+ int direction;
+
+ 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 NB_ERR_INCONSISTENCY;
+
+ direction = yang_dnode_get_enum(args->dnode, "./direction");
+
+ switch (direction) {
+ case 1:
+ peer_maximum_prefix_unset(peer, afi, safi);
+ break;
+ case 2:
+ UNSET_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT);
+ peer->pmax_out[afi][safi] = 0;
+ break;
+ }
+
+ return NB_OK;
+}
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/afi-safis/afi-safi/ipv4-unicast/prefix-limit/direction-list
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_peer_group_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
}
+void bgp_peer_group_afi_safi_prefix_limit_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_maximum_prefix_set(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/prefix-limit/direction-list/max-prefixes
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_peer_group_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_peer_group_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_peer_group_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_peer_group_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_peer_group_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_peer_group_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
+ return bgp_peer_group_afi_safi_prefix_limit_list_destroy(args);
}
return NB_OK;
"Route-map to selectively unsuppress suppressed routes\n"
"Name of route map\n")
-static int peer_maximum_prefix_set_vty(struct vty *vty, const char *ip_str,
- afi_t afi, safi_t safi,
- const char *num_str,
- const char *threshold_str, int warning,
- const char *restart_str,
- const char *force_str)
-{
- int ret;
- struct peer *peer;
- uint32_t max;
- uint8_t threshold;
- uint16_t restart;
-
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
- return CMD_WARNING_CONFIG_FAILED;
-
- max = strtoul(num_str, NULL, 10);
- if (threshold_str)
- threshold = atoi(threshold_str);
- else
- threshold = MAXIMUM_PREFIX_THRESHOLD_DEFAULT;
-
- if (restart_str)
- restart = atoi(restart_str);
- else
- restart = 0;
-
- ret = peer_maximum_prefix_set(peer, afi, safi, max, threshold, warning,
- restart, force_str ? true : false);
-
- return bgp_vty_return(vty, ret);
-}
-
-static int peer_maximum_prefix_unset_vty(struct vty *vty, const char *ip_str,
- afi_t afi, safi_t safi)
-{
- int ret;
- struct peer *peer;
-
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
- return CMD_WARNING_CONFIG_FAILED;
-
- ret = peer_maximum_prefix_unset(peer, afi, safi);
-
- return bgp_vty_return(vty, ret);
-}
-
/* Maximum number of prefix to be sent to the neighbor. */
DEFUN(neighbor_maximum_prefix_out,
neighbor_maximum_prefix_out_cmd,
"Maximum number of prefixes to be sent to this peer\n"
"Maximum no. of prefix limit\n")
{
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
int idx_peer = 1;
int idx_number = 3;
- struct peer *peer;
- uint32_t max;
afi_t afi = bgp_node_afi(vty);
safi_t safi = bgp_node_safi(vty);
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- max = strtoul(argv[idx_number]->arg, NULL, 10);
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='out']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
- SET_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT);
- peer->pmax_out[afi][safi] = max;
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
- return CMD_SUCCESS;
+ nb_cli_enqueue_change(vty, "./max-prefixes", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
DEFUN(no_neighbor_maximum_prefix_out,
NEIGHBOR_ADDR_STR2
"Maximum number of prefixes to be sent to this peer\n")
{
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
int idx_peer = 2;
- struct peer *peer;
afi_t afi = bgp_node_afi(vty);
safi_t safi = bgp_node_safi(vty);
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- UNSET_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT);
- peer->pmax_out[afi][safi] = 0;
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='out']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
- return CMD_SUCCESS;
+ return nb_cli_apply_changes(vty, base_xpath);
}
/* Maximum number of prefix configuration. Prefix count is different
int idx_peer = 1;
int idx_number = 3;
int idx_force = 0;
- char *force = NULL;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
+ afi_t afi = bgp_node_afi(vty);
+ safi_t safi = bgp_node_safi(vty);
+
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='in']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
+ nb_cli_enqueue_change(vty, "./max-prefixes", NB_OP_MODIFY,
+ argv[idx_number]->arg);
if (argv_find(argv, argc, "force", &idx_force))
- force = argv[idx_force]->arg;
+ nb_cli_enqueue_change(vty, "./force-check", NB_OP_MODIFY,
+ "true");
- return peer_maximum_prefix_set_vty(
- vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
- argv[idx_number]->arg, NULL, 0, NULL, force);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_maximum_prefix, neighbor_maximum_prefix_hidden_cmd,
int idx_number = 3;
int idx_number_2 = 4;
int idx_force = 0;
- char *force = NULL;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
+ afi_t afi = bgp_node_afi(vty);
+ safi_t safi = bgp_node_safi(vty);
+
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='in']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
+
+ nb_cli_enqueue_change(vty, "./max-prefixes", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+
+ nb_cli_enqueue_change(vty, "./options/shutdown-threshold-pct",
+ NB_OP_MODIFY, argv[idx_number_2]->arg);
if (argv_find(argv, argc, "force", &idx_force))
- force = argv[idx_force]->arg;
+ nb_cli_enqueue_change(vty, "./force-check", NB_OP_MODIFY,
+ "true");
- return peer_maximum_prefix_set_vty(
- vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
- argv[idx_number]->arg, argv[idx_number_2]->arg, 0, NULL, force);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
int idx_peer = 1;
int idx_number = 3;
int idx_force = 0;
- char *force = NULL;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
+ afi_t afi = bgp_node_afi(vty);
+ safi_t safi = bgp_node_safi(vty);
+
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='in']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
+
+ nb_cli_enqueue_change(vty, "./max-prefixes", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+
+ nb_cli_enqueue_change(vty, "./options/warning-only", NB_OP_MODIFY,
+ "true");
if (argv_find(argv, argc, "force", &idx_force))
- force = argv[idx_force]->arg;
+ nb_cli_enqueue_change(vty, "./force-check", NB_OP_MODIFY,
+ "true");
- return peer_maximum_prefix_set_vty(
- vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
- argv[idx_number]->arg, NULL, 1, NULL, force);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
int idx_number = 3;
int idx_number_2 = 4;
int idx_force = 0;
- char *force = NULL;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
+ afi_t afi = bgp_node_afi(vty);
+ safi_t safi = bgp_node_safi(vty);
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='in']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
+
+ nb_cli_enqueue_change(vty, "./max-prefixes", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+ nb_cli_enqueue_change(vty, "./options/tw-shutdown-threshold-pct",
+ NB_OP_MODIFY, argv[idx_number_2]->arg);
+ nb_cli_enqueue_change(vty, "./options/tw-warning-only", NB_OP_MODIFY,
+ "true");
if (argv_find(argv, argc, "force", &idx_force))
- force = argv[idx_force]->arg;
+ nb_cli_enqueue_change(vty, "./force-check", NB_OP_MODIFY,
+ "true");
- return peer_maximum_prefix_set_vty(
- vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
- argv[idx_number]->arg, argv[idx_number_2]->arg, 1, NULL, force);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
int idx_number = 3;
int idx_number_2 = 5;
int idx_force = 0;
- char *force = NULL;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
+ afi_t afi = bgp_node_afi(vty);
+ safi_t safi = bgp_node_safi(vty);
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='in']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
+
+ nb_cli_enqueue_change(vty, "./max-prefixes", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+ nb_cli_enqueue_change(vty, "./options/restart-timer", NB_OP_MODIFY,
+ argv[idx_number_2]->arg);
if (argv_find(argv, argc, "force", &idx_force))
- force = argv[idx_force]->arg;
+ nb_cli_enqueue_change(vty, "./force-check", NB_OP_MODIFY,
+ "true");
- return peer_maximum_prefix_set_vty(
- vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
- argv[idx_number]->arg, NULL, 0, argv[idx_number_2]->arg, force);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
int idx_number_2 = 4;
int idx_number_3 = 6;
int idx_force = 0;
- char *force = NULL;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
+ afi_t afi = bgp_node_afi(vty);
+ safi_t safi = bgp_node_safi(vty);
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='in']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
+
+ nb_cli_enqueue_change(vty, "./max-prefixes", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+ nb_cli_enqueue_change(vty, "./options/tr-shutdown-threshold-pct",
+ NB_OP_MODIFY, argv[idx_number_2]->arg);
+ nb_cli_enqueue_change(vty, "./options/tr-restart-timer", NB_OP_MODIFY,
+ argv[idx_number_3]->arg);
if (argv_find(argv, argc, "force", &idx_force))
- force = argv[idx_force]->arg;
+ nb_cli_enqueue_change(vty, "./force-check", NB_OP_MODIFY,
+ "true");
- return peer_maximum_prefix_set_vty(
- vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
- argv[idx_number]->arg, argv[idx_number_2]->arg, 0,
- argv[idx_number_3]->arg, force);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
"Force checking all received routes not only accepted\n")
{
int idx_peer = 2;
- return peer_maximum_prefix_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty),
- bgp_node_safi(vty));
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char attr_xpath[XPATH_MAXLEN];
+ afi_t afi = bgp_node_afi(vty);
+ safi_t safi = bgp_node_safi(vty);
+
+ snprintf(af_xpath, sizeof(af_xpath), FRR_BGP_AF_XPATH,
+ yang_afi_safi_value2identity(afi, safi));
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "/%s/prefix-limit/direction-list[direction='in']",
+ bgp_afi_safi_get_container_str(afi, safi));
+ strlcat(base_xpath, attr_xpath, sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(