]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #6590 from streambinder/master
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 2 Jul 2020 11:56:08 +0000 (07:56 -0400)
committerGitHub <noreply@github.com>
Thu, 2 Jul 2020 11:56:08 +0000 (07:56 -0400)
bgpd: bmp: add support for L2VPN/EVPN routes

bgpd/bgp_vty.c
isisd/isis_adjacency.c
isisd/isis_adjacency.h
isisd/isis_circuit.c
lib/nexthop_group.c
pbrd/pbr_map.c
tests/topotests/pbr-topo1/test_pbr_topo1.py

index ebaa637525dfb328b16d3716f467899fae2a5128..4eb165385fe7dc796fe8396cd131310850396c67 100644 (file)
@@ -4529,23 +4529,31 @@ DEFUN (neighbor_capability_orf_prefix,
        "Capability to RECEIVE the ORF from this neighbor\n"
        "Capability to SEND the ORF to this neighbor\n")
 {
-       int idx_peer = 1;
        int idx_send_recv = 5;
-       uint16_t flag = 0;
+       char *peer_str = argv[1]->arg;
+       struct peer *peer;
+       afi_t afi = bgp_node_afi(vty);
+       safi_t safi = bgp_node_safi(vty);
 
-       if (strmatch(argv[idx_send_recv]->text, "send"))
-               flag = PEER_FLAG_ORF_PREFIX_SM;
-       else if (strmatch(argv[idx_send_recv]->text, "receive"))
-               flag = PEER_FLAG_ORF_PREFIX_RM;
-       else if (strmatch(argv[idx_send_recv]->text, "both"))
-               flag = PEER_FLAG_ORF_PREFIX_SM | PEER_FLAG_ORF_PREFIX_RM;
-       else {
-               vty_out(vty, "%% BGP invalid orf prefix-list option\n");
+       peer = peer_and_group_lookup_vty(vty, peer_str);
+       if (!peer)
                return CMD_WARNING_CONFIG_FAILED;
-       }
 
-       return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
-                                   bgp_node_safi(vty), flag);
+       if (strmatch(argv[idx_send_recv]->text, "send"))
+               return peer_af_flag_set_vty(vty, peer_str, afi, safi,
+                                           PEER_FLAG_ORF_PREFIX_SM);
+
+       if (strmatch(argv[idx_send_recv]->text, "receive"))
+               return peer_af_flag_set_vty(vty, peer_str, afi, safi,
+                                           PEER_FLAG_ORF_PREFIX_RM);
+
+       if (strmatch(argv[idx_send_recv]->text, "both"))
+               return peer_af_flag_set_vty(vty, peer_str, afi, safi,
+                                           PEER_FLAG_ORF_PREFIX_SM)
+                      | peer_af_flag_set_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_ORF_PREFIX_RM);
+
+       return CMD_WARNING_CONFIG_FAILED;
 }
 
 ALIAS_HIDDEN(
@@ -4573,24 +4581,31 @@ DEFUN (no_neighbor_capability_orf_prefix,
        "Capability to RECEIVE the ORF from this neighbor\n"
        "Capability to SEND the ORF to this neighbor\n")
 {
-       int idx_peer = 2;
        int idx_send_recv = 6;
-       uint16_t flag = 0;
+       char *peer_str = argv[2]->arg;
+       struct peer *peer;
+       afi_t afi = bgp_node_afi(vty);
+       safi_t safi = bgp_node_safi(vty);
 
-       if (strmatch(argv[idx_send_recv]->text, "send"))
-               flag = PEER_FLAG_ORF_PREFIX_SM;
-       else if (strmatch(argv[idx_send_recv]->text, "receive"))
-               flag = PEER_FLAG_ORF_PREFIX_RM;
-       else if (strmatch(argv[idx_send_recv]->text, "both"))
-               flag = PEER_FLAG_ORF_PREFIX_SM | PEER_FLAG_ORF_PREFIX_RM;
-       else {
-               vty_out(vty, "%% BGP invalid orf prefix-list option\n");
+       peer = peer_and_group_lookup_vty(vty, peer_str);
+       if (!peer)
                return CMD_WARNING_CONFIG_FAILED;
-       }
 
-       return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
-                                     bgp_node_afi(vty), bgp_node_safi(vty),
-                                     flag);
+       if (strmatch(argv[idx_send_recv]->text, "send"))
+               return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_ORF_PREFIX_SM);
+
+       if (strmatch(argv[idx_send_recv]->text, "receive"))
+               return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_ORF_PREFIX_RM);
+
+       if (strmatch(argv[idx_send_recv]->text, "both"))
+               return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_ORF_PREFIX_SM)
+                      | peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                               PEER_FLAG_ORF_PREFIX_RM);
+
+       return CMD_WARNING_CONFIG_FAILED;
 }
 
 ALIAS_HIDDEN(
@@ -4965,27 +4980,40 @@ DEFUN (neighbor_send_community_type,
        "Send Standard Community attributes\n"
        "Send Large Community attributes\n")
 {
-       int idx_peer = 1;
-       uint32_t flag = 0;
        const char *type = argv[argc - 1]->text;
+       char *peer_str = argv[1]->arg;
+       struct peer *peer;
+       afi_t afi = bgp_node_afi(vty);
+       safi_t safi = bgp_node_safi(vty);
 
-       if (strmatch(type, "standard")) {
-               SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
-       } else if (strmatch(type, "extended")) {
-               SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
-       } else if (strmatch(type, "large")) {
-               SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
-       } else if (strmatch(type, "both")) {
-               SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
-               SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
-       } else { /* if (strmatch(type, "all")) */
-               SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
-               SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
-               SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
-       }
+       peer = peer_and_group_lookup_vty(vty, peer_str);
+       if (!peer)
+               return CMD_WARNING_CONFIG_FAILED;
 
-       return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
-                                   bgp_node_safi(vty), flag);
+       if (strmatch(type, "standard"))
+               return peer_af_flag_set_vty(vty, peer_str, afi, safi,
+                                           PEER_FLAG_SEND_COMMUNITY);
+
+       if (strmatch(type, "extended"))
+               return peer_af_flag_set_vty(vty, peer_str, afi, safi,
+                                           PEER_FLAG_SEND_EXT_COMMUNITY);
+
+       if (strmatch(type, "large"))
+               return peer_af_flag_set_vty(vty, peer_str, afi, safi,
+                                           PEER_FLAG_SEND_LARGE_COMMUNITY);
+
+       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);
+       }
+       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);
 }
 
 ALIAS_HIDDEN(
@@ -5012,28 +5040,42 @@ DEFUN (no_neighbor_send_community_type,
        "Send Standard Community attributes\n"
        "Send Large Community attributes\n")
 {
-       int idx_peer = 2;
-       uint32_t flag = 0;
        const char *type = argv[argc - 1]->text;
+       char *peer_str = argv[2]->arg;
+       struct peer *peer;
+       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 (strmatch(type, "standard"))
+               return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_SEND_COMMUNITY);
+
+       if (strmatch(type, "extended"))
+               return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_SEND_EXT_COMMUNITY);
+
+       if (strmatch(type, "large"))
+               return peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_SEND_LARGE_COMMUNITY);
 
