From 8611c7f3b6f33cb5ef8687bc126354d06eadbfcf Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Fri, 23 Oct 2020 22:42:00 -0700 Subject: [PATCH] bgpd: convert neighbor peer config to transactional Signed-off-by: Chirag Shah --- bgpd/bgp_nb_config.c | 118 ++++++++++++++++++++++++++++++++++++++++--- bgpd/bgp_vty.c | 106 +++++++++++++++++++++++++------------- 2 files changed, 184 insertions(+), 40 deletions(-) diff --git a/bgpd/bgp_nb_config.c b/bgpd/bgp_nb_config.c index 279afdc814..27477bef6c 100644 --- a/bgpd/bgp_nb_config.c +++ b/bgpd/bgp_nb_config.c @@ -2837,12 +2837,29 @@ int bgp_neighbors_neighbor_capability_options_dynamic_capability_modify( int bgp_neighbors_neighbor_capability_options_strict_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_STRICT_CAP_MATCH, enable, + args->errmsg, args->errmsg_len); + break; } @@ -2911,12 +2928,29 @@ int bgp_neighbors_neighbor_capability_options_capability_negotiate_modify( int bgp_neighbors_neighbor_capability_options_override_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_OVERRIDE_CAPABILITY, enable, + args->errmsg, args->errmsg_len); + break; } @@ -4837,12 +4871,31 @@ int bgp_neighbors_unnumbered_neighbor_capability_options_dynamic_capability_modi int bgp_neighbors_unnumbered_neighbor_capability_options_strict_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_STRICT_CAP_MATCH, enable, + args->errmsg, args->errmsg_len); + break; } @@ -4913,12 +4966,29 @@ int bgp_neighbors_unnumbered_neighbor_capability_options_capability_negotiate_mo int bgp_neighbors_unnumbered_neighbor_capability_options_override_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); + + enable = yang_dnode_get_bool(args->dnode, NULL); + + peer_flag_modify_nb(bgp, peer_str, peer, + PEER_FLAG_OVERRIDE_CAPABILITY, enable, + args->errmsg, args->errmsg_len); + break; } @@ -6696,12 +6766,30 @@ int bgp_peer_groups_peer_group_capability_options_dynamic_capability_modify( int bgp_peer_groups_peer_group_capability_options_strict_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_STRICT_CAP_MATCH, enable, + args->errmsg, args->errmsg_len); + break; } @@ -6771,12 +6859,30 @@ int bgp_peer_groups_peer_group_capability_options_capability_negotiate_modify( int bgp_peer_groups_peer_group_capability_options_override_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_OVERRIDE_CAPABILITY, enable, + args->errmsg, args->errmsg_len); + break; } diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index cc2b0464b2..fb4fae833d 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -7199,56 +7199,94 @@ ALIAS_HIDDEN(no_neighbor_weight, no_neighbor_weight_hidden_cmd, /* Override capability negotiation. */ -DEFUN (neighbor_override_capability, - neighbor_override_capability_cmd, - "neighbor override-capability", - NEIGHBOR_STR - NEIGHBOR_ADDR_STR2 - "Override capability negotiation result\n") +DEFUN_YANG (neighbor_override_capability, + neighbor_override_capability_cmd, + "neighbor override-capability", + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "Override capability negotiation result\n") { int idx_peer = 1; - return peer_flag_set_vty(vty, argv[idx_peer]->arg, - PEER_FLAG_OVERRIDE_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/override-capability", + NB_OP_MODIFY, "true"); + + return nb_cli_apply_changes(vty, base_xpath); } -DEFUN (no_neighbor_override_capability, - no_neighbor_override_capability_cmd, - "no neighbor override-capability", - NO_STR - NEIGHBOR_STR - NEIGHBOR_ADDR_STR2 - "Override capability negotiation result\n") +DEFUN_YANG (no_neighbor_override_capability, + no_neighbor_override_capability_cmd, + "no neighbor override-capability", + NO_STR + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "Override capability negotiation result\n") { int idx_peer = 2; - return peer_flag_unset_vty(vty, argv[idx_peer]->arg, - PEER_FLAG_OVERRIDE_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/override-capability", + NB_OP_MODIFY, "false"); + + return nb_cli_apply_changes(vty, base_xpath); } -DEFUN (neighbor_strict_capability, - neighbor_strict_capability_cmd, - "neighbor strict-capability-match", - NEIGHBOR_STR - NEIGHBOR_ADDR_STR2 - "Strict capability negotiation match\n") +DEFUN_YANG (neighbor_strict_capability, + neighbor_strict_capability_cmd, + "neighbor strict-capability-match", + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "Strict capability negotiation match\n") { int idx_peer = 1; + char base_xpath[XPATH_MAXLEN]; - return peer_flag_set_vty(vty, argv[idx_peer]->arg, - PEER_FLAG_STRICT_CAP_MATCH); + 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/strict-capability", + NB_OP_MODIFY, "true"); + + return nb_cli_apply_changes(vty, base_xpath); } -DEFUN (no_neighbor_strict_capability, - no_neighbor_strict_capability_cmd, - "no neighbor strict-capability-match", - NO_STR - NEIGHBOR_STR - NEIGHBOR_ADDR_STR2 - "Strict capability negotiation match\n") +DEFUN_YANG (no_neighbor_strict_capability, + no_neighbor_strict_capability_cmd, + "no neighbor strict-capability-match", + NO_STR + NEIGHBOR_STR + NEIGHBOR_ADDR_STR2 + "Strict capability negotiation match\n") { int idx_peer = 2; + char base_xpath[XPATH_MAXLEN]; - return peer_flag_unset_vty(vty, argv[idx_peer]->arg, - PEER_FLAG_STRICT_CAP_MATCH); + 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/strict-capability", + NB_OP_MODIFY, "false"); + + return nb_cli_apply_changes(vty, base_xpath); } DEFUN_YANG (neighbor_timers, -- 2.39.5