diff options
| -rw-r--r-- | bgpd/bgp_attr.c | 7 | ||||
| -rw-r--r-- | bgpd/bgp_community.c | 15 | ||||
| -rw-r--r-- | bgpd/bgp_ecommunity.c | 12 | ||||
| -rw-r--r-- | bgpd/bgp_lcommunity.c | 8 | ||||
| -rw-r--r-- | bgpd/bgp_updgrp_packet.c | 2 | ||||
| -rw-r--r-- | bgpd/bgpd.c | 11 | ||||
| -rw-r--r-- | configure.ac | 2 | ||||
| -rw-r--r-- | ospf6d/ospf6_message.c | 1 | ||||
| -rw-r--r-- | tests/topotests/bgp_conditional_advertisement/r1/bgpd.conf | 1 | ||||
| -rw-r--r-- | tests/topotests/bgp_conditional_advertisement/r2/bgpd.conf | 1 | ||||
| -rw-r--r-- | tests/topotests/bgp_conditional_advertisement/r3/bgpd.conf | 1 | ||||
| -rw-r--r-- | tests/topotests/bgp_default_route/r2/bgpd.conf | 3 | ||||
| -rw-r--r-- | tests/topotests/bgp_default_route/test_bgp_default-originate.py | 27 | ||||
| -rw-r--r-- | tests/topotests/lib/common_config.py | 34 | ||||
| -rwxr-xr-x | tools/frr-reload.py | 46 |
15 files changed, 74 insertions, 97 deletions
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 24b48178d2..adf408220e 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -2915,11 +2915,8 @@ static bgp_attr_parse_ret_t bgp_attr_unknown(struct bgp_attr_parser_args *args) if (!transit) transit = XCALLOC(MTYPE_TRANSIT, sizeof(struct transit)); - if (transit->val) - transit->val = XREALLOC(MTYPE_TRANSIT_VAL, transit->val, - transit->length + total); - else - transit->val = XMALLOC(MTYPE_TRANSIT_VAL, total); + transit->val = XREALLOC(MTYPE_TRANSIT_VAL, transit->val, + transit->length + total); memcpy(transit->val + transit->length, startp, total); transit->length += total; diff --git a/bgpd/bgp_community.c b/bgpd/bgp_community.c index 2aa6a56a5e..e91166449a 100644 --- a/bgpd/bgp_community.c +++ b/bgpd/bgp_community.c @@ -60,11 +60,7 @@ void community_free(struct community **com) void community_add_val(struct community *com, uint32_t val) { com->size++; - if (com->val) - com->val = XREALLOC(MTYPE_COMMUNITY_VAL, com->val, - com_length(com)); - else - com->val = XMALLOC(MTYPE_COMMUNITY_VAL, com_length(com)); + com->val = XREALLOC(MTYPE_COMMUNITY_VAL, com->val, com_length(com)); val = htonl(val); memcpy(com_lastval(com), &val, sizeof(uint32_t)); @@ -618,13 +614,8 @@ bool community_cmp(const struct community *com1, const struct community *com2) struct community *community_merge(struct community *com1, struct community *com2) { - if (com1->val) - com1->val = - XREALLOC(MTYPE_COMMUNITY_VAL, com1->val, - (com1->size + com2->size) * COMMUNITY_SIZE); - else - com1->val = XMALLOC(MTYPE_COMMUNITY_VAL, - (com1->size + com2->size) * COMMUNITY_SIZE); + com1->val = XREALLOC(MTYPE_COMMUNITY_VAL, com1->val, + (com1->size + com2->size) * COMMUNITY_SIZE); memcpy(com1->val + com1->size, com2->val, com2->size * COMMUNITY_SIZE); com1->size += com2->size; diff --git a/bgpd/bgp_ecommunity.c b/bgpd/bgp_ecommunity.c index 923c9b0d7e..3a951e6e80 100644 --- a/bgpd/bgp_ecommunity.c +++ b/bgpd/bgp_ecommunity.c @@ -158,7 +158,6 @@ static bool ecommunity_add_val_internal(struct ecommunity *ecom, ecom->val = XREALLOC(MTYPE_ECOMMUNITY_VAL, ecom->val, ecom_length_size(ecom, ecom_size)); - memmove(ecom->val + ((ins_idx + 1) * ecom_size), ecom->val + (ins_idx * ecom_size), (ecom->size - 1 - ins_idx) * ecom_size); @@ -287,14 +286,9 @@ char *ecommunity_str(struct ecommunity *ecom) struct ecommunity *ecommunity_merge(struct ecommunity *ecom1, struct ecommunity *ecom2) { - if (ecom1->val) - ecom1->val = XREALLOC(MTYPE_ECOMMUNITY_VAL, ecom1->val, - (size_t)(ecom1->size + ecom2->size) - * (size_t)ecom1->unit_size); - else - ecom1->val = XMALLOC(MTYPE_ECOMMUNITY_VAL, - (size_t)(ecom1->size + ecom2->size) - * (size_t)ecom1->unit_size); + ecom1->val = XREALLOC(MTYPE_ECOMMUNITY_VAL, ecom1->val, + (size_t)(ecom1->size + ecom2->size) + * (size_t)ecom1->unit_size); memcpy(ecom1->val + (ecom1->size * ecom1->unit_size), ecom2->val, (size_t)ecom2->size * (size_t)ecom1->unit_size); diff --git a/bgpd/bgp_lcommunity.c b/bgpd/bgp_lcommunity.c index fa4d4aee28..6121c4905f 100644 --- a/bgpd/bgp_lcommunity.c +++ b/bgpd/bgp_lcommunity.c @@ -166,12 +166,8 @@ struct lcommunity *lcommunity_dup(struct lcommunity *lcom) struct lcommunity *lcommunity_merge(struct lcommunity *lcom1, struct lcommunity *lcom2) { - if (lcom1->val) - lcom1->val = XREALLOC(MTYPE_LCOMMUNITY_VAL, lcom1->val, - lcom_length(lcom1) + lcom_length(lcom2)); - else - lcom1->val = XMALLOC(MTYPE_LCOMMUNITY_VAL, - lcom_length(lcom1) + lcom_length(lcom2)); + lcom1->val = XREALLOC(MTYPE_LCOMMUNITY_VAL, lcom1->val, + lcom_length(lcom1) + lcom_length(lcom2)); memcpy(lcom1->val + lcom_length(lcom1), lcom2->val, lcom_length(lcom2)); lcom1->size += lcom2->size; diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index 038ef4f798..9c32c7ed1e 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -1158,6 +1158,7 @@ void subgroup_default_update_packet(struct update_subgroup *subgrp, (void)bpacket_queue_add(SUBGRP_PKTQ(subgrp), s, &vecarr); subgroup_trigger_write(subgrp); + subgrp->scount++; } void subgroup_default_withdraw_packet(struct update_subgroup *subgrp) @@ -1250,6 +1251,7 @@ void subgroup_default_withdraw_packet(struct update_subgroup *subgrp) (void)bpacket_queue_add(SUBGRP_PKTQ(subgrp), s, NULL); subgroup_trigger_write(subgrp); + subgrp->scount--; } static void diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 77c2f618ba..6c9ec0ebaa 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -656,14 +656,9 @@ int bgp_confederation_peers_add(struct bgp *bgp, as_t as) if (bgp_confederation_peers_check(bgp, as)) return -1; - if (bgp->confed_peers) - bgp->confed_peers = - XREALLOC(MTYPE_BGP_CONFED_LIST, bgp->confed_peers, - (bgp->confed_peers_cnt + 1) * sizeof(as_t)); - else - bgp->confed_peers = - XMALLOC(MTYPE_BGP_CONFED_LIST, - (bgp->confed_peers_cnt + 1) * sizeof(as_t)); + bgp->confed_peers = + XREALLOC(MTYPE_BGP_CONFED_LIST, bgp->confed_peers, + (bgp->confed_peers_cnt + 1) * sizeof(as_t)); bgp->confed_peers[bgp->confed_peers_cnt] = as; bgp->confed_peers_cnt++; diff --git a/configure.ac b/configure.ac index 564588cca7..1ad87d9435 100644 --- a/configure.ac +++ b/configure.ac @@ -703,7 +703,7 @@ AC_ARG_ENABLE([thread-sanitizer], AC_ARG_ENABLE([memory-sanitizer], AS_HELP_STRING([--enable-memory-sanitizer], [enable MemorySanitizer support for detecting uninitialized memory reads])) AC_ARG_ENABLE([undefined-sanitizer], - AS_HELP_STRING([--undefined-sanitizer], [enable UndefinedBehaviorSanitizer support for detecting undefined behavior])) + AS_HELP_STRING([--enable-undefined-sanitizer], [enable UndefinedBehaviorSanitizer support for detecting undefined behavior])) AC_ARG_WITH([crypto], AS_HELP_STRING([--with-crypto=<internal|openssl>], [choose between different implementations of cryptographic functions(default value is --with-crypto=internal)])) AC_ARG_WITH([frr-format], diff --git a/ospf6d/ospf6_message.c b/ospf6d/ospf6_message.c index 1f2618ec83..549f5668b9 100644 --- a/ospf6d/ospf6_message.c +++ b/ospf6d/ospf6_message.c @@ -1977,7 +1977,6 @@ static int ospf6_write(struct thread *thread) __func__, latency); oi->last_hello = timestamp; oi->hello_out++; - ospf6_hello_print(oh, OSPF6_ACTION_SEND); break; case OSPF6_MESSAGE_TYPE_DBDESC: oi->db_desc_out++; diff --git a/tests/topotests/bgp_conditional_advertisement/r1/bgpd.conf b/tests/topotests/bgp_conditional_advertisement/r1/bgpd.conf index 633d1832fd..293b38c7e8 100644 --- a/tests/topotests/bgp_conditional_advertisement/r1/bgpd.conf +++ b/tests/topotests/bgp_conditional_advertisement/r1/bgpd.conf @@ -17,6 +17,7 @@ route-map DEF permit 10 ! router bgp 1 bgp log-neighbor-changes + bgp conditional-advertisement timer 5 no bgp ebgp-requires-policy neighbor 10.10.10.2 remote-as 2 ! diff --git a/tests/topotests/bgp_conditional_advertisement/r2/bgpd.conf b/tests/topotests/bgp_conditional_advertisement/r2/bgpd.conf index c6147fe658..82525fac64 100644 --- a/tests/topotests/bgp_conditional_advertisement/r2/bgpd.conf +++ b/tests/topotests/bgp_conditional_advertisement/r2/bgpd.conf @@ -32,6 +32,7 @@ route-map RMAP-2 deny 10 ! router bgp 2 bgp log-neighbor-changes + bgp conditional-advertisement timer 5 no bgp ebgp-requires-policy neighbor 10.10.10.1 remote-as 1 neighbor 10.10.20.3 remote-as 3 diff --git a/tests/topotests/bgp_conditional_advertisement/r3/bgpd.conf b/tests/topotests/bgp_conditional_advertisement/r3/bgpd.conf index 2f4f5068d8..f389f309a6 100644 --- a/tests/topotests/bgp_conditional_advertisement/r3/bgpd.conf +++ b/tests/topotests/bgp_conditional_advertisement/r3/bgpd.conf @@ -1,6 +1,7 @@ ! router bgp 3 bgp log-neighbor-changes + bgp conditional-advertisement timer 5 no bgp ebgp-requires-policy neighbor 10.10.20.2 remote-as 2 ! diff --git a/tests/topotests/bgp_default_route/r2/bgpd.conf b/tests/topotests/bgp_default_route/r2/bgpd.conf index 00c96cc58b..6d1080c119 100644 --- a/tests/topotests/bgp_default_route/r2/bgpd.conf +++ b/tests/topotests/bgp_default_route/r2/bgpd.conf @@ -2,7 +2,4 @@ router bgp 65001 no bgp ebgp-requires-policy neighbor 192.168.255.1 remote-as 65000 neighbor 192.168.255.1 timers 3 10 - address-family ipv4 unicast - redistribute connected - exit-address-family ! diff --git a/tests/topotests/bgp_default_route/test_bgp_default-originate.py b/tests/topotests/bgp_default_route/test_bgp_default-originate.py index d8de0f0ac6..19632162b4 100644 --- a/tests/topotests/bgp_default_route/test_bgp_default-originate.py +++ b/tests/topotests/bgp_default_route/test_bgp_default-originate.py @@ -79,10 +79,10 @@ def test_bgp_default_originate_route_map(): if tgen.routers_have_failure(): pytest.skip(tgen.errors) - router = tgen.gears["r2"] - - def _bgp_converge(router): - output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json")) + def _bgp_check_if_received(): + output = json.loads( + tgen.gears["r2"].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json") + ) expected = { "192.168.255.1": { "bgpState": "Established", @@ -91,22 +91,27 @@ def test_bgp_default_originate_route_map(): } return topotest.json_cmp(output, expected) + def _bgp_check_if_originated(): + output = json.loads(tgen.gears["r1"].vtysh_cmd("show ip bgp summary json")) + expected = {"ipv4Unicast": {"peers": {"192.168.255.2": {"pfxSnt": 1}}}} + return topotest.json_cmp(output, expected) + def _bgp_default_route_is_valid(router): output = json.loads(router.vtysh_cmd("show ip bgp 0.0.0.0/0 json")) expected = {"paths": [{"valid": True}]} return topotest.json_cmp(output, expected) - test_func = functools.partial(_bgp_converge, router) + test_func = functools.partial(_bgp_check_if_received) success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) + assert result is None, "No 0.0.0.0/0 at r2 from r1" - assert result is None, 'Failed to see bgp convergence in "{}"'.format(router) - - test_func = functools.partial(_bgp_default_route_is_valid, router) + test_func = functools.partial(_bgp_check_if_originated) success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) + assert result is None, "No 0.0.0.0/0 from r1 to r2" - assert ( - result is None - ), 'Failed to see applied metric for default route in "{}"'.format(router) + test_func = functools.partial(_bgp_default_route_is_valid, tgen.gears["r2"]) + success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5) + assert result is None, "Failed to see 0.0.0.0/0 in r2" if __name__ == "__main__": diff --git a/tests/topotests/lib/common_config.py b/tests/topotests/lib/common_config.py index d2f20aa7b3..6a02e50127 100644 --- a/tests/topotests/lib/common_config.py +++ b/tests/topotests/lib/common_config.py @@ -497,7 +497,7 @@ def reset_config_on_routers(tgen, routerName=None): f.close() run_cfg_file = "{}/{}/frr.sav".format(TMPDIR, rname) init_cfg_file = "{}/{}/frr_json_initial.conf".format(TMPDIR, rname) - command = "/usr/lib/frr/frr-reload.py --input {} --test {} > {}".format( + command = "/usr/lib/frr/frr-reload.py --test --test-reset --input {} {} > {}".format( run_cfg_file, init_cfg_file, dname ) result = call(command, shell=True, stderr=SUB_STDOUT, stdout=SUB_PIPE) @@ -527,37 +527,9 @@ def reset_config_on_routers(tgen, routerName=None): raise InvalidCLIError(out_data) raise InvalidCLIError("Unknown error in %s", output) - f = open(dname, "r") delta = StringIO() - delta.write("configure terminal\n") - t_delta = f.read() - - # Don't disable debugs - check_debug = True - - for line in t_delta.split("\n"): - line = line.strip() - if line == "Lines To Delete" or line == "===============" or not line: - continue - - if line == "Lines To Add": - check_debug = False - continue - - if line == "============" or not line: - continue - - # Leave debugs and log output alone - if check_debug: - if "debug" in line or "log file" in line: - continue - - delta.write(line) - delta.write("\n") - - f.close() - - delta.write("end\n") + with open(dname, "r") as f: + delta.write(f.read()) output = router.vtysh_multicmd(delta.getvalue(), pretty_output=False) diff --git a/tools/frr-reload.py b/tools/frr-reload.py index eb8753fd08..9d41305ec3 100755 --- a/tools/frr-reload.py +++ b/tools/frr-reload.py @@ -2012,6 +2012,11 @@ if __name__ == "__main__": parser.add_argument( "--daemon", help="daemon for which want to replace the config", default="" ) + parser.add_argument( + "--test-reset", + action="store_true", + help="Used by topotest to not delete debug or log file commands", + ) args = parser.parse_args() @@ -2125,7 +2130,7 @@ if __name__ == "__main__": service_integrated_vtysh_config = False break - if not service_integrated_vtysh_config and not args.daemon: + if not args.test and not service_integrated_vtysh_config and not args.daemon: log.error( "'service integrated-vtysh-config' is not configured, this is required for 'service frr reload'" ) @@ -2153,35 +2158,56 @@ if __name__ == "__main__": running.load_from_show_running(args.daemon) (lines_to_add, lines_to_del) = compare_context_objects(newconf, running) - lines_to_configure = [] if lines_to_del: - print("\nLines To Delete") - print("===============") + if not args.test_reset: + print("\nLines To Delete") + print("===============") for (ctx_keys, line) in lines_to_del: if line == "!": continue - cmd = "\n".join(lines_to_config(ctx_keys, line, True)) - lines_to_configure.append(cmd) + nolines = lines_to_config(ctx_keys, line, True) + + if args.test_reset: + # For topotests the original code stripped the lines, and ommitted blank lines + # after, do that here + nolines = [x.strip() for x in nolines] + # For topotests leave these lines in (don't delete them) + # [chopps: why is "log file" more special than other "log" commands?] + nolines = [x for x in nolines if "debug" not in x and "log file" not in x] + if not nolines: + continue + + cmd = "\n".join(nolines) print(cmd) if lines_to_add: - print("\nLines To Add") - print("============") + if not args.test_reset: + print("\nLines To Add") + print("============") for (ctx_keys, line) in lines_to_add: if line == "!": continue - cmd = "\n".join(lines_to_config(ctx_keys, line, False)) - lines_to_configure.append(cmd) + lines = lines_to_config(ctx_keys, line, False) + + if args.test_reset: + # For topotests the original code stripped the lines, and ommitted blank lines + # after, do that here + lines = [x.strip() for x in lines if x.strip()] + if not lines: + continue + + cmd = "\n".join(lines) print(cmd) elif args.reload: + lines_to_configure = [] # We will not be able to do anything, go ahead and exit(1) if not vtysh.is_config_available(): |