-       if (strmatch(type, "standard")) {
-               SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
-       } else if (strmatch(type, "extended")) {
-               SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
-       } else if (strmatch(type, "large")) {
-               SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
-       } else if (strmatch(type, "both")) {
-               SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
-               SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
-       } else { /* if (strmatch(type, "all")) */
-               SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
-               SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
-               SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
+       if (strmatch(type, "both")) {
+
+               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);
        }
 
-       return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
-                                     bgp_node_afi(vty), bgp_node_safi(vty),
-                                     flag);
+       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);
 }
 
 ALIAS_HIDDEN(
@@ -5225,52 +5267,74 @@ DEFUN (neighbor_attr_unchanged,
        int idx = 0;
        char *peer_str = argv[1]->arg;
        struct peer *peer;
-       uint16_t flags = 0;
+       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;
 
        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);
+               aspath = true;
+
        idx = 0;
        if (argv_find(argv, argc, "next-hop", &idx))
-               SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
+               nexthop = true;
+
        idx = 0;
        if (argv_find(argv, argc, "med", &idx))
-               SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
+               med = true;
 
        /* 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);
+       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);
        } 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 (!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 (!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);
-               }
+               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);
        }
 
-       return peer_af_flag_set_vty(vty, peer_str, afi, safi, flags);
+       return ret;
 }
 
 ALIAS_HIDDEN(
@@ -5294,27 +5358,51 @@ DEFUN (no_neighbor_attr_unchanged,
        "Med attribute\n")
 {
        int idx = 0;
-       char *peer = argv[2]->arg;
-       uint16_t flags = 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;
+
+       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);
+               aspath = true;
+
        idx = 0;
        if (argv_find(argv, argc, "next-hop", &idx))
-               SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
+               nexthop = true;
+
        idx = 0;
        if (argv_find(argv, argc, "med", &idx))
-               SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
+               med = true;
 
-       if (!flags) // no flags means all of them!
-       {
-               SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
-               SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
-               SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
-       }
+       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);
+
+       if (aspath)
+               ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_AS_PATH_UNCHANGED);
+
+       if (nexthop)
+               ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_NEXTHOP_UNCHANGED);
 
-       return peer_af_flag_unset_vty(vty, peer, bgp_node_afi(vty),
-                                     bgp_node_safi(vty), flags);
+       if (med)
+               ret |= peer_af_flag_unset_vty(vty, peer_str, afi, safi,
+                                             PEER_FLAG_MED_UNCHANGED);
+
+       return ret;
 }
 
 ALIAS_HIDDEN(
index 7be61fdf28d74b31f72de26c2457752e2a636ea3..66de11e6f75f6bbfc6c694e59a1e0e9c5ffb495f 100644 (file)
@@ -207,6 +207,22 @@ static const char *adj_state2string(int state)
        return NULL; /* not reached */
 }
 
