]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_vty.c
bgpd: Adding BGP GR Global & Per Neighbour FSM changes
[mirror_frr.git] / bgpd / bgp_vty.c
index 53d9732956db91225b345d255000df8b9aabb300..9dc6549d9c40c8df295bd0dccc37f733d5cdbf5e 100644 (file)
@@ -6058,6 +6058,56 @@ static int peer_maximum_prefix_unset_vty(struct vty *vty, const char *ip_str,
        return bgp_vty_return(vty, ret);
 }
 
+/* Maximum number of prefix to be sent to the neighbor. */
+DEFUN(neighbor_maximum_prefix_out,
+      neighbor_maximum_prefix_out_cmd,
+      "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out (1-4294967295)",
+      NEIGHBOR_STR
+      NEIGHBOR_ADDR_STR2
+      "Maximum number of prefixes to be sent to this peer\n"
+      "Maximum no. of prefix limit\n")
+{
+       int idx_peer = 1;
+       int idx_number = 3;
+       struct peer *peer;
+       uint32_t max;
+       afi_t afi = bgp_node_afi(vty);
+       safi_t safi = bgp_node_safi(vty);
+
+       peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
+       if (!peer)
+               return CMD_WARNING_CONFIG_FAILED;
+
+       max = strtoul(argv[idx_number]->arg, NULL, 10);
+
+       SET_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT);
+       peer->pmax_out[afi][safi] = max;
+
+       return CMD_SUCCESS;
+}
+
+DEFUN(no_neighbor_maximum_prefix_out,
+      no_neighbor_maximum_prefix_out_cmd,
+      "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out",
+      NO_STR
+      NEIGHBOR_STR
+      NEIGHBOR_ADDR_STR2
+      "Maximum number of prefixes to be sent to this peer\n")
+{
+       int idx_peer = 2;
+       struct peer *peer;
+       afi_t afi = bgp_node_afi(vty);
+       safi_t safi = bgp_node_safi(vty);
+
+       peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
+       if (!peer)
+               return CMD_WARNING_CONFIG_FAILED;
+
+       peer->pmax_out[afi][safi] = 0;
+
+       return CMD_SUCCESS;
+}
+
 /* Maximum number of prefix configuration.  prefix count is different
    for each peer configuration.  So this configuration can be set for
    each peer configuration. */
@@ -9190,6 +9240,11 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
                        json_object_int_add(json_addr, "sentPrefixCounter",
                                                (PAF_SUBGRP(paf))->scount);
 
+               /* Maximum prefix */
+               if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT))
+                       json_object_int_add(json_addr, "prefixOutAllowedMax",
+                                           p->pmax_out[afi][safi]);
+
                /* Maximum prefix */
                if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) {
                        json_object_int_add(json_addr, "prefixAllowedMax",
@@ -9476,6 +9531,13 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
                vty_out(vty, "  %" PRIu32 " accepted prefixes\n",
                        p->pcount[afi][safi]);
 
+               /* maximum-prefix-out */
+               if (CHECK_FLAG(p->af_flags[afi][safi],
+                              PEER_FLAG_MAX_PREFIX_OUT))
+                       vty_out(vty,
+                               "  Maximum allowed prefixes sent %" PRIu32 "\n",
+                               p->pmax_out[afi][safi]);
+
                /* Maximum prefix */
                if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) {
                        vty_out(vty,
@@ -13579,6 +13641,11 @@ static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp,
                vty_out(vty, "\n");
        }
 
+       /* maximum-prefix-out */
+       if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_MAX_PREFIX_OUT))
+               vty_out(vty, "  neighbor %s maximum-prefix-out %" PRIu32 "\n",
+                       addr, peer->pmax_out[afi][safi]);
+
        /* Route server client. */
        if (peergroup_af_flag_check(peer, afi, safi,
                                    PEER_FLAG_RSERVER_CLIENT)) {
@@ -15115,6 +15182,26 @@ void bgp_vty_init(void)
        install_element(BGP_VPNV6_NODE, &neighbor_unsuppress_map_cmd);
        install_element(BGP_VPNV6_NODE, &no_neighbor_unsuppress_map_cmd);
 
+       /* neighbor maximum-prefix-out commands. */
+       install_element(BGP_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_NODE, &no_neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV4_NODE, &no_neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV4L_NODE, &no_neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV6_NODE, &no_neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV6M_NODE, &no_neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_IPV6L_NODE, &no_neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_out_cmd);
+       install_element(BGP_VPNV6_NODE, &no_neighbor_maximum_prefix_out_cmd);
+
        /* "neighbor maximum-prefix" commands. */
        install_element(BGP_NODE, &neighbor_maximum_prefix_hidden_cmd);
        install_element(BGP_NODE,