return NB_OK;
}
+static struct peer *bgp_neighbor_peer_lookup(struct bgp *bgp,
+ const char *peer_str, char *errmsg,
+ size_t errmsg_len)
+{
+ struct peer *peer = NULL;
+ union sockunion su;
+
+ str2sockunion(peer_str, &su);
+ peer = peer_lookup(bgp, &su);
+ if (!peer) {
+ snprintf(errmsg, errmsg_len,
+ "Specify remote-as or peer-group commands first");
+ return NULL;
+ }
+ if (peer_dynamic_neighbor(peer)) {
+ snprintf(errmsg, errmsg_len,
+ "Operation not allowed on a dynamic neighbor\n");
+ return NULL;
+ }
+ return peer;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor
*/
int bgp_neighbors_neighbor_create(struct nb_cb_create_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ union sockunion su;
+
switch (args->event) {
case NB_EV_VALIDATE:
+
+ peer_str =
+ yang_dnode_get_string(args->dnode, "./remote-address");
+
+ bgp = nb_running_get_entry(args->dnode, NULL, false);
+ if (!bgp)
+ return NB_OK;
+
+ str2sockunion(peer_str, &su);
+ if (peer_address_self_check(bgp, &su)) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "Can not configure the local system as neighbor");
+ return NB_ERR_VALIDATION;
+ }
+
+ break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ /* Once bgp instance available check self peer addr */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+
+ peer_str =
+ yang_dnode_get_string(args->dnode, "./remote-address");
+ str2sockunion(peer_str, &su);
+ if (peer_address_self_check(bgp, &su)) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "Can not configure the local system as neighbor");
+ return NB_ERR_INCONSISTENCY;
+ }
break;
}
int bgp_neighbors_neighbor_destroy(struct nb_cb_destroy_args *args)
{
+
+ struct bgp *bgp;
+ const char *peer_str;
+ union sockunion su;
+ struct peer *peer = NULL;
+ struct peer *other;
+
switch (args->event) {
case NB_EV_VALIDATE:
+ bgp = nb_running_get_entry(args->dnode, NULL, false);
+ if (!bgp)
+ return NB_OK;
+ peer_str =
+ yang_dnode_get_string(args->dnode, "./remote-address");
+ str2sockunion(peer_str, &su);
+
+ peer = peer_lookup(bgp, &su);
+ if (peer) {
+ if (peer_dynamic_neighbor(peer)) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "Operation not allowed on a dynamic neighbor");
+ return NB_ERR_VALIDATION;
+ }
+ }
+ break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+
+ peer_str =
+ yang_dnode_get_string(args->dnode, "./remote-address");
+ str2sockunion(peer_str, &su);
+
+ peer = peer_lookup(bgp, &su);
+ if (peer) {
+ if (peer_dynamic_neighbor(peer)) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "Operation not allowed on a dynamic neighbor");
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ other = peer->doppelganger;
+
+ if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE))
+ bgp_zebra_terminate_radv(peer->bgp, peer);
+
+ peer_notify_unconfig(peer);
+ peer_delete(peer);
+ if (other && other->status != Deleted) {
+ peer_notify_unconfig(other);
+ peer_delete(other);
+ }
+ }
+
break;
}
int bgp_neighbors_neighbor_local_interface_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *intf_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "BGP invalid peer %s", peer_str);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ if (peer->conf_if) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "BGP invalid peer %s", peer_str);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ intf_str = yang_dnode_get_string(args->dnode, NULL);
+
+ peer_interface_set(peer, intf_str);
+
break;
}
int bgp_neighbors_neighbor_local_interface_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "BGP invalid peer %s", peer_str);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ if (peer->conf_if) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "BGP invalid peer %s", peer_str);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ peer_interface_unset(peer);
+
break;
}
*/
int bgp_neighbors_neighbor_local_port_modify(struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t port;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "BGP invalid peer %s", peer_str);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ port = yang_dnode_get_uint16(args->dnode, NULL);
+ peer_port_set(peer, port);
+
break;
}
int bgp_neighbors_neighbor_local_port_destroy(struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t port;
+ struct servent *sp;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "BGP invalid peer %s", peer_str);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ sp = getservbyname("bgp", "tcp");
+ port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs(sp->s_port);
+ peer_port_set(peer, port);
+
break;
}
*/
int bgp_neighbors_neighbor_peer_group_modify(struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *peer_grp_str;
+ struct peer *peer;
+ struct peer_group *group;
+ union sockunion su;
+ as_t as;
+ int ret = 0;
+ char prgrp_xpath[XPATH_MAXLEN];
+ const struct lyd_node *bgp_dnode;
+
switch (args->event) {
case NB_EV_VALIDATE:
+ peer_grp_str = yang_dnode_get_string(args->dnode, NULL);
+ bgp_dnode = yang_dnode_get_parent(args->dnode, "bgp");
+ snprintf(prgrp_xpath, sizeof(prgrp_xpath),
+ FRR_BGP_PEER_GROUP_XPATH, peer_grp_str, "");
+
+ if (!yang_dnode_exists(bgp_dnode, prgrp_xpath)) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Configure the peer-group first %s",
+ peer_grp_str);
+ return NB_ERR_VALIDATION;
+ }
+
+ break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ str2sockunion(peer_str, &su);
+
+ peer_grp_str = yang_dnode_get_string(args->dnode, NULL);
+ group = peer_group_lookup(bgp, peer_grp_str);
+ if (!group) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Configure the peer-group first %s",
+ peer_grp_str);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ ret = peer_group_bind(bgp, &su, peer, group, &as);
+
+ if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
+ as);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_neighbor_peer_group_destroy(struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE))
+ bgp_zebra_terminate_radv(peer->bgp, peer);
+
+ peer_notify_unconfig(peer);
+ ret = peer_delete(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
*/
int bgp_neighbors_neighbor_password_modify(struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *passwrd_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ passwrd_str = yang_dnode_get_string(args->dnode, NULL);
+
+ peer_password_set(peer, passwrd_str);
+
break;
}
int bgp_neighbors_neighbor_password_destroy(struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_password_unset(peer);
+
break;
}
*/
int bgp_neighbors_neighbor_ttl_security_modify(struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+ uint8_t gtsm_hops;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ gtsm_hops = yang_dnode_get_uint8(args->dnode, NULL);
+ /*
+ * If 'neighbor swpX', then this is for directly connected
+ * peers, we should not accept a ttl-security hops value greater
+ * than 1.
+ */
+ if (peer->conf_if && (gtsm_hops > BGP_GTSM_HOPS_CONNECTED)) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "%d is directly connected peer, hops cannot exceed 1\n",
+ gtsm_hops);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ ret = peer_ttl_security_hops_set(peer, gtsm_hops);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret))
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_neighbor_ttl_security_destroy(struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ttl_security_hops_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+
break;
}
int bgp_neighbors_neighbor_enforce_first_as_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_ENFORCE_FIRST_AS, enable,
+ args->errmsg, args->errmsg_len);
break;
}
*/
int bgp_neighbors_neighbor_description_modify(struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *desc_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ desc_str = yang_dnode_get_string(args->dnode, NULL);
+
+ peer_description_set(peer, desc_str);
+
break;
}
int bgp_neighbors_neighbor_description_destroy(struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_description_unset(peer);
+
break;
}
*/
int bgp_neighbors_neighbor_passive_mode_modify(struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (peer_flag_modify_nb(bgp, peer_str, peer, PEER_FLAG_PASSIVE,
+ set, args->errmsg, args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_neighbor_capability_options_dynamic_capability_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_DYNAMIC_CAPABILITY, enable,
+ args->errmsg, args->errmsg_len);
+
break;
}
int bgp_neighbors_neighbor_capability_options_extended_nexthop_capability_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_CAPABILITY_ENHE, enable,
+ args->errmsg, args->errmsg_len);
+
break;
}
int bgp_neighbors_neighbor_update_source_ip_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str, *source_str;
+ struct peer *peer;
+ union sockunion su;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ source_str = yang_dnode_get_string(args->dnode, NULL);
+
+ str2sockunion(source_str, &su);
+ peer_update_source_addr_set(peer, &su);
+
break;
}
int bgp_neighbors_neighbor_update_source_ip_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_update_source_unset(peer);
+
break;
}
int bgp_neighbors_neighbor_update_source_interface_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str, *source_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ source_str = yang_dnode_get_string(args->dnode, NULL);
+
+ peer_update_source_if_set(peer, source_str);
+
break;
}
int bgp_neighbors_neighbor_update_source_interface_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_update_source_unset(peer);
+
+ break;
+ }
+
+ return NB_OK;
+}
+
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/neighbor-remote-as/remote-as-type
+ */
+int bgp_neighbors_neighbor_neighbor_remote_as_remote_as_type_modify(
+ struct nb_cb_modify_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ int as_type = AS_SPECIFIED;
+ union sockunion su;
+ int ret;
+ as_t as = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ as_type = yang_dnode_get_enum(args->dnode, "../remote-as-type");
+ /* When remote-as-type is as-specified, the peer will be
+ * created in remote_as_modify callback */
+ if (yang_dnode_exists(args->dnode, "../remote-as"))
+ return NB_OK;
+
+ str2sockunion(peer_str, &su);
+ ret = peer_remote_as(bgp, &su, NULL, &as, as_type, AFI_IP,
+ SAFI_UNICAST);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+
break;
}
return NB_OK;
}
-/*
- * XPath:
- * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/neighbor-remote-as/remote-as-type
- */
-int bgp_neighbors_neighbor_neighbor_remote_as_remote_as_type_modify(
- struct nb_cb_modify_args *args)
+int bgp_neighbors_neighbor_neighbor_remote_as_remote_as_type_destroy(
+ struct nb_cb_destroy_args *args)
{
switch (args->event) {
case NB_EV_VALIDATE:
int bgp_neighbors_neighbor_neighbor_remote_as_remote_as_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ int as_type = AS_SPECIFIED;
+ union sockunion su;
+ int ret;
+ as_t as = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ as_type = yang_dnode_get_enum(args->dnode, "../remote-as-type");
+ as = yang_dnode_get_uint32(args->dnode, NULL);
+
+ str2sockunion(peer_str, &su);
+ ret = peer_remote_as(bgp, &su, NULL, &as, as_type, AFI_IP,
+ SAFI_UNICAST);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+
break;
}
int bgp_neighbors_neighbor_ebgp_multihop_enabled_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+ int ret = 0;
+ uint8_t ttl = MAXTTL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ if (peer->conf_if) {
+ ret = BGP_ERR_INVALID_FOR_DIRECT_PEER;
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len,
+ ret);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (set)
+ ret = peer_ebgp_multihop_set(peer, ttl);
+ else
+ ret = peer_ebgp_multihop_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+
break;
}
int bgp_neighbors_neighbor_ebgp_multihop_enabled_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ebgp_multihop_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+
break;
}
int bgp_neighbors_neighbor_ebgp_multihop_multihop_ttl_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+ uint8_t ttl = MAXTTL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ if (peer->conf_if) {
+ ret = BGP_ERR_INVALID_FOR_DIRECT_PEER;
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len,
+ ret);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ ttl = yang_dnode_get_uint8(args->dnode, NULL);
+
+ ret = peer_ebgp_multihop_set(peer, ttl);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_neighbor_ebgp_multihop_multihop_ttl_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ebgp_multihop_unset(peer);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_neighbor_ebgp_multihop_disable_connected_check_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_DISABLE_CONNECTED_CHECK, set,
+ args->errmsg, args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
return NB_OK;
}
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/local-as
+ */
+void bgp_neighbors_neighbor_local_as_apply_finish(
+ struct nb_cb_apply_finish_args *args)
+{
+ struct bgp *bgp;
+ int ret;
+ as_t as = 0;
+ const char *peer_str;
+ struct peer *peer = NULL;
+ bool no_prepend = 0;
+ bool replace_as = 0;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ if (yang_dnode_exists(args->dnode, "./local-as"))
+ as = yang_dnode_get_uint32(args->dnode, "./local-as");
+ if (yang_dnode_exists(args->dnode, "./no-prepend"))
+ no_prepend = yang_dnode_get_bool(args->dnode, "./no-prepend");
+ if (yang_dnode_exists(args->dnode, "./no-replace-as"))
+ replace_as =
+ yang_dnode_get_bool(args->dnode, "./no-replace-as");
+
+ if (!as && !no_prepend && !replace_as)
+ ret = peer_local_as_unset(peer);
+ else
+ ret = peer_local_as_set(peer, as, no_prepend, replace_as);
+ 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/local-as/local-as
return NB_OK;
}
+int bgp_neighbors_neighbor_local_as_local_as_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ struct bgp *bgp;
+ int ret;
+ const char *peer_str;
+ struct peer *peer;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+
+
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ ret = peer_local_as_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+
+ break;
+ }
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/local-as/no-prepend
return NB_OK;
}
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/admin-shutdown
+ */
+void bgp_neighbors_neighbor_admin_shutdown_apply_finish(
+ struct nb_cb_apply_finish_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+ const char *message;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ if (yang_dnode_exists(args->dnode, "./message")) {
+ message = yang_dnode_get_string(args->dnode, "./message");
+ peer_tx_shutdown_message_set(peer, message);
+ }
+ enable = yang_dnode_get_bool(args->dnode, "./enable");
+
+ peer_flag_modify_nb(bgp, peer_str, peer, PEER_FLAG_SHUTDOWN, enable,
+ args->errmsg, args->errmsg_len);
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/admin-shutdown/enable
return NB_OK;
}
+int bgp_neighbors_neighbor_admin_shutdown_enable_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ case NB_EV_APPLY:
+ /* TODO: implement me. */
+ break;
+ }
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/admin-shutdown/message
int bgp_neighbors_neighbor_timers_advertise_interval_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t routeadv;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ routeadv = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_advertise_interval_set(peer, routeadv);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_neighbor_timers_advertise_interval_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ ret = peer_advertise_interval_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_neighbor_timers_connect_time_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t connect;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ connect = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_timers_connect_set(peer, connect);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_neighbor_timers_connect_time_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ ret = peer_timers_connect_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_neighbor_timers_hold_time_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t keepalive = 0;
+ uint16_t holdtime = 0;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ keepalive = yang_dnode_get_uint16(args->dnode, "../keepalive");
+ holdtime = yang_dnode_get_uint16(args->dnode, NULL);
+
+ if (keepalive != BGP_DEFAULT_KEEPALIVE
+ && holdtime != BGP_DEFAULT_HOLDTIME) {
+ ret = peer_timers_set(peer, keepalive, holdtime);
+ } else
+ ret = peer_timers_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_neighbor_timers_keepalive_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t keepalive = 0, curr_keep = 0;
+ uint16_t holdtime = 0;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../remote-address");
+ peer = bgp_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ keepalive = yang_dnode_get_uint16(args->dnode, NULL);
+ holdtime = yang_dnode_get_uint16(args->dnode, "../hold-time");
+
+ if (keepalive != BGP_DEFAULT_KEEPALIVE
+ && holdtime != BGP_DEFAULT_HOLDTIME) {
+ if (peer->holdtime == holdtime) {
+ curr_keep = (keepalive < holdtime / 3
+ ? keepalive
+ : holdtime / 3);
+ if (curr_keep == keepalive)
+ return NB_OK;
+ }
+ ret = peer_timers_set(peer, keepalive, holdtime);
+ } else
+ ret = peer_timers_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
*/
int bgp_neighbors_neighbor_afi_safis_afi_safi_enabled_modify(
struct nb_cb_modify_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *af_name;
+ afi_t afi;
+ safi_t safi;
+ bool activate = false;
+ int ret = 0;
+ union sockunion su;
+ struct peer *peer;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ af_name =
+ yang_dnode_get_string(args->dnode, "../afi-safi-name");
+ yang_afi_safi_identity2value(af_name, &afi, &safi);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../../remote-address");
+ str2sockunion(peer_str, &su);
+ peer = peer_lookup(bgp, &su);
+
+ activate = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (activate)
+ ret = peer_activate(peer, afi, safi);
+ else
+ ret = peer_deactivate(peer, afi, safi);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
+ break;
+ }
+
+ return NB_OK;
+}
+
+int bgp_neighbors_neighbor_afi_safis_afi_safi_enabled_destroy(
+ struct nb_cb_destroy_args *args)
{
switch (args->event) {
case NB_EV_VALIDATE:
return NB_OK;
}
+static struct peer *bgp_unnumbered_neighbor_peer_lookup(struct bgp *bgp,
+ const char *peer_str,
+ char *errmsg,
+ size_t errmsg_len)
+{
+ struct peer *peer = NULL;
+
+ /* Not IP, could match either peer configured on interface or a
+ * group. */
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+ if (!peer) {
+ snprintf(errmsg, errmsg_len,
+ "Specify remote-as or peer-group commands first");
+ return NULL;
+ }
+ if (peer_dynamic_neighbor(peer)) {
+ snprintf(errmsg, errmsg_len,
+ "Operation not allowed on a dynamic neighbor\n");
+ return NULL;
+ }
+
+ return peer;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor
*/
int bgp_neighbors_unnumbered_neighbor_create(struct nb_cb_create_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *peer_grp_str = NULL;
+ bool v6_only = false;
+ int as_type = AS_UNSPECIFIED;
+ as_t as = 0;
+ char prgrp_xpath[XPATH_MAXLEN];
+ const struct lyd_node *bgp_dnode;
+
switch (args->event) {
case NB_EV_VALIDATE:
+ peer_str = yang_dnode_get_string(args->dnode, "./interface");
+ bgp_dnode = yang_dnode_get_parent(args->dnode, "bgp");
+ snprintf(prgrp_xpath, sizeof(prgrp_xpath),
+ FRR_BGP_PEER_GROUP_XPATH, peer_str, "");
+
+ if (yang_dnode_exists(bgp_dnode, prgrp_xpath)) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Name conflict with peer-group: %s", peer_str);
+ return NB_ERR_VALIDATION;
+ }
+
+ break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "./interface");
+
+ if (yang_dnode_exists(args->dnode, "./peer-group"))
+ peer_grp_str = yang_dnode_get_string(args->dnode,
+ "./peer-group");
+
+ if (yang_dnode_exists(args->dnode, "./v6-only"))
+ v6_only = yang_dnode_get_bool(args->dnode, "./v6-only");
+
+ if (yang_dnode_exists(args->dnode,
+ "./neighbor-remote-as/remote-as-type")) {
+ as_type = yang_dnode_get_enum(
+ args->dnode,
+ "./neighbor-remote-as/remote-as-type");
+ if (yang_dnode_exists(args->dnode,
+ "./neighbor-remote-as/remote-as"))
+ as = yang_dnode_get_uint32(
+ args->dnode,
+ "./neighbor-remote-as/remote-as");
+ }
+
+ if (peer_conf_interface_create(bgp, peer_str, AFI_IP,
+ SAFI_UNICAST, v6_only,
+ peer_grp_str, as_type, as,
+ args->errmsg, args->errmsg_len))
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_unnumbered_neighbor_destroy(struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+
+ peer_str = yang_dnode_get_string(args->dnode, "./interface");
+ /* look up for neighbor by interface name config. */
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+ if (peer) {
+ /* Request zebra to terminate IPv6 RAs on this
+ * interface. */
+ if (peer->ifp)
+ bgp_zebra_terminate_radv(peer->bgp, peer);
+ peer_notify_unconfig(peer);
+ peer_delete(peer);
+ } else {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Create the peer-group first");
+ return NB_ERR_INCONSISTENCY;
+ }
+
break;
}
int bgp_neighbors_unnumbered_neighbor_v6only_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ bool v6_only = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+
+ v6_only = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (peer_conf_interface_create(
+ bgp, peer_str, AFI_IP, SAFI_UNICAST, v6_only, NULL,
+ AS_UNSPECIFIED, 0, args->errmsg, args->errmsg_len))
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_unnumbered_neighbor_peer_group_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *peer_grp_str;
+ struct peer *peer;
+ struct peer_group *group;
+ union sockunion su;
+ as_t as;
+ int ret = 0;
+ char prgrp_xpath[XPATH_MAXLEN];
+ const struct lyd_node *bgp_dnode;
+
switch (args->event) {
case NB_EV_VALIDATE:
+ peer_grp_str = yang_dnode_get_string(args->dnode, NULL);
+ bgp_dnode = yang_dnode_get_parent(args->dnode, "bgp");
+ snprintf(prgrp_xpath, sizeof(prgrp_xpath),
+ FRR_BGP_PEER_GROUP_XPATH, peer_grp_str, "");
+
+ if (!yang_dnode_exists(bgp_dnode, prgrp_xpath)) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Configure the peer-group first %s",
+ peer_grp_str);
+ return NB_ERR_VALIDATION;
+ }
+
+ break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+
+ peer_grp_str = yang_dnode_get_string(args->dnode, NULL);
+ group = peer_group_lookup(bgp, peer_grp_str);
+ if (!group) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Configure the peer-group first\n");
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ ret = peer_group_bind(bgp, &su, peer, group, &as);
+ if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
+ as);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_peer_group_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../remote-address");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+
+ if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE))
+ bgp_zebra_terminate_radv(peer->bgp, peer);
+
+ peer_notify_unconfig(peer);
+ ret = peer_delete(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_unnumbered_neighbor_password_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *passwrd_str;
+ struct peer *peer = NULL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ passwrd_str = yang_dnode_get_string(args->dnode, NULL);
+ peer_password_set(peer, passwrd_str);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_password_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer = NULL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_password_unset(peer);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_ttl_security_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+ uint8_t gtsm_hops;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ gtsm_hops = yang_dnode_get_uint8(args->dnode, NULL);
+ /*
+ * If 'neighbor swpX', then this is for directly connected
+ * peers, we should not accept a ttl-security hops value greater
+ * than 1.
+ */
+ if (peer->conf_if && (gtsm_hops > BGP_GTSM_HOPS_CONNECTED)) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "%d is directly connected peer, hops cannot exceed 1\n",
+ gtsm_hops);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ ret = peer_ttl_security_hops_set(peer, gtsm_hops);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_unnumbered_neighbor_ttl_security_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ttl_security_hops_unset(peer);
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_enforce_first_as_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_ENFORCE_FIRST_AS, enable,
+ args->errmsg, args->errmsg_len);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_description_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *desc_str;
+ struct peer *peer = NULL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ desc_str = yang_dnode_get_string(args->dnode, NULL);
+
+ peer_description_set(peer, desc_str);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_description_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer = NULL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_description_unset(peer);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_passive_mode_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (peer_flag_modify_nb(bgp, peer_str, peer, PEER_FLAG_PASSIVE,
+ set, args->errmsg, args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_unnumbered_neighbor_capability_options_dynamic_capability_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_DYNAMIC_CAPABILITY, enable,
+ args->errmsg, args->errmsg_len);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_capability_options_extended_nexthop_capability_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_CAPABILITY_ENHE, enable,
+ args->errmsg, args->errmsg_len);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_update_source_ip_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str, *source_str;
+ struct peer *peer;
+ union sockunion su;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ source_str = yang_dnode_get_string(args->dnode, NULL);
+
+ str2sockunion(source_str, &su);
+ peer_update_source_addr_set(peer, &su);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_update_source_ip_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_update_source_unset(peer);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_update_source_interface_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str, *source_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ source_str = yang_dnode_get_string(args->dnode, NULL);
+
+ peer_update_source_if_set(peer, source_str);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_update_source_interface_destroy(
struct nb_cb_destroy_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_update_source_unset(peer);
+
+ break;
+ }
+
+ return NB_OK;
+}
+
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/neighbor-remote-as
+ */
+void bgp_neighbors_unnumbered_neighbor_neighbor_remote_as_apply_finish(
+ struct nb_cb_apply_finish_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ int as_type = AS_SPECIFIED;
+ int ret;
+ as_t as = 0;
+ struct peer *peer = NULL;
+ afi_t afi = AFI_IP;
+ safi_t safi = SAFI_UNICAST;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ as_type = yang_dnode_get_enum(args->dnode, "./remote-as-type");
+ if (yang_dnode_exists(args->dnode, "./remote-as"))
+ as = yang_dnode_get_uint32(args->dnode, "./remote-as");
+
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+
+ ret = peer_remote_as(bgp, NULL, peer_str, &as, as_type, afi, safi);
+
+ if (ret < 0 && !peer) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Create the peer-group or interface first");
+ 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/unnumbered-neighbor/neighbor-remote-as/remote-as-type
+ */
+int bgp_neighbors_unnumbered_neighbor_neighbor_remote_as_remote_as_type_modify(
+ struct nb_cb_modify_args *args)
{
switch (args->event) {
case NB_EV_VALIDATE:
return NB_OK;
}
-/*
- * XPath:
- * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/neighbor-remote-as/remote-as-type
- */
-int bgp_neighbors_unnumbered_neighbor_neighbor_remote_as_remote_as_type_modify(
- struct nb_cb_modify_args *args)
+int bgp_neighbors_unnumbered_neighbor_neighbor_remote_as_remote_as_type_destroy(
+ struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+
+ /* remote-as set to 0 and as_type to unspecified */
+ peer_as_change(peer, 0, AS_UNSPECIFIED);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_ebgp_multihop_enabled_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+ int ret = 0;
+ uint8_t ttl = MAXTTL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ if (peer->conf_if) {
+ ret = BGP_ERR_INVALID_FOR_DIRECT_PEER;
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len,
+ ret);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (set)
+ ret = peer_ebgp_multihop_set(peer, ttl);
+ else
+ ret = peer_ebgp_multihop_unset(peer);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_ebgp_multihop_enabled_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ebgp_multihop_unset(peer);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_ebgp_multihop_multihop_ttl_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+ uint8_t ttl = MAXTTL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ if (peer->conf_if) {
+ ret = BGP_ERR_INVALID_FOR_DIRECT_PEER;
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len,
+ ret);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ ttl = yang_dnode_get_uint8(args->dnode, NULL);
+
+ ret = peer_ebgp_multihop_set(peer, ttl);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_ebgp_multihop_multihop_ttl_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ebgp_multihop_unset(peer);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_ebgp_multihop_disable_connected_check_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = peer_lookup_by_conf_if(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_DISABLE_CONNECTED_CHECK, set,
+ args->errmsg, args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
return NB_OK;
}
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/local-as
+ */
+void bgp_neighbors_unnumbered_neighbor_local_as_apply_finish(
+ struct nb_cb_apply_finish_args *args)
+{
+ struct bgp *bgp;
+ int ret;
+ as_t as = 0;
+ const char *peer_str;
+ struct peer *peer = NULL;
+ bool no_prepend = 0;
+ bool replace_as = 0;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+
+ peer = bgp_unnumbered_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ if (yang_dnode_exists(args->dnode, "./local-as"))
+ as = yang_dnode_get_uint32(args->dnode, "./local-as");
+ if (yang_dnode_exists(args->dnode, "./no-prepend"))
+ no_prepend = yang_dnode_get_bool(args->dnode, "./no-prepend");
+ if (yang_dnode_exists(args->dnode, "./no-replace-as"))
+ replace_as =
+ yang_dnode_get_bool(args->dnode, "./no-replace-as");
+
+ if (!as && !no_prepend && !replace_as)
+ ret = peer_local_as_unset(peer);
+ else
+ ret = peer_local_as_set(peer, as, no_prepend, replace_as);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/local-as/local-as
return NB_OK;
}
+int bgp_neighbors_unnumbered_neighbor_local_as_local_as_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ case NB_EV_APPLY:
+ /* TODO: implement me. */
+ break;
+ }
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/local-as/no-prepend
return NB_OK;
}
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/admin-shutdown
+ */
+void bgp_neighbors_unnumbered_neighbor_admin_shutdown_apply_finish(
+ struct nb_cb_apply_finish_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+ const char *message;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+
+ if (yang_dnode_exists(args->dnode, "./message")) {
+ message = yang_dnode_get_string(args->dnode, "./message");
+ peer_tx_shutdown_message_set(peer, message);
+ }
+ enable = yang_dnode_get_bool(args->dnode, "./enable");
+
+ peer_flag_modify_nb(bgp, peer_str, peer, PEER_FLAG_SHUTDOWN, enable,
+ args->errmsg, args->errmsg_len);
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/admin-shutdown/enable
return NB_OK;
}
+int bgp_neighbors_unnumbered_neighbor_admin_shutdown_enable_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ case NB_EV_APPLY:
+ /* TODO: implement me. */
+ break;
+ }
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/admin-shutdown/message
int bgp_neighbors_unnumbered_neighbor_timers_advertise_interval_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t routeadv;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ routeadv = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_advertise_interval_set(peer, routeadv);
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_timers_advertise_interval_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+
+ ret = peer_advertise_interval_unset(peer);
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_timers_connect_time_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t connect;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ connect = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_timers_connect_set(peer, connect);
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+
break;
}
int bgp_neighbors_unnumbered_neighbor_timers_connect_time_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+ ret = peer_timers_connect_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_unnumbered_neighbor_timers_hold_time_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t keepalive = 0;
+ uint16_t holdtime = 0;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+
+ keepalive = yang_dnode_get_uint16(args->dnode, "../keepalive");
+ holdtime = yang_dnode_get_uint16(args->dnode, NULL);
+
+ if (keepalive != BGP_DEFAULT_KEEPALIVE
+ && holdtime != BGP_DEFAULT_HOLDTIME) {
+ ret = peer_timers_set(peer, keepalive, holdtime);
+ } else
+ ret = peer_timers_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_neighbors_unnumbered_neighbor_timers_keepalive_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t keepalive = 0, curr_keep = 0;
+ uint16_t holdtime = 0;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str =
+ yang_dnode_get_string(args->dnode, "../../interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+
+ keepalive = yang_dnode_get_uint16(args->dnode, NULL);
+ holdtime = yang_dnode_get_uint16(args->dnode, "../hold-time");
+
+ if (keepalive != BGP_DEFAULT_KEEPALIVE
+ && holdtime != BGP_DEFAULT_HOLDTIME) {
+ if (peer->holdtime == holdtime) {
+ curr_keep = (keepalive < holdtime / 3
+ ? keepalive
+ : holdtime / 3);
+ if (curr_keep == keepalive)
+ return NB_OK;
+ }
+ ret = peer_timers_set(peer, keepalive, holdtime);
+ } else
+ ret = peer_timers_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
return NB_OK;
}
-int bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_destroy(
+int bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ case NB_EV_APPLY:
+ /* TODO: implement me. */
+ break;
+ }
+
+ return NB_OK;
+}
+
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/enabled
+ */
+int bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_enabled_modify(
+ struct nb_cb_modify_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *af_name;
+ afi_t afi;
+ safi_t safi;
+ bool activate = false;
+ int ret = 0;
+ struct peer *peer;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ af_name =
+ yang_dnode_get_string(args->dnode, "../afi-safi-name");
+ yang_afi_safi_identity2value(af_name, &afi, &safi);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../../interface");
+
+ peer = bgp_unnumbered_neighbor_peer_lookup(
+ bgp, peer_str, args->errmsg, args->errmsg_len);
+
+ activate = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (activate)
+ ret = peer_activate(peer, afi, safi);
+ else
+ ret = peer_deactivate(peer, afi, safi);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ break;
+ }
+
+ return NB_OK;
+}
+
+int bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_enabled_destroy(
struct nb_cb_destroy_args *args)
{
switch (args->event) {
return NB_OK;
}
-/*
- * XPath:
- * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/unnumbered-neighbor/afi-safis/afi-safi/enabled
- */
-int bgp_neighbors_unnumbered_neighbor_afi_safis_afi_safi_enabled_modify(
- struct nb_cb_modify_args *args)
+static struct peer *bgp_peer_group_peer_lookup(struct bgp *bgp,
+ const char *peer_str)
{
- switch (args->event) {
- case NB_EV_VALIDATE:
- case NB_EV_PREPARE:
- case NB_EV_ABORT:
- case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
- }
+ struct peer *peer = NULL;
+ struct peer_group *group = NULL;
- return NB_OK;
+ group = peer_group_lookup(bgp, peer_str);
+ return peer = group->conf;
}
/*
*/
int bgp_peer_groups_peer_group_create(struct nb_cb_create_args *args)
{
+ const char *peer_grp_str;
+ struct peer *peer;
+ struct peer_group *group;
+ struct bgp *bgp;
+ char unnbr_xpath[XPATH_MAXLEN];
+ const struct lyd_node *bgp_dnode;
+
switch (args->event) {
case NB_EV_VALIDATE:
+ peer_grp_str =
+ yang_dnode_get_string(args->dnode, "./peer-group-name");
+ bgp_dnode = yang_dnode_get_parent(args->dnode, "bgp");
+ snprintf(unnbr_xpath, sizeof(unnbr_xpath),
+ FRR_BGP_NEIGHBOR_UNNUM_XPATH, peer_grp_str, "");
+
+ if (yang_dnode_exists(bgp_dnode, unnbr_xpath)) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Name conflict with interface: %s",
+ peer_grp_str);
+ return NB_ERR_VALIDATION;
+ }
+
+ break;
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_grp_str =
+ yang_dnode_get_string(args->dnode, "./peer-group-name");
+ peer = peer_lookup_by_conf_if(bgp, peer_grp_str);
+ if (peer) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Name conflict with interface:");
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ group = peer_group_get(bgp, peer_grp_str);
+ if (!group) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "BGP failed to find or create peer-group");
+ return NB_ERR_INCONSISTENCY;
+ }
break;
}
int bgp_peer_groups_peer_group_destroy(struct nb_cb_destroy_args *args)
{
+ const char *peer_grp_str;
+ struct peer_group *group;
+ struct bgp *bgp;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_grp_str =
+ yang_dnode_get_string(args->dnode, "./peer-group-name");
+
+ group = peer_group_lookup(bgp, peer_grp_str);
+ if (group) {
+ peer_group_notify_unconfig(group);
+ peer_group_delete(group);
+ }
+
break;
}
*/
int bgp_peer_groups_peer_group_password_modify(struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *passwrd_str;
+ struct peer *peer = NULL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ passwrd_str = yang_dnode_get_string(args->dnode, NULL);
+ peer_password_set(peer, passwrd_str);
+
break;
}
int bgp_peer_groups_peer_group_password_destroy(struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer = NULL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ peer_password_unset(peer);
+
break;
}
int bgp_peer_groups_peer_group_ttl_security_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+ uint8_t gtsm_hops;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ gtsm_hops = yang_dnode_get_uint8(args->dnode, NULL);
+ /*
+ * If 'neighbor swpX', then this is for directly connected
+ * peers, we should not accept a ttl-security hops value greater
+ * than 1.
+ */
+ if (peer->conf_if && (gtsm_hops > BGP_GTSM_HOPS_CONNECTED)) {
+ snprintf(
+ args->errmsg, args->errmsg_len,
+ "%d is directly connected peer, hops cannot exceed 1\n",
+ gtsm_hops);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ ret = peer_ttl_security_hops_set(peer, gtsm_hops);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_ttl_security_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ttl_security_hops_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_enforce_first_as_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_ENFORCE_FIRST_AS, enable,
+ args->errmsg, args->errmsg_len);
+
break;
}
int bgp_peer_groups_peer_group_description_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *desc_str;
+ struct peer *peer = NULL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ desc_str = yang_dnode_get_string(args->dnode, NULL);
+
+ peer_description_set(peer, desc_str);
+
break;
}
int bgp_peer_groups_peer_group_description_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer = NULL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_description_unset(peer);
+
break;
}
int bgp_peer_groups_peer_group_passive_mode_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (peer_flag_modify_nb(bgp, peer_str, peer, PEER_FLAG_PASSIVE,
+ set, args->errmsg, args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_capability_options_dynamic_capability_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_DYNAMIC_CAPABILITY, enable,
+ args->errmsg, args->errmsg_len);
+
break;
}
int bgp_peer_groups_peer_group_capability_options_extended_nexthop_capability_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ enable = yang_dnode_get_bool(args->dnode, NULL);
+
+ peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_CAPABILITY_ENHE, enable,
+ args->errmsg, args->errmsg_len);
+
break;
}
int bgp_peer_groups_peer_group_update_source_ip_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str, *source_str;
+ struct peer *peer;
+ union sockunion su;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ source_str = yang_dnode_get_string(args->dnode, NULL);
+
+ str2sockunion(source_str, &su);
+ peer_update_source_addr_set(peer, &su);
+
break;
}
int bgp_peer_groups_peer_group_update_source_ip_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_update_source_unset(peer);
+
break;
}
int bgp_peer_groups_peer_group_update_source_interface_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str, *source_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ source_str = yang_dnode_get_string(args->dnode, NULL);
+
+ peer_update_source_if_set(peer, source_str);
+
break;
}
int bgp_peer_groups_peer_group_update_source_interface_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ peer_update_source_unset(peer);
+
break;
}
return NB_OK;
}
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/neighbor-remote-as
+ */
+void bgp_peer_group_neighbor_remote_as_apply_finish(
+ struct nb_cb_apply_finish_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ int as_type = AS_SPECIFIED;
+ int ret;
+ as_t as = 0;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../peer-group-name");
+ as_type = yang_dnode_get_enum(args->dnode, "./remote-as-type");
+ if (yang_dnode_exists(args->dnode, "./remote-as"))
+ as = yang_dnode_get_uint32(args->dnode, "./remote-as");
+
+ ret = peer_group_remote_as(bgp, peer_str, &as, as_type);
+ if (ret < 0) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Create the peer-group or interface first");
+ return;
+ }
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/neighbor-remote-as/remote-as-type
return NB_OK;
}
+int bgp_peer_groups_peer_group_neighbor_remote_as_remote_as_type_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer_group *group;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ group = peer_group_lookup(bgp, peer_str);
+ if (group)
+ peer_group_remote_as_delete(group);
+
+ break;
+ }
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/neighbor-remote-as/remote-as
int bgp_peer_groups_peer_group_ebgp_multihop_enabled_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+ int ret = 0;
+ uint8_t ttl = MAXTTL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ if (peer->conf_if) {
+ ret = BGP_ERR_INVALID_FOR_DIRECT_PEER;
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len,
+ ret);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (set)
+ ret = peer_ebgp_multihop_set(peer, ttl);
+ else
+ ret = peer_ebgp_multihop_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_ebgp_multihop_enabled_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ebgp_multihop_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_ebgp_multihop_multihop_ttl_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+ uint8_t ttl = MAXTTL;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ if (peer->conf_if) {
+ ret = BGP_ERR_INVALID_FOR_DIRECT_PEER;
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len,
+ ret);
+ return NB_ERR_INCONSISTENCY;
+ }
+
+ ttl = yang_dnode_get_uint8(args->dnode, NULL);
+
+ ret = peer_ebgp_multihop_set(peer, ttl);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_ebgp_multihop_multihop_ttl_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ ret = peer_ebgp_multihop_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_ebgp_multihop_disable_connected_check_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool set = false;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ if (!peer)
+ return NB_ERR_INCONSISTENCY;
+
+ set = yang_dnode_get_bool(args->dnode, NULL);
+
+ if (peer_flag_modify_nb(bgp, peer_str, peer,
+ PEER_FLAG_DISABLE_CONNECTED_CHECK, set,
+ args->errmsg, args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
return NB_OK;
}
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/local-as
+ */
+void bgp_peer_groups_peer_group_local_as_apply_finish(
+ struct nb_cb_apply_finish_args *args)
+{
+ struct bgp *bgp;
+ int ret;
+ as_t as = 0;
+ const char *peer_str;
+ struct peer *peer = NULL;
+ bool no_prepend = false;
+ bool replace_as = false;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../peer-group-name");
+
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ if (yang_dnode_exists(args->dnode, "./local-as"))
+ as = yang_dnode_get_uint32(args->dnode, "./local-as");
+
+ if (yang_dnode_exists(args->dnode, "./local-as"))
+ as = yang_dnode_get_uint32(args->dnode, "./local-as");
+ if (yang_dnode_exists(args->dnode, "./no-prepend"))
+ no_prepend = yang_dnode_get_bool(args->dnode, "./no-prepend");
+ if (yang_dnode_exists(args->dnode, "./no-replace-as"))
+ replace_as =
+ yang_dnode_get_bool(args->dnode, "./no-replace-as");
+
+ if (!as && !no_prepend && !replace_as)
+ ret = peer_local_as_unset(peer);
+ else
+ ret = peer_local_as_set(peer, as, no_prepend, replace_as);
+
+ bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret);
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/local-as/local-as
return NB_OK;
}
+int bgp_peer_groups_peer_group_local_as_local_as_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ ret = peer_local_as_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ break;
+ }
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/local-as/no-prepend
return NB_OK;
}
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/admin-shutdown
+ */
+void bgp_peer_groups_peer_group_admin_shutdown_apply_finish(
+ struct nb_cb_apply_finish_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ bool enable = false;
+ const char *message;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode, "../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ if (yang_dnode_exists(args->dnode, "./message")) {
+ message = yang_dnode_get_string(args->dnode, "./message");
+ peer_tx_shutdown_message_set(peer, message);
+ }
+ enable = yang_dnode_get_bool(args->dnode, "./enable");
+
+ peer_flag_modify_nb(bgp, peer_str, peer, PEER_FLAG_SHUTDOWN, enable,
+ args->errmsg, args->errmsg_len);
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/admin-shutdown/enable
return NB_OK;
}
+int bgp_peer_groups_peer_group_admin_shutdown_enable_destroy(
+ struct nb_cb_destroy_args *args)
+{
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ case NB_EV_APPLY:
+ /* TODO: implement me. */
+ break;
+ }
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/peer-groups/peer-group/admin-shutdown/message
int bgp_peer_groups_peer_group_timers_advertise_interval_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t routeadv;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ routeadv = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_advertise_interval_set(peer, routeadv);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_timers_advertise_interval_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ ret = peer_advertise_interval_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_timers_connect_time_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t connect;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+ connect = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_timers_connect_set(peer, connect);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_timers_connect_time_destroy(
struct nb_cb_destroy_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ int ret;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ ret = peer_timers_connect_unset(peer);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_timers_hold_time_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t keepalive = 0;
+ uint16_t holdtime = 0;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ keepalive = yang_dnode_get_uint16(args->dnode, "../keepalive");
+ holdtime = yang_dnode_get_uint16(args->dnode, NULL);
+
+ if (keepalive != BGP_DEFAULT_KEEPALIVE
+ && holdtime != BGP_DEFAULT_HOLDTIME) {
+ ret = peer_timers_set(peer, keepalive, holdtime);
+ } else
+ ret = peer_timers_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
int bgp_peer_groups_peer_group_timers_keepalive_modify(
struct nb_cb_modify_args *args)
{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ uint16_t keepalive = 0, curr_keep = 0;
+ uint16_t holdtime = 0;
+ int ret = 0;
+
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ keepalive = yang_dnode_get_uint16(args->dnode, NULL);
+ holdtime = yang_dnode_get_uint16(args->dnode, "../hold-time");
+
+ if (keepalive != BGP_DEFAULT_KEEPALIVE
+ && holdtime != BGP_DEFAULT_HOLDTIME) {
+ if (peer->holdtime == holdtime) {
+ curr_keep = (keepalive < holdtime / 3
+ ? keepalive
+ : holdtime / 3);
+ if (curr_keep == keepalive) {
+ // zlog_debug("%s holdtime %u keepalive
+ // %u value is already set, skipping
+ // update.",
+ // __func__, holdtime, keepalive);
+ return NB_OK;
+ }
+ }
+ ret = peer_timers_set(peer, keepalive, holdtime);
+ } else
+ ret = peer_timers_unset(peer);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
break;
}
*/
int bgp_peer_groups_peer_group_afi_safis_afi_safi_enabled_modify(
struct nb_cb_modify_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ const char *af_name;
+ afi_t afi;
+ safi_t safi;
+ bool activate = false;
+ int ret = 0;
+ struct peer *peer;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ af_name =
+ yang_dnode_get_string(args->dnode, "../afi-safi-name");
+ yang_afi_safi_identity2value(af_name, &afi, &safi);
+ peer_str = yang_dnode_get_string(args->dnode,
+ "../../../peer-group-name");
+ peer = bgp_peer_group_peer_lookup(bgp, peer_str);
+
+ activate = yang_dnode_get_bool(args->dnode, NULL);
+ if (activate)
+ ret = peer_activate(peer, afi, safi);
+ else
+ ret = peer_deactivate(peer, afi, safi);
+
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ break;
+ }
+
+ return NB_OK;
+}
+
+int bgp_peer_groups_peer_group_afi_safis_afi_safi_enabled_destroy(
+ struct nb_cb_destroy_args *args)
{
switch (args->event) {
case NB_EV_VALIDATE:
return NB_OK;
}
+static int bgp_neighbor_afi_safi_flag_modify(struct nb_cb_modify_args *args,
+ uint32_t flags, bool set)
+{
+ 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_af_flag_modify_nb(peer, afi, safi, flags, set, args->errmsg,
+ args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ return NB_OK;
+}
+
/*
* XPath:
* /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-bgp:bgp/neighbors/neighbor/afi-safis/afi-safi/ipv4-unicast/add-paths/path-type
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
+ 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/private-as/remove-private-as-replace
+ */
+int bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_unicast_private_as_remove_private_as_replace_modify(
+ struct nb_cb_modify_args *args)
+{
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ return NB_OK;
+ case NB_EV_APPLY:
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
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/private-as/remove-private-as-replace
- */
-int bgp_neighbors_neighbor_afi_safis_afi_safi_ipv4_unicast_private_as_remove_private_as_replace_modify(
- struct nb_cb_modify_args *args)
+static int bgp_neighbor_afi_safi_weight_modify(struct nb_cb_modify_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;
+ uint16_t weight;
+ afi_t afi;
+ safi_t safi;
+ int ret;
+
+ 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);
+
+ weight = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_weight_set(peer, afi, safi, weight);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret) < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ return NB_OK;
+}
+
+static int bgp_neighbor_afi_safi_weight_destroy(struct nb_cb_destroy_args *args)
{
- switch (args->event) {
- case NB_EV_VALIDATE:
- case NB_EV_PREPARE:
- case NB_EV_ABORT:
- case NB_EV_APPLY:
- /* TODO: implement me. */
- break;
- }
+ 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 ret;
+
+ 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);
+
+ ret = peer_weight_unset(peer, afi, safi);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret) < 0)
+ return NB_ERR_INCONSISTENCY;
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. */
+ return bgp_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
return NB_OK;
}
+static int
+bgp_unnumbered_neighbor_afi_safi_flag_modify(struct nb_cb_modify_args *args,
+ uint32_t flags, bool set)
+{
+ 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_af_flag_modify_nb(peer, afi, safi, flags, set, args->errmsg,
+ args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ 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/add-paths/path-type
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
return NB_OK;
}
+static int
+bgp_unnumbered_neighbor_afi_safi_weight_modify(struct nb_cb_modify_args *args)
+{
+ struct bgp *bgp;
+ const char *peer_str;
+ struct peer *peer;
+ const struct lyd_node *nbr_dnode;
+ const char *af_name;
+ uint16_t weight;
+ afi_t afi;
+ safi_t safi;
+ const struct lyd_node *nbr_af_dnode;
+ int ret;
+
+ 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);
+
+ weight = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_weight_set(peer, afi, safi, weight);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret) < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ return NB_OK;
+}
+
+static int
+bgp_unnumbered_neighbor_afi_safi_weight_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 ret;
+
+ bgp = nb_running_get_entry(args->dnode, NULL, true);
+ nbr_dnode = yang_dnode_get_parent(args->dnode, "unnumbered-neighbor");
+ peer_str = yang_dnode_get_string(nbr_dnode, "./interface");
+ peer = bgp_unnumbered_neighbor_peer_lookup(bgp, peer_str, args->errmsg,
+ args->errmsg_len);
+ 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);
+
+ ret = peer_weight_unset(peer, afi, safi);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret) < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ 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/weight/weight-attribute
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_unnumbered_neighbor_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
return NB_OK;
}
+static int bgp_peer_group_afi_safi_flag_modify(struct nb_cb_modify_args *args,
+ uint32_t flags, bool set)
+{
+ 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_af_flag_modify_nb(peer, afi, safi, flags, set, args->errmsg,
+ args->errmsg_len)
+ < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ 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/add-paths/path-type
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
return NB_OK;
}
+static int bgp_peer_group_afi_safi_weight_modify(struct nb_cb_modify_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;
+ uint16_t weight;
+ afi_t afi;
+ safi_t safi;
+ int ret;
+
+ 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(args->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);
+
+ weight = yang_dnode_get_uint16(args->dnode, NULL);
+
+ ret = peer_weight_set(peer, afi, safi, weight);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret) < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ return NB_OK;
+}
+
+static int
+bgp_peer_group_afi_safi_weight_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 ret;
+
+ 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);
+
+ ret = peer_weight_unset(peer, afi, safi);
+ if (bgp_nb_errmsg_return(args->errmsg, args->errmsg_len, ret) < 0)
+ return NB_ERR_INCONSISTENCY;
+
+ 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/weight/weight-attribute
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_EXT_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SEND_LARGE_COMMUNITY,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_modify(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_weight_destroy(args);
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_OVERRIDE,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_AS_PATH_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_MED_UNCHANGED,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_FORCE_NEXTHOP_SELF,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_REFLECTOR_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_RSERVER_CLIENT,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
+ return NB_OK;
case NB_EV_APPLY:
- /* TODO: implement me. */
+ return bgp_peer_group_afi_safi_flag_modify(
+ args, PEER_FLAG_SOFT_RECONFIG,
+ yang_dnode_get_bool(args->dnode, NULL));
+
break;
}
const char *ip_str,
afi_t afi, bool use_json);
+static int peer_and_group_lookup_nb(struct vty *vty, const char *peer_str,
+ char *base_xpath, int xpath_len,
+ char *abs_xpath);
+
static enum node_type bgp_node_type(afi_t afi, safi_t safi)
{
switch (afi) {
return *idx;
}
-static bool peer_address_self_check(struct bgp *bgp, union sockunion *su)
+bool peer_address_self_check(struct bgp *bgp, union sockunion *su)
{
struct interface *ifp = NULL;
return false;
}
-/* Utility function for looking up peer from VTY. */
-/* This is used only for configuration, so disallow if attempted on
- * a dynamic neighbor.
- */
-static struct peer *peer_lookup_vty(struct vty *vty, const char *ip_str)
-{
- struct bgp *bgp = VTY_GET_CONTEXT(bgp);
- int ret;
- union sockunion su;
- struct peer *peer;
-
- if (!bgp) {
- return NULL;
- }
-
- ret = str2sockunion(ip_str, &su);
- if (ret < 0) {
- peer = peer_lookup_by_conf_if(bgp, ip_str);
- if (!peer) {
- if ((peer = peer_lookup_by_hostname(bgp, ip_str))
- == NULL) {
- vty_out(vty,
- "%% Malformed address or name: %s\n",
- ip_str);
- return NULL;
- }
- }
- } else {
- peer = peer_lookup(bgp, &su);
- if (!peer) {
- vty_out(vty,
- "%% Specify remote-as or peer-group commands first\n");
- return NULL;
- }
- if (peer_dynamic_neighbor(peer)) {
- vty_out(vty,
- "%% Operation not allowed on a dynamic neighbor\n");
- return NULL;
- }
- }
- return peer;
-}
-
/* Utility function for looking up peer or peer group. */
/* This is used only for configuration, so disallow if attempted on
* a dynamic neighbor.
return NULL;
}
+int bgp_nb_errmsg_return(char *errmsg, size_t errmsg_len, int ret)
+{
+ const char *str = NULL;
+
+ switch (ret) {
+ case BGP_ERR_INVALID_VALUE:
+ str = "Invalid value";
+ break;
+ case BGP_ERR_INVALID_FLAG:
+ str = "Invalid flag";
+ break;
+ case BGP_ERR_PEER_GROUP_SHUTDOWN:
+ str = "Peer-group has been shutdown. Activate the peer-group first";
+ break;
+ case BGP_ERR_PEER_FLAG_CONFLICT:
+ str = "Can't set override-capability and strict-capability-match at the same time";
+ break;
+ case BGP_ERR_PEER_GROUP_NO_REMOTE_AS:
+ str = "Specify remote-as or peer-group remote AS first";
+ break;
+ case BGP_ERR_PEER_GROUP_CANT_CHANGE:
+ str = "Cannot change the peer-group. Deconfigure first";
+ break;
+ case BGP_ERR_PEER_GROUP_MISMATCH:
+ str = "Peer is not a member of this peer-group";
+ break;
+ case BGP_ERR_PEER_FILTER_CONFLICT:
+ str = "Prefix/distribute list can not co-exist";
+ break;
+ case BGP_ERR_NOT_INTERNAL_PEER:
+ str = "Invalid command. Not an internal neighbor";
+ break;
+ case BGP_ERR_REMOVE_PRIVATE_AS:
+ str = "remove-private-AS cannot be configured for IBGP peers";
+ break;
+ case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP:
+ str = "Local-AS allowed only for EBGP peers";
+ break;
+ case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS:
+ str = "Cannot have local-as same as BGP AS number";
+ break;
+ case BGP_ERR_TCPSIG_FAILED:
+ str = "Error while applying TCP-Sig to session(s)";
+ break;
+ case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK:
+ str = "ebgp-multihop and ttl-security cannot be configured together";
+ break;
+ case BGP_ERR_NO_IBGP_WITH_TTLHACK:
+ str = "ttl-security only allowed for EBGP peers";
+ break;
+ case BGP_ERR_AS_OVERRIDE:
+ str = "as-override cannot be configured for IBGP peers";
+ break;
+ case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT:
+ str = "Invalid limit for number of dynamic neighbors";
+ break;
+ case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS:
+ str = "Dynamic neighbor listen range already exists";
+ break;
+ case BGP_ERR_INVALID_FOR_DYNAMIC_PEER:
+ str = "Operation not allowed on a dynamic neighbor";
+ break;
+ case BGP_ERR_INVALID_FOR_DIRECT_PEER:
+ str = "Operation not allowed on a directly connected neighbor";
+ break;
+ case BGP_ERR_PEER_SAFI_CONFLICT:
+ str = GR_INVALID;
+ break;
+ case BGP_ERR_GR_INVALID_CMD:
+ str = "The Graceful Restart command used is not valid at this moment.";
+ break;
+ case BGP_ERR_GR_OPERATION_FAILED:
+ str = "The Graceful Restart Operation failed due to an err.";
+ break;
+ case BGP_GR_NO_OPERATION:
+ str = GR_NO_OPER;
+ break;
+ case BGP_ERR_PEER_GROUP_MEMBER:
+ str = "Peer-group member cannot override remote-as of peer-group";
+ break;
+ case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT:
+ str = "Peer-group members must be all internal or all external";
+ break;
+ }
+ if (str) {
+ snprintf(errmsg, errmsg_len, "%s", str);
+ return -1;
+ }
+
+ return 0;
+}
+
int bgp_vty_return(struct vty *vty, int ret)
{
const char *str = NULL;
vty_out(vty, " bgp disable-ebgp-connected-route-check\n");
}
-static int peer_remote_as_vty(struct vty *vty, const char *peer_str,
- const char *as_str, afi_t afi, safi_t safi)
-{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
- int ret;
- as_t as;
- int as_type = AS_SPECIFIED;
- union sockunion su;
-
- if (as_str[0] == 'i') {
- as = 0;
- as_type = AS_INTERNAL;
- } else if (as_str[0] == 'e') {
- as = 0;
- as_type = AS_EXTERNAL;
- } else {
- /* Get AS number. */
- as = strtoul(as_str, NULL, 10);
- }
-
- /* If peer is peer group or interface peer, call proper function. */
- ret = str2sockunion(peer_str, &su);
- if (ret < 0) {
- struct peer *peer;
-
- /* Check if existing interface peer */
- peer = peer_lookup_by_conf_if(bgp, peer_str);
-
- ret = peer_remote_as(bgp, NULL, peer_str, &as, as_type, afi,
- safi);
-
- /* if not interface peer, check peer-group settings */
- if (ret < 0 && !peer) {
- ret = peer_group_remote_as(bgp, peer_str, &as, as_type);
- if (ret < 0) {
- vty_out(vty,
- "%% Create the peer-group or interface first\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
- return CMD_SUCCESS;
- }
- } else {
- if (peer_address_self_check(bgp, &su)) {
- vty_out(vty,
- "%% Can not configure the local system as neighbor\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
- ret = peer_remote_as(bgp, &su, NULL, &as, as_type, afi, safi);
- }
-
- /* This peer belongs to peer group. */
- switch (ret) {
- case BGP_ERR_PEER_GROUP_MEMBER:
- vty_out(vty,
- "%% Peer-group member cannot override remote-as of peer-group\n");
- return CMD_WARNING_CONFIG_FAILED;
- case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT:
- vty_out(vty,
- "%% Peer-group members must be all internal or all external\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
- return bgp_vty_return(vty, ret);
-}
-
DEFUN_YANG(bgp_default_shutdown,
bgp_default_shutdown_cmd,
"[no] bgp default shutdown",
"Administrative shutdown of the BGP instance\n"
"Add a shutdown message (RFC 8203)\n" "Shutdown message\n")
-DEFUN (neighbor_remote_as,
- neighbor_remote_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Specify a BGP neighbor\n"
- AS_STR
- "Internal BGP peer\n"
- "External BGP peer\n")
+DEFUN_YANG(neighbor_remote_as,
+ neighbor_remote_as_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Specify a BGP neighbor\n" AS_STR
+ "Internal BGP peer\n"
+ "External BGP peer\n")
{
int idx_peer = 1;
int idx_remote_as = 3;
- return peer_remote_as_vty(vty, argv[idx_peer]->arg,
- argv[idx_remote_as]->arg, AFI_IP,
- SAFI_UNICAST);
+ char base_xpath[XPATH_MAXLEN];
+ char unnbr_xpath[XPATH_MAXLEN];
+ char prgrp_xpath[XPATH_MAXLEN];
+ union sockunion su;
+ const char *as_type_str = "as-specified";
+
+ if (str2sockunion(argv[idx_peer]->arg, &su) < 0) {
+ snprintf(unnbr_xpath, sizeof(unnbr_xpath),
+ FRR_BGP_NEIGHBOR_UNNUM_XPATH, argv[idx_peer]->arg, "");
+
+ snprintf(prgrp_xpath, sizeof(prgrp_xpath),
+ FRR_BGP_PEER_GROUP_XPATH, argv[idx_peer]->arg, "");
+
+ if (yang_dnode_exists(vty->candidate_config->dnode, "%s%s",
+ VTY_CURR_XPATH, unnbr_xpath + 1)) {
+ strlcpy(base_xpath, unnbr_xpath, sizeof(base_xpath));
+ } else if (yang_dnode_exists(vty->candidate_config->dnode,
+ "%s%s", VTY_CURR_XPATH,
+ prgrp_xpath + 1)) {
+ snprintf(base_xpath, sizeof(base_xpath),
+ FRR_BGP_PEER_GROUP_XPATH, argv[idx_peer]->arg,
+ "");
+ } else {
+ vty_out(vty,
+ "%% Create the peer-group or interface first\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+ } else {
+ snprintf(base_xpath, sizeof(base_xpath),
+ FRR_BGP_NEIGHBOR_NUM_XPATH, argv[idx_peer]->arg, "");
+ }
+
+ if (argv[idx_remote_as]->arg[0] == 'i') {
+ as_type_str = "internal";
+ } else if (argv[idx_remote_as]->arg[0] == 'e') {
+ as_type_str = "external";
+ } else {
+ nb_cli_enqueue_change(vty, "./neighbor-remote-as/remote-as",
+ NB_OP_MODIFY, argv[idx_remote_as]->arg);
+ }
+ nb_cli_enqueue_change(vty, "./neighbor-remote-as/remote-as-type",
+ NB_OP_MODIFY, as_type_str);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
- afi_t afi, safi_t safi, int v6only,
- const char *peer_group_name,
- const char *as_str)
+int peer_conf_interface_create(struct bgp *bgp, const char *conf_if, afi_t afi,
+ safi_t safi, bool v6only,
+ const char *peer_group_name, int as_type,
+ as_t as, char *errmsg, size_t errmsg_len)
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
- as_t as = 0;
- int as_type = AS_UNSPECIFIED;
struct peer *peer;
struct peer_group *group;
int ret = 0;
group = peer_group_lookup(bgp, conf_if);
if (group) {
- vty_out(vty, "%% Name conflict with peer-group \n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- if (as_str) {
- if (as_str[0] == 'i') {
- as_type = AS_INTERNAL;
- } else if (as_str[0] == 'e') {
- as_type = AS_EXTERNAL;
- } else {
- /* Get AS number. */
- as = strtoul(as_str, NULL, 10);
- as_type = AS_SPECIFIED;
- }
+ snprintf(errmsg, errmsg_len,
+ "Name conflict with peer-group \n");
+ return -1;
}
peer = peer_lookup_by_conf_if(bgp, conf_if);
if (peer) {
- if (as_str)
+ if (as_type != AS_UNSPECIFIED)
ret = peer_remote_as(bgp, NULL, conf_if, &as, as_type,
afi, safi);
} else {
as_type, afi, safi, NULL);
if (!peer) {
- vty_out(vty, "%% BGP failed to create peer\n");
- return CMD_WARNING_CONFIG_FAILED;
+ snprintf(errmsg, errmsg_len,
+ "BGP failed to create peer\n");
+ return -1;
}
if (v6only)
if (peer_group_name) {
group = peer_group_lookup(bgp, peer_group_name);
if (!group) {
- vty_out(vty, "%% Configure the peer-group first\n");
- return CMD_WARNING_CONFIG_FAILED;
+ snprintf(errmsg, errmsg_len,
+ "Configure the peer-group first\n");
+ return -1;
}
ret = peer_group_bind(bgp, &su, peer, group, &as);
}
- return bgp_vty_return(vty, ret);
+ return bgp_nb_errmsg_return(errmsg, errmsg_len, ret);
}
-DEFUN (neighbor_interface_config,
- neighbor_interface_config_cmd,
- "neighbor WORD interface [peer-group PGNAME]",
- NEIGHBOR_STR
- "Interface name or neighbor tag\n"
- "Enable BGP on interface\n"
- "Member of the peer-group\n"
- "Peer-group name\n")
+DEFUN_YANG(neighbor_interface_config, neighbor_interface_config_cmd,
+ "neighbor WORD interface [peer-group PGNAME]",
+ NEIGHBOR_STR
+ "Interface name or neighbor tag\n"
+ "Enable BGP on interface\n"
+ "Member of the peer-group\n"
+ "Peer-group name\n")
{
int idx_word = 1;
int idx_peer_group_word = 4;
+ char base_xpath[XPATH_MAXLEN];
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_UNNUM_XPATH,
+ argv[idx_word]->arg, "");
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
if (argc > idx_peer_group_word)
- return peer_conf_interface_get(
- vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 0,
- argv[idx_peer_group_word]->arg, NULL);
- else
- return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
- SAFI_UNICAST, 0, NULL, NULL);
+ nb_cli_enqueue_change(vty, "./peer-group", NB_OP_MODIFY,
+ argv[idx_peer_group_word]->arg);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (neighbor_interface_config_v6only,
- neighbor_interface_config_v6only_cmd,
- "neighbor WORD interface v6only [peer-group PGNAME]",
- NEIGHBOR_STR
- "Interface name or neighbor tag\n"
- "Enable BGP on interface\n"
- "Enable BGP with v6 link-local only\n"
- "Member of the peer-group\n"
- "Peer-group name\n")
+DEFUN_YANG(neighbor_interface_config_v6only,
+ neighbor_interface_config_v6only_cmd,
+ "neighbor WORD interface v6only [peer-group PGNAME]",
+ NEIGHBOR_STR
+ "Interface name or neighbor tag\n"
+ "Enable BGP on interface\n"
+ "Enable BGP with v6 link-local only\n"
+ "Member of the peer-group\n"
+ "Peer-group name\n")
{
int idx_word = 1;
int idx_peer_group_word = 5;
+ char base_xpath[XPATH_MAXLEN];
+
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_UNNUM_XPATH,
+ argv[idx_word]->arg, "");
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
if (argc > idx_peer_group_word)
- return peer_conf_interface_get(
- vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 1,
- argv[idx_peer_group_word]->arg, NULL);
+ nb_cli_enqueue_change(vty, "./peer-group", NB_OP_MODIFY,
+ argv[idx_peer_group_word]->arg);
+
+ nb_cli_enqueue_change(vty, "./v6only", NB_OP_MODIFY, "true");
- return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
- SAFI_UNICAST, 1, NULL, NULL);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (neighbor_interface_config_remote_as,
- neighbor_interface_config_remote_as_cmd,
- "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
- NEIGHBOR_STR
- "Interface name or neighbor tag\n"
- "Enable BGP on interface\n"
- "Specify a BGP neighbor\n"
- AS_STR
- "Internal BGP peer\n"
- "External BGP peer\n")
+DEFUN_YANG(
+ neighbor_interface_config_remote_as,
+ neighbor_interface_config_remote_as_cmd,
+ "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
+ NEIGHBOR_STR
+ "Interface name or neighbor tag\n"
+ "Enable BGP on interface\n"
+ "Specify a BGP neighbor\n" AS_STR
+ "Internal BGP peer\n"
+ "External BGP peer\n")
{
int idx_word = 1;
int idx_remote_as = 4;
- return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
- SAFI_UNICAST, 0, NULL,
- argv[idx_remote_as]->arg);
+ char base_xpath[XPATH_MAXLEN];
+ const char *as_type_str = "as-specified";
+
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_UNNUM_XPATH,
+ argv[idx_word]->arg, "");
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
+
+ if (argv[idx_remote_as]->arg[0] == 'i') {
+ as_type_str = "internal";
+ } else if (argv[idx_remote_as]->arg[0] == 'e') {
+ as_type_str = "external";
+ } else {
+ nb_cli_enqueue_change(vty, "./neighbor-remote-as/remote-as",
+ NB_OP_MODIFY, argv[idx_remote_as]->arg);
+ }
+ nb_cli_enqueue_change(vty, "./neighbor-remote-as/remote-as-type",
+ NB_OP_MODIFY, as_type_str);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (neighbor_interface_v6only_config_remote_as,
- neighbor_interface_v6only_config_remote_as_cmd,
- "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
- NEIGHBOR_STR
- "Interface name or neighbor tag\n"
- "Enable BGP with v6 link-local only\n"
- "Enable BGP on interface\n"
- "Specify a BGP neighbor\n"
- AS_STR
- "Internal BGP peer\n"
- "External BGP peer\n")
+DEFUN_YANG(
+ neighbor_interface_v6only_config_remote_as,
+ neighbor_interface_v6only_config_remote_as_cmd,
+ "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
+ NEIGHBOR_STR
+ "Interface name or neighbor tag\n"
+ "Enable BGP with v6 link-local only\n"
+ "Enable BGP on interface\n"
+ "Specify a BGP neighbor\n" AS_STR
+ "Internal BGP peer\n"
+ "External BGP peer\n")
{
int idx_word = 1;
int idx_remote_as = 5;
- return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
- SAFI_UNICAST, 1, NULL,
- argv[idx_remote_as]->arg);
-}
+ char base_xpath[XPATH_MAXLEN];
+ const char *as_type_str = "as-specified";
-DEFUN (neighbor_peer_group,
- neighbor_peer_group_cmd,
- "neighbor WORD peer-group",
- NEIGHBOR_STR
- "Interface name or neighbor tag\n"
- "Configure peer-group\n")
-{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
- int idx_word = 1;
- struct peer *peer;
- struct peer_group *group;
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_UNNUM_XPATH,
+ argv[idx_word]->arg, "");
- peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
- if (peer) {
- vty_out(vty, "%% Name conflict with interface: \n");
- return CMD_WARNING_CONFIG_FAILED;
- }
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
- group = peer_group_get(bgp, argv[idx_word]->arg);
- if (!group) {
- vty_out(vty, "%% BGP failed to find or create peer-group\n");
- return CMD_WARNING_CONFIG_FAILED;
+ nb_cli_enqueue_change(vty, "./v6only", NB_OP_MODIFY, "true");
+
+ if (argv[idx_remote_as]->arg[0] == 'i') {
+ as_type_str = "internal";
+ } else if (argv[idx_remote_as]->arg[0] == 'e') {
+ as_type_str = "external";
+ } else {
+ nb_cli_enqueue_change(vty, "./neighbor-remote-as/remote-as",
+ NB_OP_MODIFY, argv[idx_remote_as]->arg);
}
+ nb_cli_enqueue_change(vty, "./neighbor-remote-as/remote-as-type",
+ NB_OP_MODIFY, as_type_str);
- return CMD_SUCCESS;
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor,
- no_neighbor_cmd,
- "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
- NO_STR
+DEFUN_YANG(neighbor_peer_group, neighbor_peer_group_cmd,
+ "neighbor WORD peer-group",
+ NEIGHBOR_STR
+ "Interface name or neighbor tag\n"
+ "Configure peer-group\n")
+{
+ char base_xpath[XPATH_MAXLEN];
+ int idx_word = 1;
+
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_PEER_GROUP_XPATH,
+ argv[idx_word]->arg, "");
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
+}
+
+DEFUN (no_neighbor,
+ no_neighbor_cmd,
+ "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
+ NO_STR
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
"Specify a BGP neighbor\n"
"Internal BGP peer\n"
"External BGP peer\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_peer = 2;
- int ret;
+ char base_xpath[XPATH_MAXLEN];
+ char num_xpath[XPATH_MAXLEN];
+ char unnbr_xpath[XPATH_MAXLEN];
+ char prgrp_xpath[XPATH_MAXLEN];
union sockunion su;
- struct peer_group *group;
- struct peer *peer;
- struct peer *other;
- ret = str2sockunion(argv[idx_peer]->arg, &su);
- if (ret < 0) {
- /* look up for neighbor by interface name config. */
- peer = peer_lookup_by_conf_if(bgp, argv[idx_peer]->arg);
- if (peer) {
- /* Request zebra to terminate IPv6 RAs on this
- * interface. */
- if (peer->ifp)
- bgp_zebra_terminate_radv(peer->bgp, peer);
- peer_notify_unconfig(peer);
- peer_delete(peer);
- return CMD_SUCCESS;
+ if (str2sockunion(argv[idx_peer]->arg, &su) == 0) {
+ snprintf(num_xpath, sizeof(num_xpath),
+ FRR_BGP_NEIGHBOR_NUM_XPATH, argv[idx_peer]->arg, "");
+ if (yang_dnode_exists(vty->candidate_config->dnode, "%s%s",
+ VTY_CURR_XPATH, num_xpath + 1)) {
+ strlcpy(base_xpath, num_xpath, sizeof(base_xpath));
}
-
- group = peer_group_lookup(bgp, argv[idx_peer]->arg);
- if (group) {
- peer_group_notify_unconfig(group);
- peer_group_delete(group);
+ } else {
+ snprintf(unnbr_xpath, sizeof(unnbr_xpath),
+ FRR_BGP_NEIGHBOR_UNNUM_XPATH, argv[idx_peer]->arg, "");
+
+ snprintf(prgrp_xpath, sizeof(prgrp_xpath),
+ FRR_BGP_PEER_GROUP_XPATH, argv[idx_peer]->arg, "");
+
+ if (yang_dnode_exists(vty->candidate_config->dnode, "%s%s",
+ VTY_CURR_XPATH, unnbr_xpath + 1)) {
+ strlcpy(base_xpath, unnbr_xpath, sizeof(base_xpath));
+ } else if (yang_dnode_exists(vty->candidate_config->dnode,
+ "%s%s", VTY_CURR_XPATH,
+ prgrp_xpath + 1)) {
+ strlcpy(base_xpath, prgrp_xpath, sizeof(base_xpath));
} else {
- vty_out(vty, "%% Create the peer-group first\n");
+ vty_out(vty,
+ "%% Create the peer-group or interface first\n");
return CMD_WARNING_CONFIG_FAILED;
}
- } else {
- peer = peer_lookup(bgp, &su);
- if (peer) {
- if (peer_dynamic_neighbor(peer)) {
- vty_out(vty,
- "%% Operation not allowed on a dynamic neighbor\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- other = peer->doppelganger;
-
- if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE))
- bgp_zebra_terminate_radv(peer->bgp, peer);
-
- peer_notify_unconfig(peer);
- peer_delete(peer);
- if (other && other->status != Deleted) {
- peer_notify_unconfig(other);
- peer_delete(other);
- }
- }
}
- return CMD_SUCCESS;
+ nb_cli_enqueue_change(vty, base_xpath, NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, NULL);
}
-DEFUN (no_neighbor_interface_config,
- no_neighbor_interface_config_cmd,
- "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
- NO_STR
- NEIGHBOR_STR
- "Interface name\n"
- "Configure BGP on interface\n"
- "Enable BGP with v6 link-local only\n"
- "Member of the peer-group\n"
- "Peer-group name\n"
- "Specify a BGP neighbor\n"
- AS_STR
- "Internal BGP peer\n"
- "External BGP peer\n")
+DEFUN_YANG(no_neighbor_interface_config,
+ no_neighbor_interface_config_cmd,
+ "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
+ NO_STR NEIGHBOR_STR
+ "Interface name\n"
+ "Configure BGP on interface\n"
+ "Enable BGP with v6 link-local only\n"
+ "Member of the peer-group\n"
+ "Peer-group name\n"
+ "Specify a BGP neighbor\n" AS_STR
+ "Internal BGP peer\n"
+ "External BGP peer\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_word = 2;
- struct peer *peer;
+ char base_xpath[XPATH_MAXLEN];
- /* look up for neighbor by interface name config. */
- peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
- if (peer) {
- /* Request zebra to terminate IPv6 RAs on this interface. */
- if (peer->ifp)
- bgp_zebra_terminate_radv(peer->bgp, peer);
- peer_notify_unconfig(peer);
- peer_delete(peer);
- } else {
- vty_out(vty, "%% Create the bgp interface first\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
- return CMD_SUCCESS;
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_UNNUM_XPATH,
+ argv[idx_word]->arg, "");
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_peer_group,
- no_neighbor_peer_group_cmd,
- "no neighbor WORD peer-group",
- NO_STR
- NEIGHBOR_STR
- "Neighbor tag\n"
- "Configure peer-group\n")
+DEFUN_YANG(no_neighbor_peer_group,
+ no_neighbor_peer_group_cmd,
+ "no neighbor WORD peer-group",
+ NO_STR NEIGHBOR_STR
+ "Neighbor tag\n"
+ "Configure peer-group\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
+ char base_xpath[XPATH_MAXLEN];
int idx_word = 2;
- struct peer_group *group;
- group = peer_group_lookup(bgp, argv[idx_word]->arg);
- if (group) {
- peer_group_notify_unconfig(group);
- peer_group_delete(group);
- } else {
- vty_out(vty, "%% Create the peer-group first\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
- return CMD_SUCCESS;
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_PEER_GROUP_XPATH,
+ argv[idx_word]->arg, "");
+
+ nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_interface_peer_group_remote_as,
- no_neighbor_interface_peer_group_remote_as_cmd,
- "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
- NO_STR
- NEIGHBOR_STR
- "Interface name or neighbor tag\n"
- "Specify a BGP neighbor\n"
- AS_STR
- "Internal BGP peer\n"
- "External BGP peer\n")
+DEFUN_YANG(no_neighbor_interface_peer_group_remote_as,
+ no_neighbor_interface_peer_group_remote_as_cmd,
+ "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
+ NO_STR NEIGHBOR_STR
+ "Interface name or neighbor tag\n"
+ "Specify a BGP neighbor\n" AS_STR
+ "Internal BGP peer\n"
+ "External BGP peer\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
- int idx_word = 2;
- struct peer_group *group;
- struct peer *peer;
+ int idx_peer = 2;
+ char base_xpath[XPATH_MAXLEN];
+ char unnbr_xpath[XPATH_MAXLEN];
+ char prgrp_xpath[XPATH_MAXLEN];
- /* look up for neighbor by interface name config. */
- peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
- if (peer) {
- peer_as_change(peer, 0, AS_UNSPECIFIED);
- return CMD_SUCCESS;
- }
+ snprintf(unnbr_xpath, sizeof(unnbr_xpath), FRR_BGP_NEIGHBOR_UNNUM_XPATH,
+ argv[idx_peer]->arg, "");
- group = peer_group_lookup(bgp, argv[idx_word]->arg);
- if (group)
- peer_group_remote_as_delete(group);
- else {
+ snprintf(prgrp_xpath, sizeof(prgrp_xpath), FRR_BGP_PEER_GROUP_XPATH,
+ argv[idx_peer]->arg, "");
+
+ if (yang_dnode_exists(vty->candidate_config->dnode, "%s%s",
+ VTY_CURR_XPATH, unnbr_xpath + 1)) {
+ strlcpy(base_xpath, unnbr_xpath, sizeof(base_xpath));
+ } else if (yang_dnode_exists(vty->candidate_config->dnode, "%s%s",
+ VTY_CURR_XPATH, prgrp_xpath + 1)) {
+ strlcpy(base_xpath, prgrp_xpath, sizeof(base_xpath));
+ } else {
vty_out(vty, "%% Create the peer-group or interface first\n");
return CMD_WARNING_CONFIG_FAILED;
}
- return CMD_SUCCESS;
+
+ strlcat(base_xpath, "/neighbor-remote-as/remote-as-type",
+ sizeof(base_xpath));
+
+ nb_cli_enqueue_change(vty, base_xpath, NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, NULL);
}
-DEFUN (neighbor_local_as,
- neighbor_local_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Specify a local-as number\n"
- "AS number used as local AS\n")
+DEFUN_YANG(neighbor_local_as,
+ neighbor_local_as_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n"
+ "AS number used as local AS\n")
{
int idx_peer = 1;
int idx_number = 3;
- struct peer *peer;
- int ret;
- as_t as;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- as = strtoul(argv[idx_number]->arg, NULL, 10);
- ret = peer_local_as_set(peer, as, 0, 0);
- return bgp_vty_return(vty, ret);
+ nb_cli_enqueue_change(vty, "./local-as/local-as", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (neighbor_local_as_no_prepend,
- neighbor_local_as_no_prepend_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Specify a local-as number\n"
- "AS number used as local AS\n"
- "Do not prepend local-as to updates from ebgp peers\n")
+DEFUN_YANG(
+ neighbor_local_as_no_prepend, neighbor_local_as_no_prepend_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n"
+ "AS number used as local AS\n"
+ "Do not prepend local-as to updates from ebgp peers\n")
{
int idx_peer = 1;
int idx_number = 3;
- struct peer *peer;
- int ret;
- as_t as;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- as = strtoul(argv[idx_number]->arg, NULL, 10);
- ret = peer_local_as_set(peer, as, 1, 0);
- return bgp_vty_return(vty, ret);
+ nb_cli_enqueue_change(vty, "./local-as/local-as", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+ nb_cli_enqueue_change(vty, "./local-as/no-prepend", NB_OP_MODIFY,
+ "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (neighbor_local_as_no_prepend_replace_as,
- neighbor_local_as_no_prepend_replace_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Specify a local-as number\n"
- "AS number used as local AS\n"
- "Do not prepend local-as to updates from ebgp peers\n"
- "Do not prepend local-as to updates from ibgp peers\n")
+DEFUN_YANG(
+ neighbor_local_as_no_prepend_replace_as,
+ neighbor_local_as_no_prepend_replace_as_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n"
+ "AS number used as local AS\n"
+ "Do not prepend local-as to updates from ebgp peers\n"
+ "Do not prepend local-as to updates from ibgp peers\n")
{
int idx_peer = 1;
int idx_number = 3;
- struct peer *peer;
- int ret;
- as_t as;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- as = strtoul(argv[idx_number]->arg, NULL, 10);
- ret = peer_local_as_set(peer, as, 1, 1);
- return bgp_vty_return(vty, ret);
+ nb_cli_enqueue_change(vty, "./local-as/local-as", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+ nb_cli_enqueue_change(vty, "./local-as/no-prepend", NB_OP_MODIFY,
+ "true");
+ nb_cli_enqueue_change(vty, "./local-as/no-replace-as", NB_OP_MODIFY,
+ "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_local_as,
- no_neighbor_local_as_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Specify a local-as number\n"
- "AS number used as local AS\n"
- "Do not prepend local-as to updates from ebgp peers\n"
- "Do not prepend local-as to updates from ibgp peers\n")
+DEFUN_YANG(no_neighbor_local_as,
+ no_neighbor_local_as_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n"
+ "AS number used as local AS\n"
+ "Do not prepend local-as to updates from ebgp peers\n"
+ "Do not prepend local-as to updates from ibgp peers\n")
{
int idx_peer = 2;
- struct peer *peer;
- int ret;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- ret = peer_local_as_unset(peer);
- return bgp_vty_return(vty, ret);
+ nb_cli_enqueue_change(vty, "./local-as/local-as", NB_OP_DESTROY, NULL);
+ nb_cli_enqueue_change(vty, "./local-as/no-prepend", NB_OP_MODIFY,
+ "false");
+ nb_cli_enqueue_change(vty, "./local-as/no-replace-as", NB_OP_MODIFY,
+ "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
return bgp_vty_return(vty, ret);
}
-DEFUN (neighbor_password,
- neighbor_password_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Set a password\n"
- "The password\n")
+DEFUN_YANG(neighbor_password,
+ neighbor_password_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Set a password\n"
+ "The password\n")
{
int idx_peer = 1;
int idx_line = 3;
- struct peer *peer;
- int ret;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- ret = peer_password_set(peer, argv[idx_line]->arg);
- return bgp_vty_return(vty, ret);
+ nb_cli_enqueue_change(vty, "./password", NB_OP_MODIFY,
+ argv[idx_line]->arg);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_password,
- no_neighbor_password_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Set a password\n"
- "The password\n")
+DEFUN_YANG(no_neighbor_password,
+ no_neighbor_password_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Set a password\n"
+ "The password\n")
{
int idx_peer = 2;
- struct peer *peer;
- int ret;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- ret = peer_password_unset(peer);
- return bgp_vty_return(vty, ret);
+ nb_cli_enqueue_change(vty, "./password", NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (neighbor_activate,
- neighbor_activate_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Enable the Address Family for this Neighbor\n")
+DEFUN_YANG(neighbor_activate,
+ neighbor_activate_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Enable the Address Family for this Neighbor\n")
{
int idx_peer = 1;
- int ret;
- struct peer *peer;
+ char base_xpath[XPATH_MAXLEN];
+ char abs_xpath[XPATH_MAXLEN];
+ char nbr_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ 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, nbr_xpath,
+ sizeof(nbr_xpath), af_xpath)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- ret = peer_activate(peer, bgp_node_afi(vty), bgp_node_safi(vty));
- return bgp_vty_return(vty, ret);
+ snprintf(base_xpath, sizeof(base_xpath), "%s%s", VTY_CURR_XPATH,
+ nbr_xpath + 1);
+
+ snprintf(abs_xpath, sizeof(abs_xpath), "%s%s/enabled", VTY_CURR_XPATH,
+ nbr_xpath + 1);
+
+ nb_cli_enqueue_change(vty, abs_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_activate, neighbor_activate_hidden_cmd,
NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Enable the Address Family for this Neighbor\n")
-DEFUN (no_neighbor_activate,
- no_neighbor_activate_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Enable the Address Family for this Neighbor\n")
+DEFUN_YANG(no_neighbor_activate,
+ no_neighbor_activate_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
+ NO_STR NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Enable the Address Family for this Neighbor\n")
{
int idx_peer = 2;
- int ret;
- struct peer *peer;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ afi_t afi = bgp_node_afi(vty);
+ safi_t safi = bgp_node_safi(vty);
- /* Lookup peer. */
- 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;
- ret = peer_deactivate(peer, bgp_node_afi(vty), bgp_node_safi(vty));
- return bgp_vty_return(vty, ret);
+ nb_cli_enqueue_change(vty, "./enabled", NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_activate, no_neighbor_activate_hidden_cmd,
NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Enable the Address Family for this Neighbor\n")
-DEFUN (neighbor_set_peer_group,
- neighbor_set_peer_group_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Member of the peer-group\n"
- "Peer-group name\n")
+DEFUN_YANG (neighbor_set_peer_group,
+ neighbor_set_peer_group_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Member of the peer-group\n"
+ "Peer-group name\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_peer = 1;
int idx_word = 3;
- int ret;
- as_t as;
- union sockunion su;
- struct peer *peer;
- struct peer_group *group;
-
- ret = str2sockunion(argv[idx_peer]->arg, &su);
- if (ret < 0) {
- peer = peer_lookup_by_conf_if(bgp, argv[idx_peer]->arg);
- if (!peer) {
- vty_out(vty, "%% Malformed address or name: %s\n",
- argv[idx_peer]->arg);
- return CMD_WARNING_CONFIG_FAILED;
- }
- } else {
- if (peer_address_self_check(bgp, &su)) {
- vty_out(vty,
- "%% Can not configure the local system as neighbor\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- /* Disallow for dynamic neighbor. */
- peer = peer_lookup(bgp, &su);
- if (peer && peer_dynamic_neighbor(peer)) {
- vty_out(vty,
- "%% Operation not allowed on a dynamic neighbor\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
- }
+ char base_xpath[XPATH_MAXLEN];
- group = peer_group_lookup(bgp, argv[idx_word]->arg);
- if (!group) {
- vty_out(vty, "%% Configure the peer-group first\n");
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- }
-
- ret = peer_group_bind(bgp, &su, peer, group, &as);
- if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT) {
- vty_out(vty,
- "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
- as);
- return CMD_WARNING_CONFIG_FAILED;
- }
+ nb_cli_enqueue_change(vty, "./peer-group", NB_OP_MODIFY,
+ argv[idx_word]->arg);
- return bgp_vty_return(vty, ret);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_set_peer_group, neighbor_set_peer_group_hidden_cmd,
"Member of the peer-group\n"
"Peer-group name\n")
-DEFUN (no_neighbor_set_peer_group,
- no_neighbor_set_peer_group_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Member of the peer-group\n"
- "Peer-group name\n")
+DEFUN_YANG (no_neighbor_set_peer_group,
+ no_neighbor_set_peer_group_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Member of the peer-group\n"
+ "Peer-group name\n")
{
- VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_peer = 2;
- int idx_word = 4;
- int ret;
- struct peer *peer;
- struct peer_group *group;
-
- peer = peer_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
- return CMD_WARNING_CONFIG_FAILED;
+ char base_xpath[XPATH_MAXLEN];
- group = peer_group_lookup(bgp, argv[idx_word]->arg);
- if (!group) {
- vty_out(vty, "%% Configure the peer-group first\n");
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- }
- if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE))
- bgp_zebra_terminate_radv(peer->bgp, peer);
+ nb_cli_enqueue_change(vty, "./peer-group", NB_OP_DESTROY, NULL);
- peer_notify_unconfig(peer);
- ret = peer_delete(peer);
-
- return bgp_vty_return(vty, ret);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_set_peer_group, no_neighbor_set_peer_group_hidden_cmd,
return peer_flag_modify_vty(vty, ip_str, flag, 0);
}
+int peer_flag_modify_nb(struct bgp *bgp, const char *ip_str, struct peer *peer,
+ uint32_t flag, bool set, char *errmsg,
+ size_t errmsg_len)
+{
+ int ret;
+
+ /*
+ * If 'neighbor <interface>', then this is for directly connected peers,
+ * we should not accept disable-connected-check.
+ */
+ if (peer->conf_if && (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)) {
+ snprintf(
+ errmsg, errmsg_len,
+ "%s is directly connected peer, cannot accept disable-connected-check\n",
+ ip_str);
+ return -1;
+ }
+
+ if (!set && flag == PEER_FLAG_SHUTDOWN)
+ peer_tx_shutdown_message_unset(peer);
+
+ if (set)
+ ret = peer_flag_set(peer, flag);
+ else
+ ret = peer_flag_unset(peer, flag);
+
+ return bgp_nb_errmsg_return(errmsg, errmsg_len, ret);
+}
+
/* neighbor passive. */
-DEFUN (neighbor_passive,
- neighbor_passive_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Don't send open messages to this neighbor\n")
+DEFUN_YANG(neighbor_passive,
+ neighbor_passive_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Don't send open messages to this neighbor\n")
{
int idx_peer = 1;
- return peer_flag_set_vty(vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./passive-mode", NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_passive,
- no_neighbor_passive_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Don't send open messages to this neighbor\n")
+DEFUN_YANG(no_neighbor_passive,
+ no_neighbor_passive_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
+ NO_STR NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Don't send open messages to this neighbor\n")
{
int idx_peer = 2;
- return peer_flag_unset_vty(vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./passive-mode", NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
/* neighbor shutdown. */
-DEFUN (neighbor_shutdown_msg,
- neighbor_shutdown_msg_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Administratively shut down this neighbor\n"
- "Add a shutdown message (RFC 8203)\n"
- "Shutdown message\n")
+DEFUN_YANG(neighbor_shutdown_msg,
+ neighbor_shutdown_msg_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Administratively shut down this neighbor\n"
+ "Add a shutdown message (RFC 8203)\n"
+ "Shutdown message\n")
{
int idx_peer = 1;
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
if (argc >= 5) {
- struct peer *peer =
- peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
char *message;
- if (!peer)
- return CMD_WARNING_CONFIG_FAILED;
message = argv_concat(argv, argc, 4);
- peer_tx_shutdown_message_set(peer, message);
- XFREE(MTYPE_TMP, message);
+ nb_cli_enqueue_change(vty, "./admin-shutdown/message",
+ NB_OP_MODIFY, message);
}
- return peer_flag_set_vty(vty, argv[idx_peer]->arg, PEER_FLAG_SHUTDOWN);
+ nb_cli_enqueue_change(vty, "./admin-shutdown/enable", NB_OP_MODIFY,
+ "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS(neighbor_shutdown_msg, neighbor_shutdown_cmd,
NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Administratively shut down this neighbor\n")
-DEFUN (no_neighbor_shutdown_msg,
- no_neighbor_shutdown_msg_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Administratively shut down this neighbor\n"
- "Remove a shutdown message (RFC 8203)\n"
- "Shutdown message\n")
+DEFUN_YANG(no_neighbor_shutdown_msg,
+ no_neighbor_shutdown_msg_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
+ NO_STR NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Administratively shut down this neighbor\n"
+ "Remove a shutdown message (RFC 8203)\n"
+ "Shutdown message\n")
{
int idx_peer = 2;
+ char base_xpath[XPATH_MAXLEN];
- return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_SHUTDOWN);
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./admin-shutdown/enable", NB_OP_MODIFY,
+ "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS(no_neighbor_shutdown_msg, no_neighbor_shutdown_cmd,
}
/* neighbor capability dynamic. */
-DEFUN (neighbor_capability_dynamic,
- neighbor_capability_dynamic_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Advertise capability to the peer\n"
- "Advertise dynamic capability to this neighbor\n")
+DEFUN_YANG (neighbor_capability_dynamic,
+ neighbor_capability_dynamic_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise dynamic capability to this neighbor\n")
{
int idx_peer = 1;
- return peer_flag_set_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_DYNAMIC_CAPABILITY);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./capability-options/dynamic-capability",
+ NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_capability_dynamic,
- no_neighbor_capability_dynamic_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Advertise capability to the peer\n"
- "Advertise dynamic capability to this neighbor\n")
+DEFUN_YANG (no_neighbor_capability_dynamic,
+ no_neighbor_capability_dynamic_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise dynamic capability to this neighbor\n")
{
int idx_peer = 2;
- return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_DYNAMIC_CAPABILITY);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./capability-options/dynamic-capability",
+ NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
/* neighbor dont-capability-negotiate */
}
/* neighbor capability extended next hop encoding */
-DEFUN (neighbor_capability_enhe,
- neighbor_capability_enhe_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Advertise capability to the peer\n"
- "Advertise extended next-hop capability to the peer\n")
+DEFUN_YANG (neighbor_capability_enhe,
+ neighbor_capability_enhe_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise extended next-hop capability to the peer\n")
{
int idx_peer = 1;
- return peer_flag_set_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_CAPABILITY_ENHE);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(
+ vty, "./capability-options/extended-nexthop-capability",
+ NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_capability_enhe,
- no_neighbor_capability_enhe_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Advertise capability to the peer\n"
- "Advertise extended next-hop capability to the peer\n")
+DEFUN_YANG (no_neighbor_capability_enhe,
+ no_neighbor_capability_enhe_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise extended next-hop capability to the peer\n")
{
int idx_peer = 2;
- return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_CAPABILITY_ENHE);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(
+ vty, "./capability-options/extended-nexthop-capability",
+ NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
+}
+
+int peer_af_flag_modify_nb(struct peer *peer, afi_t afi, safi_t safi,
+ uint32_t flag, int set, char *errmsg,
+ size_t errmsg_len)
+{
+ int ret;
+
+ if (set)
+ ret = peer_af_flag_set(peer, afi, safi, flag);
+ else
+ ret = peer_af_flag_unset(peer, afi, safi, flag);
+
+ return bgp_nb_errmsg_return(errmsg, errmsg_len, ret);
}
static int peer_af_flag_modify_vty(struct vty *vty, const char *peer_str,
"Capability to SEND the ORF to this neighbor\n")
/* neighbor next-hop-self. */
-DEFUN (neighbor_nexthop_self,
- neighbor_nexthop_self_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Disable the next hop calculation for this neighbor\n")
+DEFUN_YANG (neighbor_nexthop_self,
+ neighbor_nexthop_self_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Disable the next hop calculation for this neighbor\n")
{
int idx_peer = 1;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty), PEER_FLAG_NEXTHOP_SELF);
+ 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/nexthop-self/next-hop-self",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_nexthop_self, neighbor_nexthop_self_hidden_cmd,
"Disable the next hop calculation for this neighbor\n")
/* neighbor next-hop-self. */
-DEFUN (neighbor_nexthop_self_force,
- neighbor_nexthop_self_force_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Disable the next hop calculation for this neighbor\n"
- "Set the next hop to self for reflected routes\n")
+DEFUN_YANG(neighbor_nexthop_self_force,
+ neighbor_nexthop_self_force_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Disable the next hop calculation for this neighbor\n"
+ "Set the next hop to self for reflected routes\n")
{
int idx_peer = 1;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty),
- PEER_FLAG_FORCE_NEXTHOP_SELF);
+ 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/nexthop-self/next-hop-self-force",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_nexthop_self_force,
"Disable the next hop calculation for this neighbor\n"
"Set the next hop to self for reflected routes\n")
-DEFUN (no_neighbor_nexthop_self,
- no_neighbor_nexthop_self_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Disable the next hop calculation for this neighbor\n")
+DEFUN_YANG (no_neighbor_nexthop_self,
+ no_neighbor_nexthop_self_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Disable the next hop calculation for this neighbor\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_NEXTHOP_SELF);
+ 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/nexthop-self/next-hop-self",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_nexthop_self, no_neighbor_nexthop_self_hidden_cmd,
NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Disable the next hop calculation for this neighbor\n")
-DEFUN (no_neighbor_nexthop_self_force,
- no_neighbor_nexthop_self_force_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Disable the next hop calculation for this neighbor\n"
- "Set the next hop to self for reflected routes\n")
+DEFUN_YANG (no_neighbor_nexthop_self_force,
+ no_neighbor_nexthop_self_force_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Disable the next hop calculation for this neighbor\n"
+ "Set the next hop to self for reflected routes\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_FORCE_NEXTHOP_SELF);
+ 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/nexthop-self/next-hop-self-force",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_nexthop_self_force,
"Set the next hop to self for reflected routes\n")
/* neighbor as-override */
-DEFUN (neighbor_as_override,
- neighbor_as_override_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Override ASNs in outbound updates if aspath equals remote-as\n")
+DEFUN_YANG (neighbor_as_override,
+ neighbor_as_override_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Override ASNs in outbound updates if aspath equals remote-as\n")
{
int idx_peer = 1;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty), PEER_FLAG_AS_OVERRIDE);
+ 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/as-path-options/replace-peer-as",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_as_override, neighbor_as_override_hidden_cmd,
NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Override ASNs in outbound updates if aspath equals remote-as\n")
-DEFUN (no_neighbor_as_override,
- no_neighbor_as_override_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Override ASNs in outbound updates if aspath equals remote-as\n")
+DEFUN_YANG (no_neighbor_as_override,
+ no_neighbor_as_override_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Override ASNs in outbound updates if aspath equals remote-as\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_AS_OVERRIDE);
+ 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/as-path-options/replace-peer-as",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_as_override, no_neighbor_as_override_hidden_cmd,
"Override ASNs in outbound updates if aspath equals remote-as\n")
/* neighbor remove-private-AS. */
-DEFUN (neighbor_remove_private_as,
- neighbor_remove_private_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Remove private ASNs in outbound updates\n")
+DEFUN_YANG (neighbor_remove_private_as,
+ neighbor_remove_private_as_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private ASNs in outbound updates\n")
{
int idx_peer = 1;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty),
- PEER_FLAG_REMOVE_PRIVATE_AS);
+ 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/private-as/remove-private-as",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_remove_private_as, neighbor_remove_private_as_hidden_cmd,
NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Remove private ASNs in outbound updates\n")
-DEFUN (neighbor_remove_private_as_all,
- neighbor_remove_private_as_all_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Remove private ASNs in outbound updates\n"
- "Apply to all AS numbers\n")
+DEFUN_YANG (neighbor_remove_private_as_all,
+ neighbor_remove_private_as_all_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private ASNs in outbound updates\n"
+ "Apply to all AS numbers\n")
{
int idx_peer = 1;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty),
- PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
+ 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/private-as/remove-private-as-all",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_remove_private_as_all,
"Remove private ASNs in outbound updates\n"
"Apply to all AS numbers")
-DEFUN (neighbor_remove_private_as_replace_as,
- neighbor_remove_private_as_replace_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Remove private ASNs in outbound updates\n"
- "Replace private ASNs with our ASN in outbound updates\n")
+DEFUN_YANG (neighbor_remove_private_as_replace_as,
+ neighbor_remove_private_as_replace_as_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private ASNs in outbound updates\n"
+ "Replace private ASNs with our ASN in outbound updates\n")
{
int idx_peer = 1;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty),
- PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
+ 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/private-as/remove-private-as-replace",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_remove_private_as_replace_as,
"Remove private ASNs in outbound updates\n"
"Replace private ASNs with our ASN in outbound updates\n")
-DEFUN (neighbor_remove_private_as_all_replace_as,
- neighbor_remove_private_as_all_replace_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Remove private ASNs in outbound updates\n"
- "Apply to all AS numbers\n"
- "Replace private ASNs with our ASN in outbound updates\n")
+DEFUN_YANG (neighbor_remove_private_as_all_replace_as,
+ neighbor_remove_private_as_all_replace_as_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private ASNs in outbound updates\n"
+ "Apply to all AS numbers\n"
+ "Replace private ASNs with our ASN in outbound updates\n")
{
int idx_peer = 1;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty),
- PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
+ 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/private-as/remove-private-as-all-replace",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
"Apply to all AS numbers\n"
"Replace private ASNs with our ASN in outbound updates\n")
-DEFUN (no_neighbor_remove_private_as,
- no_neighbor_remove_private_as_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Remove private ASNs in outbound updates\n")
+DEFUN_YANG (no_neighbor_remove_private_as,
+ no_neighbor_remove_private_as_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private ASNs in outbound updates\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_REMOVE_PRIVATE_AS);
+ 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/private-as/remove-private-as",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_remove_private_as,
NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Remove private ASNs in outbound updates\n")
-DEFUN (no_neighbor_remove_private_as_all,
- no_neighbor_remove_private_as_all_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Remove private ASNs in outbound updates\n"
- "Apply to all AS numbers\n")
+DEFUN_YANG (no_neighbor_remove_private_as_all,
+ no_neighbor_remove_private_as_all_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private ASNs in outbound updates\n"
+ "Apply to all AS numbers\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
+ 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/private-as/remove-private-as-all",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_remove_private_as_all,
"Remove private ASNs in outbound updates\n"
"Apply to all AS numbers\n")
-DEFUN (no_neighbor_remove_private_as_replace_as,
- no_neighbor_remove_private_as_replace_as_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Remove private ASNs in outbound updates\n"
- "Replace private ASNs with our ASN in outbound updates\n")
+DEFUN_YANG (no_neighbor_remove_private_as_replace_as,
+ no_neighbor_remove_private_as_replace_as_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private ASNs in outbound updates\n"
+ "Replace private ASNs with our ASN in outbound updates\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
+ 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/private-as/remove-private-as-replace",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as,
"Remove private ASNs in outbound updates\n"
"Replace private ASNs with our ASN in outbound updates\n")
-DEFUN (no_neighbor_remove_private_as_all_replace_as,
- no_neighbor_remove_private_as_all_replace_as_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Remove private ASNs in outbound updates\n"
- "Apply to all AS numbers\n"
- "Replace private ASNs with our ASN in outbound updates\n")
+DEFUN_YANG (no_neighbor_remove_private_as_all_replace_as,
+ no_neighbor_remove_private_as_all_replace_as_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private ASNs in outbound updates\n"
+ "Apply to all AS numbers\n"
+ "Replace private ASNs with our ASN in outbound updates\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
+ 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/private-as/remove-private-as-all-replace",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
/* neighbor send-community. */
-DEFUN (neighbor_send_community,
- neighbor_send_community_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Send Community attribute to this neighbor\n")
+DEFUN_YANG (neighbor_send_community,
+ neighbor_send_community_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Send Community attribute to this neighbor\n")
{
int idx_peer = 1;
NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Send Community attribute to this neighbor\n")
-DEFUN (no_neighbor_send_community,
- no_neighbor_send_community_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Send Community attribute to this neighbor\n")
+DEFUN_YANG (no_neighbor_send_community,
+ no_neighbor_send_community_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Send Community attribute to this neighbor\n")
{
int idx_peer = 2;
"Send Community attribute to this neighbor\n")
/* neighbor send-community extended. */
-DEFUN (neighbor_send_community_type,
- neighbor_send_community_type_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Send Community attribute to this neighbor\n"
- "Send Standard and Extended Community attributes\n"
- "Send Standard, Large and Extended Community attributes\n"
- "Send Extended Community attributes\n"
- "Send Standard Community attributes\n"
- "Send Large Community attributes\n")
+DEFUN_YANG (neighbor_send_community_type,
+ neighbor_send_community_type_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Send Community attribute to this neighbor\n"
+ "Send Standard and Extended Community attributes\n"
+ "Send Standard, Large and Extended Community attributes\n"
+ "Send Extended Community attributes\n"
+ "Send Standard Community attributes\n"
+ "Send Large Community attributes\n")
{
const char *type = argv[argc - 1]->text;
char *peer_str = argv[1]->arg;
- struct peer *peer;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char std_xpath[XPATH_MAXLEN];
+ char ext_xpath[XPATH_MAXLEN];
+ char lrg_xpath[XPATH_MAXLEN];
afi_t afi = bgp_node_afi(vty);
safi_t safi = bgp_node_safi(vty);
- peer = peer_and_group_lookup_vty(vty, peer_str);
- 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, peer_str, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- if (strmatch(type, "standard"))
- return peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_COMMUNITY);
+ if (strmatch(type, "standard")) {
+ snprintf(std_xpath, sizeof(std_xpath),
+ "./%s/send-community/send-community",
+ bgp_afi_safi_get_container_str(afi, safi));
- if (strmatch(type, "extended"))
- return peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_EXT_COMMUNITY);
+ nb_cli_enqueue_change(vty, std_xpath, NB_OP_MODIFY, "true");
+ }
- if (strmatch(type, "large"))
- return peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_LARGE_COMMUNITY);
+ if (strmatch(type, "extended")) {
+ snprintf(ext_xpath, sizeof(ext_xpath),
+ "./%s/send-community/send-ext-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, ext_xpath, NB_OP_MODIFY, "true");
+ }
+
+ if (strmatch(type, "large")) {
+ snprintf(lrg_xpath, sizeof(lrg_xpath),
+ "./%s/send-community/send-large-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, lrg_xpath, NB_OP_MODIFY, "true");
+ }
if (strmatch(type, "both")) {
- return peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_COMMUNITY)
- | peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_EXT_COMMUNITY);
+ snprintf(std_xpath, sizeof(std_xpath),
+ "./%s/send-community/send-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, std_xpath, NB_OP_MODIFY, "true");
+
+ snprintf(ext_xpath, sizeof(ext_xpath),
+ "./%s/send-community/send-ext-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, ext_xpath, NB_OP_MODIFY, "true");
+ }
+
+ if (strmatch(type, "all")) {
+ snprintf(std_xpath, sizeof(std_xpath),
+ "./%s/send-community/send-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, std_xpath, NB_OP_MODIFY, "true");
+
+ snprintf(ext_xpath, sizeof(ext_xpath),
+ "./%s/send-community/send-ext-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, ext_xpath, NB_OP_MODIFY, "true");
+
+ snprintf(lrg_xpath, sizeof(lrg_xpath),
+ "./%s/send-community/send-large-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, lrg_xpath, NB_OP_MODIFY, "true");
}
- return peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_COMMUNITY)
- | peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_EXT_COMMUNITY)
- | peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_LARGE_COMMUNITY);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
"Send Standard Community attributes\n"
"Send Large Community attributes\n")
-DEFUN (no_neighbor_send_community_type,
- no_neighbor_send_community_type_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Send Community attribute to this neighbor\n"
- "Send Standard and Extended Community attributes\n"
- "Send Standard, Large and Extended Community attributes\n"
- "Send Extended Community attributes\n"
- "Send Standard Community attributes\n"
- "Send Large Community attributes\n")
+DEFUN_YANG (no_neighbor_send_community_type,
+ no_neighbor_send_community_type_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Send Community attribute to this neighbor\n"
+ "Send Standard and Extended Community attributes\n"
+ "Send Standard, Large and Extended Community attributes\n"
+ "Send Extended Community attributes\n"
+ "Send Standard Community attributes\n"
+ "Send Large Community attributes\n")
{
const char *type = argv[argc - 1]->text;
char *peer_str = argv[2]->arg;
- struct peer *peer;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char std_xpath[XPATH_MAXLEN];
+ char ext_xpath[XPATH_MAXLEN];
+ char lrg_xpath[XPATH_MAXLEN];
afi_t afi = bgp_node_afi(vty);
safi_t safi = bgp_node_safi(vty);
- peer = peer_and_group_lookup_vty(vty, peer_str);
- 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, peer_str, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- if (strmatch(type, "standard"))
- return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_COMMUNITY);
+ if (strmatch(type, "standard")) {
+ snprintf(std_xpath, sizeof(std_xpath),
+ "./%s/send-community/send-community",
+ bgp_afi_safi_get_container_str(afi, safi));
- if (strmatch(type, "extended"))
- return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_EXT_COMMUNITY);
+ nb_cli_enqueue_change(vty, std_xpath, NB_OP_MODIFY, "false");
+ }
- if (strmatch(type, "large"))
- return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_LARGE_COMMUNITY);
+ if (strmatch(type, "extended")) {
+ snprintf(ext_xpath, sizeof(ext_xpath),
+ "./%s/send-community/send-ext-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, ext_xpath, NB_OP_MODIFY, "false");
+ }
+
+ if (strmatch(type, "large")) {
+ snprintf(lrg_xpath, sizeof(lrg_xpath),
+ "./%s/send-community/send-large-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, lrg_xpath, NB_OP_MODIFY, "false");
+ }
if (strmatch(type, "both")) {
+ snprintf(std_xpath, sizeof(std_xpath),
+ "./%s/send-community/send-community",
+ bgp_afi_safi_get_container_str(afi, safi));
- return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_COMMUNITY)
- | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_EXT_COMMUNITY);
+ nb_cli_enqueue_change(vty, std_xpath, NB_OP_MODIFY, "false");
+
+ snprintf(ext_xpath, sizeof(ext_xpath),
+ "./%s/send-community/send-ext-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, ext_xpath, NB_OP_MODIFY, "false");
+ }
+
+ if (strmatch(type, "all")) {
+ snprintf(std_xpath, sizeof(std_xpath),
+ "./%s/send-community/send-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, std_xpath, NB_OP_MODIFY, "false");
+
+ snprintf(ext_xpath, sizeof(ext_xpath),
+ "./%s/send-community/send-ext-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, ext_xpath, NB_OP_MODIFY, "false");
+
+ snprintf(lrg_xpath, sizeof(lrg_xpath),
+ "./%s/send-community/send-large-community",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, lrg_xpath, NB_OP_MODIFY, "false");
}
- return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_COMMUNITY)
- | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_EXT_COMMUNITY)
- | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_SEND_LARGE_COMMUNITY);
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
"Send Standard Community attributes\n"
"Send Large Community attributes\n")
-/* neighbor soft-reconfig. */
-DEFUN (neighbor_soft_reconfiguration,
- neighbor_soft_reconfiguration_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Per neighbor soft reconfiguration\n"
- "Allow inbound soft reconfiguration for this neighbor\n")
-{
- int idx_peer = 1;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty),
- PEER_FLAG_SOFT_RECONFIG);
+/* neighbor soft-reconfig. */
+DEFUN_YANG (neighbor_soft_reconfiguration,
+ neighbor_soft_reconfiguration_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Per neighbor soft reconfiguration\n"
+ "Allow inbound soft reconfiguration for this neighbor\n")
+{
+ int idx_peer = 1;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char soft_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(soft_xpath, sizeof(soft_xpath), "./%s/soft-reconfiguration",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, soft_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_soft_reconfiguration,
"Per neighbor soft reconfiguration\n"
"Allow inbound soft reconfiguration for this neighbor\n")
-DEFUN (no_neighbor_soft_reconfiguration,
- no_neighbor_soft_reconfiguration_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Per neighbor soft reconfiguration\n"
- "Allow inbound soft reconfiguration for this neighbor\n")
+DEFUN_YANG (no_neighbor_soft_reconfiguration,
+ no_neighbor_soft_reconfiguration_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Per neighbor soft reconfiguration\n"
+ "Allow inbound soft reconfiguration for this neighbor\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_SOFT_RECONFIG);
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char soft_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));
+
+ snprintf(soft_xpath, sizeof(soft_xpath), "./%s/soft-reconfiguration",
+ bgp_afi_safi_get_container_str(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;
+
+ nb_cli_enqueue_change(vty, soft_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_soft_reconfiguration,
"Per neighbor soft reconfiguration\n"
"Allow inbound soft reconfiguration for this neighbor\n")
-DEFUN (neighbor_route_reflector_client,
- neighbor_route_reflector_client_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Configure a neighbor as Route Reflector client\n")
+DEFUN_YANG (neighbor_route_reflector_client,
+ neighbor_route_reflector_client_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Configure a neighbor as Route Reflector client\n")
{
int idx_peer = 1;
- struct peer *peer;
+ 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));
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty),
- PEER_FLAG_REFLECTOR_CLIENT);
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "./%s/route-reflector/route-reflector-client",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_route_reflector_client,
NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Configure a neighbor as Route Reflector client\n")
-DEFUN (no_neighbor_route_reflector_client,
- no_neighbor_route_reflector_client_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Configure a neighbor as Route Reflector client\n")
+DEFUN_YANG (no_neighbor_route_reflector_client,
+ no_neighbor_route_reflector_client_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Configure a neighbor as Route Reflector client\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_REFLECTOR_CLIENT);
+ 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/route-reflector/route-reflector-client",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_route_reflector_client,
"Configure a neighbor as Route Reflector client\n")
/* neighbor route-server-client. */
-DEFUN (neighbor_route_server_client,
- neighbor_route_server_client_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Configure a neighbor as Route Server client\n")
+DEFUN_YANG (neighbor_route_server_client,
+ neighbor_route_server_client_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Configure a neighbor as Route Server client\n")
{
int idx_peer = 1;
- struct peer *peer;
+ 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);
- 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;
- return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty),
- PEER_FLAG_RSERVER_CLIENT);
+
+ snprintf(attr_xpath, sizeof(attr_xpath),
+ "./%s/route-server/route-server-client",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_route_server_client,
NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Configure a neighbor as Route Server client\n")
-DEFUN (no_neighbor_route_server_client,
- no_neighbor_route_server_client_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Configure a neighbor as Route Server client\n")
+DEFUN_YANG (no_neighbor_route_server_client,
+ no_neighbor_route_server_client_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Configure a neighbor as Route Server client\n")
{
int idx_peer = 2;
- return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
- bgp_node_afi(vty), bgp_node_safi(vty),
- PEER_FLAG_RSERVER_CLIENT);
+ 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/route-server/route-server-client",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_route_server_client,
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED);
}
-DEFUN (neighbor_attr_unchanged,
- neighbor_attr_unchanged_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "BGP attribute is propagated unchanged to this neighbor\n"
- "As-path attribute\n"
- "Nexthop attribute\n"
- "Med attribute\n")
+DEFUN_YANG (neighbor_attr_unchanged,
+ neighbor_attr_unchanged_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n"
+ "Med attribute\n")
{
int idx = 0;
char *peer_str = argv[1]->arg;
- struct peer *peer;
bool aspath = false;
bool nexthop = false;
bool med = false;
afi_t afi = bgp_node_afi(vty);
safi_t safi = bgp_node_safi(vty);
- int ret = 0;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char as_xpath[XPATH_MAXLEN];
+ char nxthop_xpath[XPATH_MAXLEN];
+ char med_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, peer_str);
- 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, peer_str, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
if (argv_find(argv, argc, "as-path", &idx))
if (argv_find(argv, argc, "med", &idx))
med = true;
+ snprintf(as_xpath, sizeof(as_xpath),
+ "./%s/attr-unchanged/as-path-unchanged",
+ bgp_afi_safi_get_container_str(afi, safi));
+ snprintf(nxthop_xpath, sizeof(nxthop_xpath),
+ "./%s/attr-unchanged/next-hop-unchanged",
+ bgp_afi_safi_get_container_str(afi, safi));
+ snprintf(med_xpath, sizeof(med_xpath),
+ "./%s/attr-unchanged/med-unchanged",
+ bgp_afi_safi_get_container_str(afi, safi));
+
/* no flags means all of them! */
if (!aspath && !nexthop && !med) {
- ret = peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_AS_PATH_UNCHANGED);
- ret |= peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_NEXTHOP_UNCHANGED);
- ret |= peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_MED_UNCHANGED);
+ nb_cli_enqueue_change(vty, as_xpath, NB_OP_MODIFY, "true");
+ nb_cli_enqueue_change(vty, nxthop_xpath, NB_OP_MODIFY, "true");
+ nb_cli_enqueue_change(vty, med_xpath, NB_OP_MODIFY, "true");
} else {
- if (!aspath) {
- if (peer_af_flag_check(peer, afi, safi,
- PEER_FLAG_AS_PATH_UNCHANGED)) {
- ret |= peer_af_flag_unset_vty(
- vty, peer_str, afi, safi,
- PEER_FLAG_AS_PATH_UNCHANGED);
- }
- } else
- ret |= peer_af_flag_set_vty(
- vty, peer_str, afi, safi,
- PEER_FLAG_AS_PATH_UNCHANGED);
-
- if (!nexthop) {
- if (peer_af_flag_check(peer, afi, safi,
- PEER_FLAG_NEXTHOP_UNCHANGED)) {
- ret |= peer_af_flag_unset_vty(
- vty, peer_str, afi, safi,
- PEER_FLAG_NEXTHOP_UNCHANGED);
- }
- } else
- ret |= peer_af_flag_set_vty(
- vty, peer_str, afi, safi,
- PEER_FLAG_NEXTHOP_UNCHANGED);
+ if (!aspath)
+ nb_cli_enqueue_change(vty, as_xpath, NB_OP_MODIFY,
+ "false");
+ else
+ nb_cli_enqueue_change(vty, as_xpath, NB_OP_MODIFY,
+ "true");
- if (!med) {
- if (peer_af_flag_check(peer, afi, safi,
- PEER_FLAG_MED_UNCHANGED)) {
- ret |= peer_af_flag_unset_vty(
- vty, peer_str, afi, safi,
- PEER_FLAG_MED_UNCHANGED);
- }
- } else
- ret |= peer_af_flag_set_vty(vty, peer_str, afi, safi,
- PEER_FLAG_MED_UNCHANGED);
+ if (!nexthop)
+ nb_cli_enqueue_change(vty, nxthop_xpath, NB_OP_MODIFY,
+ "false");
+ else
+ nb_cli_enqueue_change(vty, nxthop_xpath, NB_OP_MODIFY,
+ "true");
+
+ if (!med)
+ nb_cli_enqueue_change(vty, med_xpath, NB_OP_MODIFY,
+ "false");
+ else
+ nb_cli_enqueue_change(vty, med_xpath, NB_OP_MODIFY,
+ "true");
}
- return ret;
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
"Nexthop attribute\n"
"Med attribute\n")
-DEFUN (no_neighbor_attr_unchanged,
- no_neighbor_attr_unchanged_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "BGP attribute is propagated unchanged to this neighbor\n"
- "As-path attribute\n"
- "Nexthop attribute\n"
- "Med attribute\n")
+DEFUN_YANG (no_neighbor_attr_unchanged,
+ no_neighbor_attr_unchanged_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n"
+ "Med attribute\n")
{
int idx = 0;
char *peer_str = argv[2]->arg;
- struct peer *peer;
bool aspath = false;
bool nexthop = false;
bool med = false;
afi_t afi = bgp_node_afi(vty);
safi_t safi = bgp_node_safi(vty);
- int ret = 0;
+ char base_xpath[XPATH_MAXLEN];
+ char af_xpath[XPATH_MAXLEN];
+ char as_xpath[XPATH_MAXLEN];
+ char nxthop_xpath[XPATH_MAXLEN];
+ char med_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, peer_str);
- 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, peer_str, base_xpath,
+ sizeof(base_xpath), af_xpath)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
if (argv_find(argv, argc, "as-path", &idx))
if (argv_find(argv, argc, "med", &idx))
med = true;
- if (!aspath && !nexthop && !med) // no flags means all of them!
- return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_AS_PATH_UNCHANGED)
- | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_NEXTHOP_UNCHANGED)
- | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_MED_UNCHANGED);
+ snprintf(as_xpath, sizeof(as_xpath),
+ "./%s/attr-unchanged/as-path-unchanged",
+ bgp_afi_safi_get_container_str(afi, safi));
+ snprintf(nxthop_xpath, sizeof(nxthop_xpath),
+ "./%s/attr-unchanged/next-hop-unchanged",
+ bgp_afi_safi_get_container_str(afi, safi));
+ snprintf(med_xpath, sizeof(med_xpath),
+ "./%s/attr-unchanged/med-unchanged",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ /* no flags means all of them! */
+ if (!aspath && !nexthop && !med) {
+ nb_cli_enqueue_change(vty, as_xpath, NB_OP_MODIFY, "false");
+ nb_cli_enqueue_change(vty, nxthop_xpath, NB_OP_MODIFY, "false");
+ nb_cli_enqueue_change(vty, med_xpath, NB_OP_MODIFY, "false");
+ }
if (aspath)
- ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_AS_PATH_UNCHANGED);
+ nb_cli_enqueue_change(vty, as_xpath, NB_OP_MODIFY, "false");
if (nexthop)
- ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_NEXTHOP_UNCHANGED);
+ nb_cli_enqueue_change(vty, nxthop_xpath, NB_OP_MODIFY, "false");
if (med)
- ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
- PEER_FLAG_MED_UNCHANGED);
+ nb_cli_enqueue_change(vty, med_xpath, NB_OP_MODIFY, "false");
- return ret;
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(
"Nexthop attribute\n"
"Med attribute\n")
-/* EBGP multihop configuration. */
-static int peer_ebgp_multihop_set_vty(struct vty *vty, const char *ip_str,
- const char *ttl_str)
+/* neighbor ebgp-multihop. */
+DEFUN_YANG (neighbor_ebgp_multihop,
+ neighbor_ebgp_multihop_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Allow EBGP neighbors not on directly connected networks\n")
{
- struct peer *peer;
- unsigned int ttl;
+ int idx_peer = 1;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- if (peer->conf_if)
- return bgp_vty_return(vty, BGP_ERR_INVALID_FOR_DIRECT_PEER);
-
- if (!ttl_str)
- ttl = MAXTTL;
- else
- ttl = strtoul(ttl_str, NULL, 10);
+ nb_cli_enqueue_change(vty, "./ebgp-multihop/enabled", NB_OP_MODIFY,
+ "true");
- return bgp_vty_return(vty, peer_ebgp_multihop_set(peer, ttl));
+ return nb_cli_apply_changes(vty, base_xpath);
}
-static int peer_ebgp_multihop_unset_vty(struct vty *vty, const char *ip_str)
+DEFUN_YANG (neighbor_ebgp_multihop_ttl,
+ neighbor_ebgp_multihop_ttl_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Allow EBGP neighbors not on directly connected networks\n"
+ "maximum hop count\n")
{
- struct peer *peer;
+ int idx_peer = 1;
+ int idx_number = 3;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- return bgp_vty_return(vty, peer_ebgp_multihop_unset(peer));
-}
-
-/* neighbor ebgp-multihop. */
-DEFUN (neighbor_ebgp_multihop,
- neighbor_ebgp_multihop_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Allow EBGP neighbors not on directly connected networks\n")
-{
- int idx_peer = 1;
- return peer_ebgp_multihop_set_vty(vty, argv[idx_peer]->arg, NULL);
-}
+ nb_cli_enqueue_change(vty, "./ebgp-multihop/multihop-ttl", NB_OP_MODIFY,
+ argv[idx_number]->arg);
-DEFUN (neighbor_ebgp_multihop_ttl,
- neighbor_ebgp_multihop_ttl_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Allow EBGP neighbors not on directly connected networks\n"
- "maximum hop count\n")
-{
- int idx_peer = 1;
- int idx_number = 3;
- return peer_ebgp_multihop_set_vty(vty, argv[idx_peer]->arg,
- argv[idx_number]->arg);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_ebgp_multihop,
- no_neighbor_ebgp_multihop_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Allow EBGP neighbors not on directly connected networks\n"
- "maximum hop count\n")
+DEFUN_YANG (no_neighbor_ebgp_multihop,
+ no_neighbor_ebgp_multihop_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Allow EBGP neighbors not on directly connected networks\n"
+ "maximum hop count\n")
{
int idx_peer = 2;
- return peer_ebgp_multihop_unset_vty(vty, argv[idx_peer]->arg);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ if (argc > 4)
+ nb_cli_enqueue_change(vty, "./ebgp-multihop/multihop-ttl",
+ NB_OP_DESTROY, NULL);
+ else
+ nb_cli_enqueue_change(vty, "./ebgp-multihop/enabled",
+ NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
/* disable-connected-check */
-DEFUN (neighbor_disable_connected_check,
- neighbor_disable_connected_check_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "one-hop away EBGP peer using loopback address\n"
- "Enforce EBGP neighbors perform multihop\n")
+DEFUN_YANG (neighbor_disable_connected_check,
+ neighbor_disable_connected_check_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "one-hop away EBGP peer using loopback address\n"
+ "Enforce EBGP neighbors perform multihop\n")
{
int idx_peer = 1;
- return peer_flag_set_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_DISABLE_CONNECTED_CHECK);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./ebgp-multihop/disable-connected-check",
+ NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_disable_connected_check,
- no_neighbor_disable_connected_check_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "one-hop away EBGP peer using loopback address\n"
- "Enforce EBGP neighbors perform multihop\n")
+DEFUN_YANG (no_neighbor_disable_connected_check,
+ no_neighbor_disable_connected_check_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "one-hop away EBGP peer using loopback address\n"
+ "Enforce EBGP neighbors perform multihop\n")
{
int idx_peer = 2;
- return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_DISABLE_CONNECTED_CHECK);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./ebgp-multihop/disable-connected-check",
+ NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
/* enforce-first-as */
-DEFUN (neighbor_enforce_first_as,
- neighbor_enforce_first_as_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Enforce the first AS for EBGP routes\n")
+DEFUN_YANG (neighbor_enforce_first_as,
+ neighbor_enforce_first_as_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Enforce the first AS for EBGP routes\n")
{
int idx_peer = 1;
+ char base_xpath[XPATH_MAXLEN];
- return peer_flag_set_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_ENFORCE_FIRST_AS);
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./enforce-first-as", NB_OP_MODIFY, "true");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_enforce_first_as,
- no_neighbor_enforce_first_as_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Enforce the first AS for EBGP routes\n")
+DEFUN_YANG (no_neighbor_enforce_first_as,
+ no_neighbor_enforce_first_as_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Enforce the first AS for EBGP routes\n")
{
int idx_peer = 2;
+ char base_xpath[XPATH_MAXLEN];
- return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
- PEER_FLAG_ENFORCE_FIRST_AS);
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./enforce-first-as", NB_OP_MODIFY, "false");
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
+static int peer_and_group_lookup_nb(struct vty *vty, const char *peer_str,
+ char *base_xpath, int xpath_len,
+ char *xpath)
+{
+ union sockunion su;
+ char num_xpath[XPATH_MAXLEN];
+ char unnbr_xpath[XPATH_MAXLEN];
+ char prgrp_xpath[XPATH_MAXLEN];
+
+ if (str2sockunion(peer_str, &su) == 0) {
+ snprintf(num_xpath, sizeof(num_xpath),
+ "/neighbors/neighbor[remote-address='%s']", peer_str);
+ if (yang_dnode_exists(vty->candidate_config->dnode, "%s%s",
+ VTY_CURR_XPATH, num_xpath)) {
+ snprintf(base_xpath, xpath_len,
+ FRR_BGP_NEIGHBOR_NUM_XPATH, peer_str,
+ xpath ? xpath : "");
+ } else {
+ vty_out(vty,
+ "%% Specify remote-as or peer-group commands first\n");
+ return -1;
+ }
+
+ } else {
+ snprintf(unnbr_xpath, sizeof(unnbr_xpath),
+ "/neighbors/unnumbered-neighbor[interface='%s']",
+ peer_str);
+
+ snprintf(prgrp_xpath, sizeof(prgrp_xpath),
+ "/peer-groups/peer-group[peer-group-name='%s']",
+ peer_str);
+
+ if (yang_dnode_exists(vty->candidate_config->dnode, "%s%s",
+ VTY_CURR_XPATH, unnbr_xpath)) {
+ snprintf(base_xpath, xpath_len,
+ FRR_BGP_NEIGHBOR_UNNUM_XPATH, peer_str,
+ xpath ? xpath : "");
+ } else if (yang_dnode_exists(vty->candidate_config->dnode,
+ "%s%s", VTY_CURR_XPATH,
+ prgrp_xpath)) {
+ snprintf(base_xpath, xpath_len,
+ FRR_BGP_PEER_GROUP_XPATH, peer_str,
+ xpath ? xpath : "");
+ } else {
+ vty_out(vty,
+ "%% Create the peer-group or interface first\n");
+ return -1;
+ }
+ }
+
+ return 0;
+}
-DEFUN (neighbor_description,
- neighbor_description_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Neighbor specific description\n"
- "Up to 80 characters describing this neighbor\n")
+DEFUN_YANG (neighbor_description,
+ neighbor_description_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Neighbor specific description\n"
+ "Up to 80 characters describing this neighbor\n")
{
int idx_peer = 1;
int idx_line = 3;
- struct peer *peer;
+ int ret;
+ char base_xpath[XPATH_MAXLEN];
char *str;
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
str = argv_concat(argv, argc, idx_line);
- peer_description_set(peer, str);
+ nb_cli_enqueue_change(vty, "./description", NB_OP_MODIFY, str);
+
+ ret = nb_cli_apply_changes(vty, base_xpath);
XFREE(MTYPE_TMP, str);
- return CMD_SUCCESS;
+ return ret;
}
-DEFUN (no_neighbor_description,
- no_neighbor_description_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Neighbor specific description\n")
+DEFUN_YANG (no_neighbor_description,
+ no_neighbor_description_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Neighbor specific description\n")
{
int idx_peer = 2;
- struct peer *peer;
-
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
- return CMD_WARNING_CONFIG_FAILED;
-
- peer_description_unset(peer);
-
- return CMD_SUCCESS;
-}
-
-ALIAS(no_neighbor_description, no_neighbor_description_comment_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
- NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
- "Neighbor specific description\n"
- "Up to 80 characters describing this neighbor\n")
-
-/* Neighbor update-source. */
-static int peer_update_source_vty(struct vty *vty, const char *peer_str,
- const char *source_str)
-{
- struct peer *peer;
- struct prefix p;
- union sockunion su;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, peer_str);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- if (peer->conf_if)
- return CMD_WARNING;
-
- if (source_str) {
- if (str2sockunion(source_str, &su) == 0)
- peer_update_source_addr_set(peer, &su);
- else {
- if (str2prefix(source_str, &p)) {
- vty_out(vty,
- "%% Invalid update-source, remove prefix length \n");
- return CMD_WARNING_CONFIG_FAILED;
- } else
- peer_update_source_if_set(peer, source_str);
- }
- } else
- peer_update_source_unset(peer);
+ nb_cli_enqueue_change(vty, "./description", NB_OP_DESTROY, NULL);
- return CMD_SUCCESS;
+ return nb_cli_apply_changes(vty, base_xpath);
}
+ALIAS(no_neighbor_description, no_neighbor_description_comment_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Neighbor specific description\n"
+ "Up to 80 characters describing this neighbor\n")
+
#define BGP_UPDATE_SOURCE_HELP_STR \
"IPv4 address\n" \
"IPv6 address\n" \
"Interface name (requires zebra to be running)\n"
-DEFUN (neighbor_update_source,
- neighbor_update_source_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Source of routing updates\n"
- BGP_UPDATE_SOURCE_HELP_STR)
+DEFUN_YANG (neighbor_update_source,
+ neighbor_update_source_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Source of routing updates\n"
+ BGP_UPDATE_SOURCE_HELP_STR)
{
int idx_peer = 1;
int idx_peer_2 = 3;
- return peer_update_source_vty(vty, argv[idx_peer]->arg,
+ union sockunion su;
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ // NOTE: Check source_str prefix address
+ if (str2sockunion(argv[idx_peer_2]->arg, &su) == 0)
+ nb_cli_enqueue_change(vty, "./update-source/ip", NB_OP_MODIFY,
argv[idx_peer_2]->arg);
+ else
+ nb_cli_enqueue_change(vty, "./update-source/interface",
+ NB_OP_MODIFY, argv[idx_peer_2]->arg);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_update_source,
- no_neighbor_update_source_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Source of routing updates\n"
- BGP_UPDATE_SOURCE_HELP_STR)
+DEFUN_YANG (no_neighbor_update_source,
+ no_neighbor_update_source_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
+ NO_STR NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Source of routing updates\n"
+ BGP_UPDATE_SOURCE_HELP_STR)
{
int idx_peer = 2;
- return peer_update_source_vty(vty, argv[idx_peer]->arg, NULL);
+ char base_xpath[XPATH_MAXLEN];
+ char abs_xpath_ip[XPATH_MAXLEN];
+ char abs_xpath_intf[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ snprintf(abs_xpath_ip, sizeof(abs_xpath_ip), "%s%s/update-source/ip",
+ VTY_CURR_XPATH, base_xpath + 1);
+ snprintf(abs_xpath_intf, sizeof(abs_xpath_intf),
+ "%s%s/update-source/interface", VTY_CURR_XPATH,
+ base_xpath + 1);
+
+ if (yang_dnode_exists(vty->candidate_config->dnode, abs_xpath_ip)) {
+ nb_cli_enqueue_change(vty, "./update-source/ip", NB_OP_DESTROY,
+ NULL);
+ } else if (yang_dnode_exists(vty->candidate_config->dnode,
+ abs_xpath_intf)) {
+ nb_cli_enqueue_change(vty, "./update-source/interface",
+ NB_OP_DESTROY, NULL);
+ }
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
static int peer_default_originate_set_vty(struct vty *vty, const char *peer_str,
"route-map name\n")
-/* Set neighbor's BGP port. */
-static int peer_port_vty(struct vty *vty, const char *ip_str, int afi,
- const char *port_str)
-{
- struct peer *peer;
- uint16_t port;
- struct servent *sp;
-
- peer = peer_lookup_vty(vty, ip_str);
- if (!peer)
- return CMD_WARNING_CONFIG_FAILED;
-
- if (!port_str) {
- sp = getservbyname("bgp", "tcp");
- port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs(sp->s_port);
- } else {
- port = strtoul(port_str, NULL, 10);
- }
-
- peer_port_set(peer, port);
-
- return CMD_SUCCESS;
-}
-
/* Set specified peer's BGP port. */
-DEFUN (neighbor_port,
- neighbor_port_cmd,
- "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
- "Neighbor's BGP port\n"
- "TCP port number\n")
+DEFUN_YANG (neighbor_port,
+ neighbor_port_cmd,
+ "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Neighbor's BGP port\n"
+ "TCP port number\n")
{
int idx_ip = 1;
int idx_number = 3;
- return peer_port_vty(vty, argv[idx_ip]->arg, AFI_IP,
- argv[idx_number]->arg);
-}
+ char base_xpath[XPATH_MAXLEN];
-DEFUN (no_neighbor_port,
- no_neighbor_port_cmd,
- "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
- "Neighbor's BGP port\n"
- "TCP port number\n")
-{
- int idx_ip = 2;
- return peer_port_vty(vty, argv[idx_ip]->arg, AFI_IP, NULL);
-}
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_NUM_XPATH,
+ argv[idx_ip]->arg, "");
+
+ nb_cli_enqueue_change(vty, "./local-port", NB_OP_MODIFY,
+ argv[idx_number]->arg);
+ return nb_cli_apply_changes(vty, base_xpath);
+}
-/* neighbor weight. */
-static int peer_weight_set_vty(struct vty *vty, const char *ip_str, afi_t afi,
- safi_t safi, const char *weight_str)
+DEFUN_YANG (no_neighbor_port,
+ no_neighbor_port_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR
+ "Neighbor's BGP port\n"
+ "TCP port number\n")
{
- int ret;
- struct peer *peer;
- unsigned long weight;
+ int idx_ip = 2;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
- return CMD_WARNING_CONFIG_FAILED;
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_NUM_XPATH,
+ argv[idx_ip]->arg, "");
- weight = strtoul(weight_str, NULL, 10);
+ nb_cli_enqueue_change(vty, "./local-port", NB_OP_DESTROY, NULL);
- ret = peer_weight_set(peer, afi, safi, weight);
- return bgp_vty_return(vty, ret);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-static int peer_weight_unset_vty(struct vty *vty, const char *ip_str, afi_t afi,
- safi_t safi)
+DEFUN_YANG (neighbor_weight,
+ neighbor_weight_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Set default weight for routes from this neighbor\n"
+ "default weight\n")
{
- int ret;
- struct peer *peer;
+ int idx_peer = 1;
+ int idx_number = 3;
+ 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);
- peer = peer_and_group_lookup_vty(vty, ip_str);
- 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;
- ret = peer_weight_unset(peer, afi, safi);
- return bgp_vty_return(vty, ret);
-}
+ snprintf(attr_xpath, sizeof(attr_xpath), "./%s/weight/weight-attribute",
+ bgp_afi_safi_get_container_str(afi, safi));
-DEFUN (neighbor_weight,
- neighbor_weight_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Set default weight for routes from this neighbor\n"
- "default weight\n")
-{
- int idx_peer = 1;
- int idx_number = 3;
- return peer_weight_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
- bgp_node_safi(vty), argv[idx_number]->arg);
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_MODIFY,
+ argv[idx_number]->arg);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(neighbor_weight, neighbor_weight_hidden_cmd,
"Set default weight for routes from this neighbor\n"
"default weight\n")
-DEFUN (no_neighbor_weight,
- no_neighbor_weight_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Set default weight for routes from this neighbor\n"
- "default weight\n")
+DEFUN_YANG (no_neighbor_weight,
+ no_neighbor_weight_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Set default weight for routes from this neighbor\n"
+ "default weight\n")
{
int idx_peer = 2;
- return peer_weight_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/weight/weight-attribute",
+ bgp_afi_safi_get_container_str(afi, safi));
+
+ nb_cli_enqueue_change(vty, attr_xpath, NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
ALIAS_HIDDEN(no_neighbor_weight, no_neighbor_weight_hidden_cmd,
PEER_FLAG_STRICT_CAP_MATCH);
}
-static int peer_timers_set_vty(struct vty *vty, const char *ip_str,
- const char *keep_str, const char *hold_str)
+DEFUN_YANG (neighbor_timers,
+ neighbor_timers_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "BGP per neighbor timers\n"
+ "Keepalive interval\n"
+ "Holdtime\n")
{
- int ret;
- struct peer *peer;
- uint32_t keepalive;
- uint32_t holdtime;
+ int idx_peer = 1;
+ int idx_number = 3;
+ int idx_number_2 = 4;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- keepalive = strtoul(keep_str, NULL, 10);
- holdtime = strtoul(hold_str, NULL, 10);
+ nb_cli_enqueue_change(vty, "./timers/keepalive", NB_OP_MODIFY,
+ argv[idx_number]->arg);
- ret = peer_timers_set(peer, keepalive, holdtime);
+ nb_cli_enqueue_change(vty, "./timers/hold-time", NB_OP_MODIFY,
+ argv[idx_number_2]->arg);
- return bgp_vty_return(vty, ret);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-static int peer_timers_unset_vty(struct vty *vty, const char *ip_str)
+DEFUN_YANG (no_neighbor_timers,
+ no_neighbor_timers_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "BGP per neighbor timers\n"
+ "Keepalive interval\n"
+ "Holdtime\n")
{
- int ret;
- struct peer *peer;
+ int idx_peer = 2;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- ret = peer_timers_unset(peer);
-
- return bgp_vty_return(vty, ret);
-}
+ nb_cli_enqueue_change(vty, "./timers/hold-time", NB_OP_DESTROY, NULL);
-DEFUN (neighbor_timers,
- neighbor_timers_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "BGP per neighbor timers\n"
- "Keepalive interval\n"
- "Holdtime\n")
-{
- int idx_peer = 1;
- int idx_number = 3;
- int idx_number_2 = 4;
- return peer_timers_set_vty(vty, argv[idx_peer]->arg,
- argv[idx_number]->arg,
- argv[idx_number_2]->arg);
-}
+ nb_cli_enqueue_change(vty, "./timers/keepalive", NB_OP_DESTROY, NULL);
-DEFUN (no_neighbor_timers,
- no_neighbor_timers_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "BGP per neighbor timers\n"
- "Keepalive interval\n"
- "Holdtime\n")
-{
- int idx_peer = 2;
- return peer_timers_unset_vty(vty, argv[idx_peer]->arg);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-
-static int peer_timers_connect_set_vty(struct vty *vty, const char *ip_str,
- const char *time_str)
+DEFUN_YANG (neighbor_timers_connect,
+ neighbor_timers_connect_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "BGP per neighbor timers\n"
+ "BGP connect timer\n"
+ "Connect timer\n")
{
- int ret;
- struct peer *peer;
- uint32_t connect;
+ int idx_peer = 1;
+ int idx_number = 4;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- connect = strtoul(time_str, NULL, 10);
-
- ret = peer_timers_connect_set(peer, connect);
+ nb_cli_enqueue_change(vty, "./timers/connect-time", NB_OP_MODIFY,
+ argv[idx_number]->arg);
- return bgp_vty_return(vty, ret);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-static int peer_timers_connect_unset_vty(struct vty *vty, const char *ip_str)
+DEFUN_YANG (no_neighbor_timers_connect,
+ no_neighbor_timers_connect_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "BGP per neighbor timers\n"
+ "BGP connect timer\n"
+ "Connect timer\n")
{
- int ret;
- struct peer *peer;
+ int idx_peer = 2;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- ret = peer_timers_connect_unset(peer);
+ nb_cli_enqueue_change(vty, "./timers/connect-time", NB_OP_DESTROY,
+ NULL);
- return bgp_vty_return(vty, ret);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (neighbor_timers_connect,
- neighbor_timers_connect_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "BGP per neighbor timers\n"
- "BGP connect timer\n"
- "Connect timer\n")
+DEFUN_YANG (neighbor_advertise_interval,
+ neighbor_advertise_interval_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Minimum interval between sending BGP routing updates\n"
+ "time in seconds\n")
{
int idx_peer = 1;
- int idx_number = 4;
- return peer_timers_connect_set_vty(vty, argv[idx_peer]->arg,
- argv[idx_number]->arg);
-}
-
-DEFUN (no_neighbor_timers_connect,
- no_neighbor_timers_connect_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "BGP per neighbor timers\n"
- "BGP connect timer\n"
- "Connect timer\n")
-{
- int idx_peer = 2;
- return peer_timers_connect_unset_vty(vty, argv[idx_peer]->arg);
-}
-
-
-static int peer_advertise_interval_vty(struct vty *vty, const char *ip_str,
- const char *time_str, int set)
-{
- int ret;
- struct peer *peer;
- uint32_t routeadv = 0;
+ int idx_number = 3;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, ip_str);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- if (time_str)
- routeadv = strtoul(time_str, NULL, 10);
-
- if (set)
- ret = peer_advertise_interval_set(peer, routeadv);
- else
- ret = peer_advertise_interval_unset(peer);
-
- return bgp_vty_return(vty, ret);
-}
+ nb_cli_enqueue_change(vty, "./timers/advertise-interval", NB_OP_MODIFY,
+ argv[idx_number]->arg);
-DEFUN (neighbor_advertise_interval,
- neighbor_advertise_interval_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Minimum interval between sending BGP routing updates\n"
- "time in seconds\n")
-{
- int idx_peer = 1;
- int idx_number = 3;
- return peer_advertise_interval_vty(vty, argv[idx_peer]->arg,
- argv[idx_number]->arg, 1);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_advertise_interval,
- no_neighbor_advertise_interval_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Minimum interval between sending BGP routing updates\n"
- "time in seconds\n")
+DEFUN_YANG (no_neighbor_advertise_interval,
+ no_neighbor_advertise_interval_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Minimum interval between sending BGP routing updates\n"
+ "time in seconds\n")
{
int idx_peer = 2;
- return peer_advertise_interval_vty(vty, argv[idx_peer]->arg, NULL, 0);
+ char base_xpath[XPATH_MAXLEN];
+
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ nb_cli_enqueue_change(vty, "./timers/advertise-interval", NB_OP_DESTROY,
+ NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
return CMD_SUCCESS;
}
-/* neighbor interface */
-static int peer_interface_vty(struct vty *vty, const char *ip_str,
- const char *str)
+DEFUN_YANG (neighbor_interface,
+ neighbor_interface_cmd,
+ "neighbor <A.B.C.D|X:X::X:X> interface WORD",
+ NEIGHBOR_STR NEIGHBOR_ADDR_STR
+ "Interface\n"
+ "Interface name\n")
{
- struct peer *peer;
-
- peer = peer_lookup_vty(vty, ip_str);
- if (!peer || peer->conf_if) {
- vty_out(vty, "%% BGP invalid peer %s\n", ip_str);
- return CMD_WARNING_CONFIG_FAILED;
- }
+ int idx_ip = 1;
+ int idx_word = 3;
+ char base_xpath[XPATH_MAXLEN];
- if (str)
- peer_interface_set(peer, str);
- else
- peer_interface_unset(peer);
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_NUM_XPATH,
+ argv[idx_ip]->arg, "");
- return CMD_SUCCESS;
-}
+ nb_cli_enqueue_change(vty, "./local-interface", NB_OP_MODIFY,
+ argv[idx_word]->arg);
-DEFUN (neighbor_interface,
- neighbor_interface_cmd,
- "neighbor <A.B.C.D|X:X::X:X> interface WORD",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR
- "Interface\n"
- "Interface name\n")
-{
- int idx_ip = 1;
- int idx_word = 3;
- return peer_interface_vty(vty, argv[idx_ip]->arg, argv[idx_word]->arg);
+ return nb_cli_apply_changes(vty, base_xpath);
}
-DEFUN (no_neighbor_interface,
- no_neighbor_interface_cmd,
- "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
- NO_STR
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "Interface\n"
- "Interface name\n")
+DEFUN_YANG (no_neighbor_interface,
+ no_neighbor_interface_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
+ NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
+ "Interface\n"
+ "Interface name\n")
{
int idx_peer = 2;
- return peer_interface_vty(vty, argv[idx_peer]->arg, NULL);
+ char base_xpath[XPATH_MAXLEN];
+
+ snprintf(base_xpath, sizeof(base_xpath), FRR_BGP_NEIGHBOR_NUM_XPATH,
+ argv[idx_peer]->arg, "");
+
+ nb_cli_enqueue_change(vty, "./local-interface", NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
DEFUN (neighbor_distribute_list,
"Number of occurrences of AS number\n"
"Only accept my AS in the as-path if the route was originated in my AS\n")
-DEFUN (neighbor_ttl_security,
- neighbor_ttl_security_cmd,
- "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
- NEIGHBOR_STR
- NEIGHBOR_ADDR_STR2
- "BGP ttl-security parameters\n"
- "Specify the maximum number of hops to the BGP peer\n"
- "Number of hops to BGP peer\n")
+DEFUN_YANG (neighbor_ttl_security,
+ neighbor_ttl_security_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP ttl-security parameters\n"
+ "Specify the maximum number of hops to the BGP peer\n"
+ "Number of hops to BGP peer\n")
{
int idx_peer = 1;
int idx_number = 4;
- struct peer *peer;
- int gtsm_hops;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- gtsm_hops = strtoul(argv[idx_number]->arg, NULL, 10);
-
- /*
- * If 'neighbor swpX', then this is for directly connected peers,
- * we should not accept a ttl-security hops value greater than 1.
- */
- if (peer->conf_if && (gtsm_hops > BGP_GTSM_HOPS_CONNECTED)) {
- vty_out(vty,
- "%s is directly connected peer, hops cannot exceed 1\n",
- argv[idx_peer]->arg);
- return CMD_WARNING_CONFIG_FAILED;
- }
+ nb_cli_enqueue_change(vty, "./ttl-security", NB_OP_MODIFY,
+ argv[idx_number]->arg);
- return bgp_vty_return(vty, peer_ttl_security_hops_set(peer, gtsm_hops));
+ return nb_cli_apply_changes(vty, base_xpath);
}
DEFUN (no_neighbor_ttl_security,
"Number of hops to BGP peer\n")
{
int idx_peer = 2;
- struct peer *peer;
+ char base_xpath[XPATH_MAXLEN];
- peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
- if (!peer)
+ if (peer_and_group_lookup_nb(vty, argv[idx_peer]->arg, base_xpath,
+ sizeof(base_xpath), NULL)
+ < 0)
return CMD_WARNING_CONFIG_FAILED;
- return bgp_vty_return(vty, peer_ttl_security_hops_unset(peer));
+ nb_cli_enqueue_change(vty, "./ttl-security", NB_OP_DESTROY, NULL);
+
+ return nb_cli_apply_changes(vty, base_xpath);
}
DEFUN (neighbor_addpath_tx_all_paths,