+static const char *adj_level2string(int level)
+{
+       switch (level) {
+       case IS_LEVEL_1:
+               return "level-1";
+       case IS_LEVEL_2:
+               return "level-2";
+       case IS_LEVEL_1_AND_2:
+               return "level-1-2";
+       default:
+               return "unknown";
+       }
+
+       return NULL; /* not reached */
+}
+
 void isis_adj_process_threeway(struct isis_adjacency *adj,
                               struct isis_threeway_adj *tw_adj,
                               enum isis_adj_usage adj_usage)
@@ -259,7 +275,25 @@ void isis_adj_process_threeway(struct isis_adjacency *adj,
 
        adj->threeway_state = next_tw_state;
 }
+void isis_log_adj_change(struct isis_adjacency *adj,
+                        enum isis_adj_state old_state,
+                        enum isis_adj_state new_state, const char *reason)
+{
+       const char *adj_name;
+       struct isis_dynhn *dyn;
 
+       dyn = dynhn_find_by_id(adj->sysid);
+       if (dyn)
+               adj_name = dyn->hostname;
+       else
+               adj_name = sysid_print(adj->sysid);
+
+       zlog_info(
+               "%%ADJCHANGE: Adjacency to %s (%s) for %s changed from %s to %s, %s",
+               adj_name, adj->circuit->interface->name,
+               adj_level2string(adj->level), adj_state2string(old_state),
+               adj_state2string(new_state), reason ? reason : "unspecified");
+}
 void isis_adj_state_change(struct isis_adjacency **padj,
                           enum isis_adj_state new_state, const char *reason)
 {
@@ -280,23 +314,8 @@ void isis_adj_state_change(struct isis_adjacency **padj,
                           reason ? reason : "unspecified");
        }
 
-       if (circuit->area->log_adj_changes) {
-               const char *adj_name;
-               struct isis_dynhn *dyn;
-
-               dyn = dynhn_find_by_id(adj->sysid);
-               if (dyn)
-                       adj_name = dyn->hostname;
-               else
-                       adj_name = sysid_print(adj->sysid);
-
-               zlog_info(
-                       "%%ADJCHANGE: Adjacency to %s (%s) changed from %s to %s, %s",
-                       adj_name, adj->circuit->interface->name,
-                       adj_state2string(old_state),
-                       adj_state2string(new_state),
-                       reason ? reason : "unspecified");
-       }
+       if (circuit->area->log_adj_changes)
+               isis_log_adj_change(adj, old_state, new_state, reason);
 
        circuit->adj_state_changes++;
 #ifndef FABRICD
index ec17446ade7793200103e5c97ec10a8384a6118c..d61fbbd751f1aaab44563d5d498b173c76f06d02 100644 (file)
@@ -126,6 +126,9 @@ DECLARE_HOOK(isis_adj_ip_enabled_hook,
             (struct isis_adjacency *adj, int family), (adj, family))
 DECLARE_HOOK(isis_adj_ip_disabled_hook,
             (struct isis_adjacency *adj, int family), (adj, family))
