]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: attribute-unchanged issues with peer-groups 861/head
authorDaniel Walton <dwalton@cumulusnetworks.com>
Wed, 26 Jul 2017 17:49:20 +0000 (17:49 +0000)
committerDaniel Walton <dwalton@cumulusnetworks.com>
Wed, 26 Jul 2017 17:49:20 +0000 (17:49 +0000)
Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com>
bgpd/bgp_vty.c
bgpd/bgpd.c

index 8ae015173f5e80f2ef2b1aee901625c0877bddd9..65a1473f75ef4b4e3e7d78213ab96f7a477b027b 100644 (file)
@@ -4201,8 +4201,15 @@ DEFUN (neighbor_attr_unchanged,
        "Med attribute\n")
 {
        int idx = 0;
-       char *peer = argv[1]->arg;
+       char *peer_str = argv[1]->arg;
+       struct peer *peer;
        u_int16_t flags = 0;
+       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)
+               return CMD_WARNING_CONFIG_FAILED;
 
        if (argv_find(argv, argc, "as-path", &idx))
                SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
@@ -4213,15 +4220,35 @@ DEFUN (neighbor_attr_unchanged,
        if (argv_find(argv, argc, "med", &idx))
                SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
 
-       if (!flags) // no flags means all of them!
-       {
+       /* no flags means all of them! */
+       if (!flags) {
                SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
                SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
                SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
+       } else {
+               if (!CHECK_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED) &&
+                   peer_af_flag_check(peer, afi, safi,
+                                      PEER_FLAG_AS_PATH_UNCHANGED)) {
+                       peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                              PEER_FLAG_AS_PATH_UNCHANGED);
+               }
+
+               if (!CHECK_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED) &&
+                   peer_af_flag_check(peer, afi, safi,
+                                      PEER_FLAG_NEXTHOP_UNCHANGED)) {
+                       peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                              PEER_FLAG_NEXTHOP_UNCHANGED);
+               }
+
+               if (!CHECK_FLAG(flags, PEER_FLAG_MED_UNCHANGED) &&
+                   peer_af_flag_check(peer, afi, safi,
+                                      PEER_FLAG_MED_UNCHANGED)) {
+                       peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                              PEER_FLAG_MED_UNCHANGED);
+               }
        }
 
-       return peer_af_flag_set_vty(vty, peer, bgp_node_afi(vty),
-                                   bgp_node_safi(vty), flags);
+       return peer_af_flag_set_vty(vty, peer_str, afi, safi, flags);
 }
 
 ALIAS_HIDDEN(
index 3453da665a0f7922ab37b6d1b9f11456100d5497..a0e2d6749a735064fe7b2a13c2eaf3d779e19977 100644 (file)
@@ -6926,36 +6926,34 @@ static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp,
        bgp_config_write_filter(vty, peer, afi, safi, write);
 
        /* atribute-unchanged. */
-       if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
-           || CHECK_FLAG(peer->af_flags[afi][safi],
-                         PEER_FLAG_NEXTHOP_UNCHANGED)
-           || CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED)) {
-               if (peergroup_af_flag_check(peer, afi, safi,
-                                           PEER_FLAG_AS_PATH_UNCHANGED)
-                   && peergroup_af_flag_check(peer, afi, safi,
-                                              PEER_FLAG_NEXTHOP_UNCHANGED)
-                   && peergroup_af_flag_check(peer, afi, safi,
-                                              PEER_FLAG_MED_UNCHANGED)) {
-                       afi_header_vty_out(
-                               vty, afi, safi, write,
-                               "  neighbor %s attribute-unchanged\n", addr);
-               } else {
+       if (peer_af_flag_check(peer, afi, safi, PEER_FLAG_AS_PATH_UNCHANGED) ||
+           peer_af_flag_check(peer, afi, safi, PEER_FLAG_NEXTHOP_UNCHANGED) ||
+           peer_af_flag_check(peer, afi, safi, PEER_FLAG_MED_UNCHANGED)) {
+
+               if (!peer_group_active(peer) ||
+                    peergroup_af_flag_check(peer, afi, safi,
+                                            PEER_FLAG_AS_PATH_UNCHANGED) ||
+                    peergroup_af_flag_check(peer, afi, safi,
+                                            PEER_FLAG_NEXTHOP_UNCHANGED) ||
+                    peergroup_af_flag_check(peer, afi, safi,
+                                            PEER_FLAG_MED_UNCHANGED)) {
+
                        afi_header_vty_out(
                                vty, afi, safi, write,
                                "  neighbor %s attribute-unchanged%s%s%s\n",
                                addr,
-                               peergroup_af_flag_check(
+                               peer_af_flag_check(
                                        peer, afi, safi,
                                        PEER_FLAG_AS_PATH_UNCHANGED)
                                        ? " as-path"
                                        : "",
-                               peergroup_af_flag_check(
+                               peer_af_flag_check(
                                        peer, afi, safi,
                                        PEER_FLAG_NEXTHOP_UNCHANGED)
                                        ? " next-hop"
                                        : "",
-                               peergroup_af_flag_check(peer, afi, safi,
-                                                       PEER_FLAG_MED_UNCHANGED)
+                               peer_af_flag_check(peer, afi, safi,
+                                                  PEER_FLAG_MED_UNCHANGED)
                                        ? " med"
                                        : "");
                }