+void isis_log_adj_change(struct isis_adjacency *adj,
+                        enum isis_adj_state old_state,
+                        enum isis_adj_state new_state, const char *reason);
 void isis_adj_state_change(struct isis_adjacency **adj,
                           enum isis_adj_state state, const char *reason);
 void isis_adj_print(struct isis_adjacency *adj);
index 9804841d6db206c4ea04f07609f0624f228dc0de..03d7b3d07bde614d7551b3fa1b760ae9504ec6c0 100644 (file)
@@ -720,6 +720,43 @@ void isis_circuit_down(struct isis_circuit *circuit)
        isis_notif_if_state_change(circuit, true);
 #endif /* ifndef FABRICD */
 
+       /* log adjacency changes if configured to do so */
+       if (circuit->area && circuit->area->log_adj_changes) {
+               struct isis_adjacency *adj = NULL;
+               if (circuit->circ_type == CIRCUIT_T_P2P) {
+                       adj = circuit->u.p2p.neighbor;
+                       if (adj)
+                               isis_log_adj_change(
+                                       adj, adj->adj_state, ISIS_ADJ_DOWN,
+                                       "circuit is being brought down");
+               } else if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
+                       struct list *adj_list;
+                       struct listnode *node;
+                       if (circuit->u.bc.adjdb[0]) {
+                               adj_list = list_new();
+                               isis_adj_build_up_list(circuit->u.bc.adjdb[0],
+                                                      adj_list);
+                               for (ALL_LIST_ELEMENTS_RO(adj_list, node, adj))
+                                       isis_log_adj_change(
+                                               adj, adj->adj_state,
+                                               ISIS_ADJ_DOWN,
+                                               "circuit is being brought down");
+                               list_delete(&adj_list);
+                       }
+                       if (circuit->u.bc.adjdb[1]) {
+                               adj_list = list_new();
+                               isis_adj_build_up_list(circuit->u.bc.adjdb[1],
+                                                      adj_list);
+                               for (ALL_LIST_ELEMENTS_RO(adj_list, node, adj))
+                                       isis_log_adj_change(
+                                               adj, adj->adj_state,
+                                               ISIS_ADJ_DOWN,
+                                               "circuit is being brought down");
+                               list_delete(&adj_list);
+                       }
+               }
+       }
+
        /* Clear the flags for all the lsps of the circuit. */
        isis_circuit_update_all_srmflags(circuit, 0);
 
index c62096a126ea9e400d36a1c1c881d40a656c2a72..4f0c72af27994cf643991662b76087ee7d0ca9ca 100644 (file)
@@ -614,6 +614,7 @@ static void nhgc_delete(struct nexthop_group_cmd *nhgc)
 
        list_delete(&nhgc->nhg_list);
 
+       QOBJ_UNREG(nhgc);
        XFREE(MTYPE_TMP, nhgc);
 }
 
index 7928b8e2e739e26978d74d4e8b03914aee911ead..edc3f1d8daf605d836b3c9f41045b0ddea66d5f0 100644 (file)
@@ -75,6 +75,7 @@ static void pbr_map_sequence_delete(struct pbr_map_sequence *pbrms)
 {
        XFREE(MTYPE_TMP, pbrms->internal_nhg_name);
 
+       QOBJ_UNREG(pbrms);
        XFREE(MTYPE_PBR_MAP_SEQNO, pbrms);
 }
 
index 5fa25813bb95a4581d5028025f0fff253b8f1db7..ffac8e288960b81515e113a0bba3ebb609da54dd 100755 (executable)
@@ -32,6 +32,7 @@ import re
 import sys
 import pytest
 import json
+import platform
 from functools import partial
 
 # Save the Current Working Directory to find configuration files.
@@ -85,6 +86,11 @@ def setup_module(module):
     tgen = Topogen(NetworkTopo, module.__name__)
     tgen.start_topology()
 
+    krel = platform.release()
+    if topotest.version_cmp(krel, "4.10") < 0:
+       tgen.errors = "Newer kernel than 4.9 needed for pbr tests"
+       pytest.skip(tgen.errors)
+
     router_list = tgen.routers()
     for rname, router in router_list.iteritems():
         # Install vrf into the kernel and slave eth3