summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/commitlint.config.js44
-rw-r--r--.github/workflows/commitlint.yml19
-rw-r--r--babeld/babel_filter.c7
-rw-r--r--bgpd/bgp_ecommunity.c2
-rw-r--r--bgpd/bgp_evpn_vty.c15
-rw-r--r--bgpd/bgp_io.c13
-rw-r--r--bgpd/bgp_labelpool.c10
-rw-r--r--bgpd/bgp_mplsvpn.c17
-rw-r--r--bgpd/bgp_mplsvpn.h3
-rw-r--r--bgpd/bgp_packet.c3
-rw-r--r--bgpd/bgp_route.c32
-rw-r--r--bgpd/rfapi/rfapi_vty.h3
-rw-r--r--doc/developer/workflow.rst40
-rw-r--r--doc/user/installation.rst3
-rw-r--r--ldpd/ldp_vty_exec.c4
-rw-r--r--lib/db.h7
-rw-r--r--lib/libfrr.c2
-rw-r--r--lib/vty.c15
-rw-r--r--lib/vty.h4
-rw-r--r--lib/zlog.h4
-rw-r--r--ospf6d/ospf6_gr_helper.c17
-rw-r--r--ospf6d/ospf6_lsa.c4
-rw-r--r--ospf6d/ospf6_top.c16
-rw-r--r--ospfd/ospf_ldp_sync.c7
-rw-r--r--ospfd/ospf_vty.c57
-rw-r--r--pceplib/pcep_utils_counters.h1
-rw-r--r--pimd/pim_cmd_common.c28
-rw-r--r--tests/bgpd/test_peer_attr.c108
-rw-r--r--tests/lib/test_nexthop_iter.c1
-rw-r--r--tests/topotests/bgp_lu_topo1/R1/labelpool.summ.json12
-rw-r--r--tests/topotests/bgp_lu_topo1/R2/labelpool.summ.json12
-rw-r--r--tests/topotests/bgp_lu_topo2/R1/labelpool.summ.json12
-rw-r--r--tests/topotests/bgp_lu_topo2/R2/labelpool.summ.json12
-rw-r--r--tests/topotests/bgp_route_map_vpn_import/__init__.py0
-rw-r--r--tests/topotests/bgp_route_map_vpn_import/r1/bgpd.conf46
-rw-r--r--tests/topotests/bgp_route_map_vpn_import/r1/zebra.conf16
-rw-r--r--tests/topotests/bgp_route_map_vpn_import/test_bgp_route_map_vpn_import.py126
-rw-r--r--tests/topotests/ldp_snmp/r1/show_l2vpn_vc.ref2
-rw-r--r--tests/topotests/ldp_snmp/r2/show_l2vpn_vc.ref2
-rw-r--r--tests/topotests/ldp_sync_isis_topo1/r1/show_l2vpn_vc.ref2
-rw-r--r--tests/topotests/ldp_sync_isis_topo1/r2/show_l2vpn_vc.ref2
-rw-r--r--tests/topotests/ldp_sync_ospf_topo1/r1/show_l2vpn_vc.ref2
-rw-r--r--tests/topotests/ldp_sync_ospf_topo1/r2/show_l2vpn_vc.ref2
-rw-r--r--tests/topotests/ldp_vpls_topo1/r1/show_l2vpn_vc.ref2
-rw-r--r--tests/topotests/ldp_vpls_topo1/r2/show_l2vpn_vc.ref2
-rw-r--r--tests/topotests/lib/bgp.py2
-rw-r--r--tests/topotests/lib/ospf.py12
-rw-r--r--tests/topotests/lib/pim.py4
-rw-r--r--tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_topo1.py328
-rw-r--r--tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_type7_lsa.py30
-rw-r--r--tests/topotests/ospf_gr_topo1/rt1/show_ip_ospf_route.json4
-rw-r--r--tests/topotests/ospf_gr_topo1/rt2/show_ip_ospf_route.json6
-rw-r--r--tests/topotests/ospf_gr_topo1/rt3/show_ip_ospf_route.json8
-rw-r--r--tests/topotests/ospf_gr_topo1/rt4/show_ip_ospf_route.json6
-rw-r--r--tests/topotests/ospf_gr_topo1/rt5/show_ip_ospf_route.json4
-rw-r--r--tests/topotests/ospf_gr_topo1/rt6/show_ip_ospf_route.json6
-rw-r--r--tests/topotests/ospf_gr_topo1/rt7/show_ip_ospf_route.json4
-rw-r--r--tests/topotests/ospf_unnumbered/r1/ospf-route.json2
-rw-r--r--tests/topotests/ospf_unnumbered/r2/ospf-route.json2
-rw-r--r--tests/topotests/ospfv3_basic_functionality/test_ospfv3_asbr_summary_topo1.py170
-rw-r--r--vtysh/vtysh.c3
-rw-r--r--zebra/zebra_vxlan.c20
62 files changed, 760 insertions, 589 deletions
diff --git a/.github/commitlint.config.js b/.github/commitlint.config.js
new file mode 100644
index 0000000000..cf7daab867
--- /dev/null
+++ b/.github/commitlint.config.js
@@ -0,0 +1,44 @@
+module.exports = {
+ rules: {
+ 'header-max-length': [2, 'always', 72],
+ 'type-case': [2, 'always', 'lower-case'],
+ 'type-empty': [2, 'never'],
+ 'type-enum': [
+ 2,
+ 'always',
+ [
+ 'babeld',
+ 'bfdd',
+ 'bgpd',
+ 'doc',
+ 'docker',
+ 'eigrpd',
+ 'fpm',
+ 'isisd',
+ 'ldpd',
+ 'lib',
+ 'multi',
+ 'nhrpd',
+ 'ospf6d',
+ 'ospfd',
+ 'pbrd',
+ 'pimd',
+ 'pim6d',
+ 'ripd',
+ 'ripngd',
+ 'sharpd',
+ 'staticd',
+ 'tests',
+ 'tools',
+ 'vtysh',
+ 'vrrpd',
+ 'yang',
+ 'zebra',
+ 'all',
+ ],
+ ],
+ 'subject-empty': [2, 'never'],
+ 'subject-full-stop': [2, 'never', '.'],
+ 'subject-case': [2, 'always', 'sentence-case'],
+ },
+};
diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml
new file mode 100644
index 0000000000..a1f273a2ce
--- /dev/null
+++ b/.github/workflows/commitlint.yml
@@ -0,0 +1,19 @@
+name: commitlint
+
+on:
+ pull_request_target:
+ types:
+ - opened
+ - reopened
+
+jobs:
+ lint:
+ if: github.repository == 'frrouting/frr'
+ permissions:
+ contents: read
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check Commit
+ uses: wagoid/commitlint-github-action@v5
+ with:
+ configFile: .github/commitlint.config.js
diff --git a/babeld/babel_filter.c b/babeld/babel_filter.c
index 731ad1ba8b..f49fee8dae 100644
--- a/babeld/babel_filter.c
+++ b/babeld/babel_filter.c
@@ -44,15 +44,18 @@ babel_filter(int output, const unsigned char *prefix, unsigned short plen,
struct prefix_list *plist;
int distribute;
struct babel *babel;
+ afi_t family;
p.family = v4mapped(prefix) ? AF_INET : AF_INET6;
p.prefixlen = v4mapped(prefix) ? plen - 96 : plen;
if (p.family == AF_INET) {
uchar_to_inaddr(&p.u.prefix4, prefix);
distribute = output ? DISTRIBUTE_V4_OUT : DISTRIBUTE_V4_IN;
+ family = AFI_IP;
} else {
uchar_to_in6addr(&p.u.prefix6, prefix);
distribute = output ? DISTRIBUTE_V6_OUT : DISTRIBUTE_V6_IN;
+ family = AFI_IP6;
}
if (babel_ifp != NULL && babel_ifp->list[distribute]) {
@@ -79,7 +82,7 @@ babel_filter(int output, const unsigned char *prefix, unsigned short plen,
dist = distribute_lookup (babel->distribute_ctx, NULL);
if (dist) {
if (dist->list[distribute]) {
- alist = access_list_lookup (p.family, dist->list[distribute]);
+ alist = access_list_lookup (family, dist->list[distribute]);
if (alist) {
if (access_list_apply (alist, &p) == FILTER_DENY) {
@@ -90,7 +93,7 @@ babel_filter(int output, const unsigned char *prefix, unsigned short plen,
}
}
if (dist->prefix[distribute]) {
- plist = prefix_list_lookup (p.family, dist->prefix[distribute]);
+ plist = prefix_list_lookup (family, dist->prefix[distribute]);
if (plist) {
if (prefix_list_apply (plist, &p) == PREFIX_DENY) {
debugf(BABEL_DEBUG_FILTER,"%pFX filtered by distribute %s",
diff --git a/bgpd/bgp_ecommunity.c b/bgpd/bgp_ecommunity.c
index 62fba1f58e..04005884ae 100644
--- a/bgpd/bgp_ecommunity.c
+++ b/bgpd/bgp_ecommunity.c
@@ -699,6 +699,7 @@ static struct ecommunity *ecommunity_str2com_internal(const char *str, int type,
while ((str = ecommunity_gettoken(str, (void *)&eval, &token))) {
switch (token) {
case ecommunity_token_rt:
+ case ecommunity_token_rt6:
case ecommunity_token_soo:
if (!keyword_included || keyword) {
if (ecom)
@@ -746,7 +747,6 @@ static struct ecommunity *ecommunity_str2com_internal(const char *str, int type,
ecom->unit_size);
break;
case ecommunity_token_unknown:
- default:
if (ecom)
ecommunity_free(&ecom);
return NULL;
diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c
index 3c7fb4cb17..0b5f81ccb0 100644
--- a/bgpd/bgp_evpn_vty.c
+++ b/bgpd/bgp_evpn_vty.c
@@ -4807,14 +4807,13 @@ DEFUN(show_bgp_l2vpn_evpn_route,
evpn_show_all_routes(vty, bgp, type, json, detail);
- if (uj) {
- if (detail) {
- vty_out(vty, "%s\n", json_object_to_json_string(json));
- json_object_free(json);
- } else {
- vty_json(vty, json);
- }
- }
+ /*
+ * This is an extremely expensive operation at scale
+ * and as such we need to save as much time as is
+ * possible.
+ */
+ if (uj)
+ vty_json_no_pretty(vty, json);
return CMD_SUCCESS;
}
diff --git a/bgpd/bgp_io.c b/bgpd/bgp_io.c
index 49ae9816a3..f9dc64af45 100644
--- a/bgpd/bgp_io.c
+++ b/bgpd/bgp_io.c
@@ -173,12 +173,11 @@ static int read_ibuf_work(struct peer *peer)
uint16_t pktsize = 0;
struct stream *pkt;
- /* Hold the I/O lock, we might not have space on the InQ */
- frr_mutex_lock_autounlock(&peer->io_mtx);
/* ============================================== */
-
- if (peer->ibuf->count >= bm->inq_limit)
- return -ENOMEM;
+ frr_with_mutex (&peer->io_mtx) {
+ if (peer->ibuf->count >= bm->inq_limit)
+ return -ENOMEM;
+ }
/* check that we have enough data for a header */
if (ringbuf_remain(ibw) < BGP_HEADER_SIZE)
@@ -211,7 +210,9 @@ static int read_ibuf_work(struct peer *peer)
stream_set_endp(pkt, pktsize);
frrtrace(2, frr_bgp, packet_read, peer, pkt);
- stream_fifo_push(peer->ibuf, pkt);
+ frr_with_mutex (&peer->io_mtx) {
+ stream_fifo_push(peer->ibuf, pkt);
+ }
return pktsize;
}
diff --git a/bgpd/bgp_labelpool.c b/bgpd/bgp_labelpool.c
index 129878451d..d60552011c 100644
--- a/bgpd/bgp_labelpool.c
+++ b/bgpd/bgp_labelpool.c
@@ -743,22 +743,12 @@ DEFUN(show_bgp_labelpool_summary, show_bgp_labelpool_summary_cmd,
if (uj) {
json = json_object_new_object();
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys starting with capital")
-#endif
- json_object_int_add(json, "Ledger", skiplist_count(lp->ledger));
json_object_int_add(json, "ledger", skiplist_count(lp->ledger));
- json_object_int_add(json, "InUse", skiplist_count(lp->inuse));
json_object_int_add(json, "inUse", skiplist_count(lp->inuse));
- json_object_int_add(json, "Requests",
- lp_fifo_count(&lp->requests));
json_object_int_add(json, "requests",
lp_fifo_count(&lp->requests));
- json_object_int_add(json, "LabelChunks", listcount(lp->chunks));
json_object_int_add(json, "labelChunks", listcount(lp->chunks));
- json_object_int_add(json, "Pending", lp->pending_count);
json_object_int_add(json, "pending", lp->pending_count);
- json_object_int_add(json, "Reconnects", lp->reconnect_count);
json_object_int_add(json, "reconnects", lp->reconnect_count);
vty_json(vty, json);
} else {
diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c
index 288115f211..33e7d971ad 100644
--- a/bgpd/bgp_mplsvpn.c
+++ b/bgpd/bgp_mplsvpn.c
@@ -1192,7 +1192,7 @@ leak_update(struct bgp *to_bgp, struct bgp_dest *bn,
if (!ecommunity_cmp(
bgp_attr_get_ecommunity(bpi->attr),
bgp_attr_get_ecommunity(new_attr))) {
- vpn_leak_to_vrf_withdraw(to_bgp, bpi);
+ vpn_leak_to_vrf_withdraw(bpi);
bgp_aggregate_decrement(to_bgp, p, bpi, afi,
safi);
bgp_path_info_delete(bn, bpi);
@@ -1722,7 +1722,7 @@ void vpn_leak_from_vrf_withdraw(struct bgp *to_bgp, /* to */
if (bpi) {
/* withdraw from looped vrfs as well */
- vpn_leak_to_vrf_withdraw(to_bgp, bpi);
+ vpn_leak_to_vrf_withdraw(bpi);
bgp_aggregate_decrement(to_bgp, p, bpi, afi, safi);
bgp_path_info_delete(bn, bpi);
@@ -1777,7 +1777,7 @@ void vpn_leak_from_vrf_withdraw_all(struct bgp *to_bgp, struct bgp *from_bgp,
zlog_debug("%s: deleting it",
__func__);
/* withdraw from leak-to vrfs as well */
- vpn_leak_to_vrf_withdraw(to_bgp, bpi);
+ vpn_leak_to_vrf_withdraw(bpi);
bgp_aggregate_decrement(
to_bgp, bgp_dest_get_prefix(bn),
bpi, afi, safi);
@@ -1873,7 +1873,10 @@ static bool vpn_leak_to_vrf_update_onevrf(struct bgp *to_bgp, /* to */
if (!vpn_leak_from_vpn_active(to_bgp, afi, &debugmsg)) {
if (debug)
- zlog_debug("%s: skipping: %s", __func__, debugmsg);
+ zlog_debug(
+ "%s: from vpn (%s) to vrf (%s), skipping: %s",
+ __func__, from_bgp->name_pretty,
+ to_bgp->name_pretty, debugmsg);
return false;
}
@@ -2115,8 +2118,7 @@ bool vpn_leak_to_vrf_update(struct bgp *from_bgp,
return leak_success;
}
-void vpn_leak_to_vrf_withdraw(struct bgp *from_bgp, /* from */
- struct bgp_path_info *path_vpn) /* route */
+void vpn_leak_to_vrf_withdraw(struct bgp_path_info *path_vpn)
{
const struct prefix *p;
afi_t afi;
@@ -2159,7 +2161,8 @@ void vpn_leak_to_vrf_withdraw(struct bgp *from_bgp, /* from */
for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp)) {
if (!vpn_leak_from_vpn_active(bgp, afi, &debugmsg)) {
if (debug)
- zlog_debug("%s: skipping: %s", __func__,
+ zlog_debug("%s: from %s, skipping: %s",
+ __func__, bgp->name_pretty,
debugmsg);
continue;
}
diff --git a/bgpd/bgp_mplsvpn.h b/bgpd/bgp_mplsvpn.h
index 7b57e4c75d..b54476e5d3 100644
--- a/bgpd/bgp_mplsvpn.h
+++ b/bgpd/bgp_mplsvpn.h
@@ -75,8 +75,7 @@ extern bool vpn_leak_to_vrf_update(struct bgp *from_bgp,
struct bgp_path_info *path_vpn,
struct prefix_rd *prd);
-extern void vpn_leak_to_vrf_withdraw(struct bgp *from_bgp,
- struct bgp_path_info *path_vpn);
+extern void vpn_leak_to_vrf_withdraw(struct bgp_path_info *path_vpn);
extern void vpn_leak_zebra_vrf_label_update(struct bgp *bgp, afi_t afi);
extern void vpn_leak_zebra_vrf_label_withdraw(struct bgp *bgp, afi_t afi);
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index 9e7c75318e..080cf0ae40 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -2033,7 +2033,8 @@ static int bgp_update_receive(struct peer *peer, bgp_size_t size)
break;
case NLRI_WITHDRAW:
case NLRI_MP_WITHDRAW:
- nlri_ret = bgp_nlri_parse(peer, &attr, &nlris[i], 1);
+ nlri_ret = bgp_nlri_parse(peer, NLRI_ATTR_ARG,
+ &nlris[i], 1);
break;
default:
nlri_ret = BGP_NLRI_PARSE_ERROR;
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index c9cfc44da0..d7ff0e3c0a 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -4456,8 +4456,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
bgp_evpn_unimport_route(
bgp, afi, safi, p, pi);
else /* SAFI_MPLS_VPN */
- vpn_leak_to_vrf_withdraw(bgp,
- pi);
+ vpn_leak_to_vrf_withdraw(pi);
}
}
}
@@ -4877,7 +4876,7 @@ filtered:
if ((SAFI_MPLS_VPN == safi)
&& (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) {
- vpn_leak_to_vrf_withdraw(bgp, pi);
+ vpn_leak_to_vrf_withdraw(pi);
}
bgp_rib_remove(dest, pi, peer, afi, safi);
@@ -4979,7 +4978,7 @@ void bgp_withdraw(struct peer *peer, const struct prefix *p,
if ((SAFI_MPLS_VPN == safi)
&& (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) {
- vpn_leak_to_vrf_withdraw(bgp, pi);
+ vpn_leak_to_vrf_withdraw(pi);
}
} else if (bgp_debug_update(peer, p, NULL, 1)) {
bgp_debug_rdpfxpath2str(afi, safi, prd, p, label, num_labels,
@@ -5419,7 +5418,7 @@ static wq_item_status bgp_clear_route_node(struct work_queue *wq, void *data)
}
if (SAFI_MPLS_VPN == safi &&
bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
- vpn_leak_to_vrf_withdraw(bgp, pi);
+ vpn_leak_to_vrf_withdraw(pi);
}
bgp_rib_remove(dest, pi, peer, afi, safi);
@@ -5688,8 +5687,7 @@ void bgp_clear_stale_route(struct peer *peer, afi_t afi, safi_t safi)
BGP_ROUTE_IMPORTED &&
peer->bgp->inst_type ==
BGP_INSTANCE_TYPE_DEFAULT)
- vpn_leak_to_vrf_withdraw(
- peer->bgp, pi);
+ vpn_leak_to_vrf_withdraw(pi);
bgp_rib_remove(rm, pi, peer, afi, safi);
break;
@@ -6384,7 +6382,7 @@ static void bgp_static_withdraw_safi(struct bgp *bgp, const struct prefix *p,
#endif
if (SAFI_MPLS_VPN == safi
&& bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
- vpn_leak_to_vrf_withdraw(bgp, pi);
+ vpn_leak_to_vrf_withdraw(pi);
}
bgp_aggregate_decrement(bgp, p, pi, afi, safi);
bgp_path_info_delete(dest, pi);
@@ -9858,8 +9856,6 @@ void route_vty_out_overlay(struct vty *vty, const struct prefix *p,
if (!json_path) {
vty_out(vty, "?");
} else {
- json_object_string_add(json_nexthop, "Error",
- "Unsupported address-family");
json_object_string_add(json_nexthop, "error",
"Unsupported address-family");
}
@@ -10227,12 +10223,9 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct bgp_dest *bn,
if (tag_buf[0] != '\0')
vty_out(vty, " VNI %s", tag_buf);
} else {
- if (tag_buf[0]) {
- json_object_string_add(json_path, "VNI",
- tag_buf);
+ if (tag_buf[0])
json_object_string_add(json_path, "vni",
tag_buf);
- }
}
}
}
@@ -11593,7 +11586,16 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
else
vty_out(vty, ",\"%pFX\": ", dest_p);
}
- vty_json(vty, json_paths);
+ /*
+ * We are using no_pretty here because under
+ * extremely high settings( say lots and lots of
+ * routes with lots and lots of ways to reach
+ * that route via different paths ) this can
+ * save several minutes of output when FRR
+ * is run on older cpu's or more underperforming
+ * routers out there
+ */
+ vty_json_no_pretty(vty, json_paths);
json_paths = NULL;
first = 0;
} else
diff --git a/bgpd/rfapi/rfapi_vty.h b/bgpd/rfapi/rfapi_vty.h
index 09e1b3c4c4..c8b8613feb 100644
--- a/bgpd/rfapi/rfapi_vty.h
+++ b/bgpd/rfapi/rfapi_vty.h
@@ -62,7 +62,8 @@ extern int rfapiStr2EthAddr(const char *str, struct ethaddr *ea);
extern const char *rfapi_ntop(int af, const void *src, char *buf,
socklen_t size);
-extern int rfapiDebugPrintf(void *dummy, const char *format, ...);
+extern int rfapiDebugPrintf(void *dummy, const char *format, ...)
+ PRINTFRR(2, 3);
extern int rfapiStream2Vty(void *stream, /* input */
int (**fp)(void *, const char *, ...), /* output */
diff --git a/doc/developer/workflow.rst b/doc/developer/workflow.rst
index 06a2ccbc0a..f496906101 100644
--- a/doc/developer/workflow.rst
+++ b/doc/developer/workflow.rst
@@ -342,6 +342,46 @@ summary of the included patches. The description should provide
additional details that will help the reviewer to understand the context
of the included patches.
+Squash commits
+--------------
+
+Before merging make sure a PR has squashed the following kinds of commits:
+
+- Fixes/review feedback
+- Typos
+- Merges and rebases
+- Work in progress
+
+This helps to automatically generate human-readable changelog messages.
+
+Commit Guidelines
+-----------------
+
+There is a built-in commit linter. Basic rules:
+
+- Commit messages must be prefixed with the name of the changed subsystem, followed
+ by a colon and a space and start with an imperative verb.
+
+ `Check <https://github.com/FRRouting/frr/tree/master/.github/commitlint.config.js>`_ all
+ the supported subsystems.
+
+- Commit messages must start with a capital letter
+- Commit messages must not end with a period ``.``
+
+Why was my pull request closed?
+-------------------------------
+
+Pull requests older than 180 days will be closed. Exceptions can be made for
+pull requests that have active review comments, or that are awaiting other
+dependent pull requests. Closed pull requests are easy to recreate, and little
+work is lost by closing a pull request that subsequently needs to be reopened.
+
+We want to limit the total number of pull requests in flight to:
+
+- Maintain a clean project
+- Remove old pull requests that would be difficult to rebase as the underlying code has changed over time
+- Encourage code velocity
+
.. _license-for-contributions:
License for Contributions
diff --git a/doc/user/installation.rst b/doc/user/installation.rst
index 8f89c6c4f8..2310d397cd 100644
--- a/doc/user/installation.rst
+++ b/doc/user/installation.rst
@@ -314,7 +314,8 @@ options from the list below.
Turn on the ability of FRR to access some shell options( telnet/ssh/bash/etc. )
from vtysh itself. This option is considered extremely unsecure and should only
- be considered for usage if you really really know what you are doing.
+ be considered for usage if you really really know what you are doing. This
+ option is deprecated and will be removed on Feb 1, 2024.
.. option:: --enable-gcov
diff --git a/ldpd/ldp_vty_exec.c b/ldpd/ldp_vty_exec.c
index c4053f5374..a8cffd6d91 100644
--- a/ldpd/ldp_vty_exec.c
+++ b/ldpd/ldp_vty_exec.c
@@ -1472,10 +1472,6 @@ show_l2vpn_pw_msg_json(struct imsg *imsg, struct show_params *params,
json_pw = json_object_new_object();
json_object_string_addf(json_pw, "peerId", "%pI4", &pw->lsr_id);
json_object_int_add(json_pw, "vcId", pw->pwid);
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys starting with capital")
-#endif
- json_object_string_add(json_pw, "VpnName", pw->l2vpn_name);
json_object_string_add(json_pw, "vpnName", pw->l2vpn_name);
if (pw->status == PW_FORWARDING)
json_object_string_add(json_pw, "status", "up");
diff --git a/lib/db.h b/lib/db.h
index 884c7377f2..c8ce7fe57d 100644
--- a/lib/db.h
+++ b/lib/db.h
@@ -36,21 +36,24 @@
#define _FRR_DB_H_
#ifdef HAVE_SQLITE3
+#include "compiler.h"
#include <sqlite3.h>
#ifdef __cplusplus
extern "C" {
#endif
-extern int db_init(const char *path_fmt, ...);
+extern int db_init(const char *path_fmt, ...) PRINTFRR(1, 2);
extern int db_close(void);
+/* WARNING: sqlite format string! not printf compatible! */
extern int db_bindf(struct sqlite3_stmt *ss, const char *fmt, ...);
extern struct sqlite3_stmt *db_prepare_len(const char *stmt, int stmtlen);
extern struct sqlite3_stmt *db_prepare(const char *stmt);
extern int db_run(struct sqlite3_stmt *ss);
+/* WARNING: sqlite format string! not scanf compatible! */
extern int db_loadf(struct sqlite3_stmt *ss, const char *fmt, ...);
extern void db_finalize(struct sqlite3_stmt **ss);
-extern int db_execute(const char *stmt_fmt, ...);
+extern int db_execute(const char *stmt_fmt, ...) PRINTFRR(1, 2);
#ifdef __cplusplus
}
diff --git a/lib/libfrr.c b/lib/libfrr.c
index aee6981854..2cab6d9824 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -789,7 +789,7 @@ struct thread_master *frr_init(void)
#ifdef HAVE_SQLITE3
if (!di->db_file)
di->db_file = dbfile_default;
- db_init(di->db_file);
+ db_init("%s", di->db_file);
#endif
if (di->flags & FRR_LIMITED_CLI)
diff --git a/lib/vty.c b/lib/vty.c
index 76d907408c..2a0bb9446a 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -284,7 +284,8 @@ done:
return len;
}
-int vty_json(struct vty *vty, struct json_object *json)
+static int vty_json_helper(struct vty *vty, struct json_object *json,
+ uint32_t options)
{
const char *text;
@@ -299,6 +300,18 @@ int vty_json(struct vty *vty, struct json_object *json)
return CMD_SUCCESS;
}
+int vty_json(struct vty *vty, struct json_object *json)
+{
+ return vty_json_helper(vty, json,
+ JSON_C_TO_STRING_PRETTY |
+ JSON_C_TO_STRING_NOSLASHESCAPE);
+}
+
+int vty_json_no_pretty(struct vty *vty, struct json_object *json)
+{
+ return vty_json_helper(vty, json, JSON_C_TO_STRING_NOSLASHESCAPE);
+}
+
/* Output current time to the vty. */
void vty_time_print(struct vty *vty, int cr)
{
diff --git a/lib/vty.h b/lib/vty.h
index 0b3fd2443f..45349d91af 100644
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -353,8 +353,12 @@ extern void vty_endframe(struct vty *, const char *);
extern bool vty_set_include(struct vty *vty, const char *regexp);
/* returns CMD_SUCCESS so you can do a one-line "return vty_json(...)"
* NULL check and json_object_free() is included.
+ *
+ * _no_pretty means do not add a bunch of newlines and dump the output
+ * as densely as possible.
*/
extern int vty_json(struct vty *vty, struct json_object *json);
+extern int vty_json_no_pretty(struct vty *vty, struct json_object *json);
/* post fd to be passed to the vtysh client
* fd is owned by the VTY code after this and will be closed when done
diff --git a/lib/zlog.h b/lib/zlog.h
index dcc0bf14e9..6316a2ad40 100644
--- a/lib/zlog.h
+++ b/lib/zlog.h
@@ -71,8 +71,8 @@ struct xrefdata_logmsg {
* determine whether something is a log message or something else.
*/
-extern void vzlogx(const struct xref_logmsg *xref, int prio,
- const char *fmt, va_list ap);
+extern void vzlogx(const struct xref_logmsg *xref, int prio, const char *fmt,
+ va_list ap) PRINTFRR(3, 0);
#define vzlog(prio, ...) vzlogx(NULL, prio, __VA_ARGS__)
PRINTFRR(2, 3)
diff --git a/ospf6d/ospf6_gr_helper.c b/ospf6d/ospf6_gr_helper.c
index 771a710240..661d37e637 100644
--- a/ospf6d/ospf6_gr_helper.c
+++ b/ospf6d/ospf6_gr_helper.c
@@ -963,22 +963,13 @@ static void show_ospf6_gr_helper_details(struct vty *vty, struct ospf6 *ospf6,
json, "supportedGracePeriod",
ospf6->ospf6_helper_cfg.supported_grace_time);
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys starting with capital")
-#endif
if (ospf6->ospf6_helper_cfg.last_exit_reason !=
- OSPF6_GR_HELPER_EXIT_NONE) {
- json_object_string_add(
- json, "LastExitReason",
- ospf6_exit_reason_desc
- [ospf6->ospf6_helper_cfg
- .last_exit_reason]);
+ OSPF6_GR_HELPER_EXIT_NONE)
json_object_string_add(
json, "lastExitReason",
ospf6_exit_reason_desc
[ospf6->ospf6_helper_cfg
.last_exit_reason]);
- }
if (ospf6->ospf6_helper_cfg.active_restarter_cnt)
json_object_int_add(
@@ -1010,18 +1001,12 @@ CPP_NOTICE("Remove JSON object commands with keys starting with capital")
if (uj) {
json_object_object_get_ex(
- json, "Neighbors",
- &json_neighbors);
- json_object_object_get_ex(
json, "neighbors",
&json_neighbors);
if (!json_neighbors) {
json_neighbors =
json_object_new_object();
json_object_object_add(
- json, "Neighbors",
- json_neighbors);
- json_object_object_add(
json, "neighbors",
json_neighbors);
}
diff --git a/ospf6d/ospf6_lsa.c b/ospf6d/ospf6_lsa.c
index 55ac7c88a5..cd918d7475 100644
--- a/ospf6d/ospf6_lsa.c
+++ b/ospf6d/ospf6_lsa.c
@@ -83,11 +83,7 @@ static int ospf6_unknown_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
start = (uint8_t *)lsa->header + sizeof(struct ospf6_lsa_header);
end = (uint8_t *)lsa->header + ntohs(lsa->header->length);
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys starting with capital")
-#endif
if (use_json) {
- json_object_string_add(json_obj, "LsaType", "unknown");
json_object_string_add(json_obj, "lsaType", "unknown");
} else {
vty_out(vty, " Unknown contents:\n");
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index db45fa5f5c..785a48a0a1 100644
--- a/ospf6d/ospf6_top.c
+++ b/ospf6d/ospf6_top.c
@@ -2015,9 +2015,6 @@ ospf6_show_vrf_name(struct vty *vty, struct ospf6 *ospf6,
}
}
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys containing whitespaces")
-#endif
static int
ospf6_show_summary_address(struct vty *vty, struct ospf6 *ospf6,
json_object *json,
@@ -2037,8 +2034,6 @@ ospf6_show_summary_address(struct vty *vty, struct ospf6 *ospf6,
ospf6_show_vrf_name(vty, ospf6, json_vrf);
- json_object_int_add(json_vrf, "aggregation delay interval",
- ospf6->aggr_delay_interval);
json_object_int_add(json_vrf, "aggregationDelayInterval",
ospf6->aggr_delay_interval);
}
@@ -2062,18 +2057,10 @@ ospf6_show_summary_address(struct vty *vty, struct ospf6 *ospf6,
buf,
json_aggr);
- json_object_string_add(json_aggr,
- "Summary address",
- buf);
json_object_string_add(json_aggr, "summaryAddress",
buf);
json_object_string_add(
- json_aggr, "Metric-type",
- (aggr->mtype == DEFAULT_METRIC_TYPE)
- ? "E2"
- : "E1");
- json_object_string_add(
json_aggr, "metricType",
(aggr->mtype == DEFAULT_METRIC_TYPE) ? "E2"
: "E1");
@@ -2086,9 +2073,6 @@ ospf6_show_summary_address(struct vty *vty, struct ospf6 *ospf6,
json_object_int_add(json_aggr, "Tag",
aggr->tag);
- json_object_int_add(json_aggr,
- "External route count",
- OSPF6_EXTERNAL_RT_COUNT(aggr));
json_object_int_add(json_aggr, "externalRouteCount",
OSPF6_EXTERNAL_RT_COUNT(aggr));
diff --git a/ospfd/ospf_ldp_sync.c b/ospfd/ospf_ldp_sync.c
index 7b1fa6626f..51cd2a127b 100644
--- a/ospfd/ospf_ldp_sync.c
+++ b/ospfd/ospf_ldp_sync.c
@@ -507,15 +507,8 @@ void ospf_ldp_sync_show_info(struct vty *vty, struct ospf *ospf,
if (CHECK_FLAG(ospf->ldp_sync_cmd.flags, LDP_SYNC_FLAG_ENABLE)) {
if (use_json) {
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys starting with capital")
-#endif
- json_object_boolean_true_add(json_vrf,
- "MplsLdpIgpSyncEnabled");
json_object_boolean_true_add(json_vrf,
"mplsLdpIgpSyncEnabled");
- json_object_int_add(json_vrf, "MplsLdpIgpSyncHolddown",
- ospf->ldp_sync_cmd.holddown);
json_object_int_add(json_vrf, "mplsLdpIgpSyncHolddown",
ospf->ldp_sync_cmd.holddown);
} else {
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index 0b0b9d81ee..469e9955e9 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -10214,17 +10214,10 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
json_object_int_add(json_vrf, "supportedGracePeriod",
ospf->supported_grace_time);
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys starting with capital")
-#endif
- if (ospf->last_exit_reason != OSPF_GR_HELPER_EXIT_NONE) {
- json_object_string_add(
- json_vrf, "LastExitReason",
- ospf_exit_reason2str(ospf->last_exit_reason));
+ if (ospf->last_exit_reason != OSPF_GR_HELPER_EXIT_NONE)
json_object_string_add(
json_vrf, "lastExitReason",
ospf_exit_reason2str(ospf->last_exit_reason));
- }
if (ospf->active_restarter_cnt)
json_object_int_add(json_vrf, "activeRestarterCnt",
@@ -10257,17 +10250,12 @@ CPP_NOTICE("Remove JSON object commands with keys starting with capital")
continue;
if (uj) {
- json_object_object_get_ex(json_vrf, "Neighbors",
- &json_neighbors);
json_object_object_get_ex(json_vrf, "neighbors",
&json_neighbors);
if (!json_neighbors) {
json_neighbors =
json_object_new_object();
json_object_object_add(json_vrf,
- "Neighbors",
- json_neighbors);
- json_object_object_add(json_vrf,
"neighbors",
json_neighbors);
}
@@ -10563,9 +10551,6 @@ static void config_write_stub_router(struct vty *vty, struct ospf *ospf)
return;
}
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys containing whitespaces")
-#endif
static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf,
struct route_table *rt,
json_object *json)
@@ -10669,12 +10654,6 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf,
"ip", " ");
json_object_string_add(
json_nexthop,
- "directly attached to",
- ifindex2ifname(
- path->ifindex,
- ospf->vrf_id));
- json_object_string_add(
- json_nexthop,
"directlyAttachedTo",
ifindex2ifname(
path->ifindex,
@@ -10818,12 +10797,6 @@ static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf,
"ip", " ");
json_object_string_add(
json_nexthop,
- "directly attached to",
- ifindex2ifname(
- path->ifindex,
- ospf->vrf_id));
- json_object_string_add(
- json_nexthop,
"directlyAttachedTo",
ifindex2ifname(
path->ifindex,
@@ -10950,12 +10923,6 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf,
" ");
json_object_string_add(
json_nexthop,
- "directly attached to",
- ifindex2ifname(
- path->ifindex,
- ospf->vrf_id));
- json_object_string_add(
- json_nexthop,
"directlyAttachedTo",
ifindex2ifname(
path->ifindex,
@@ -11664,8 +11631,6 @@ static int ospf_show_summary_address(struct vty *vty, struct ospf *ospf,
vty_out(vty, "aggregation delay interval :%u(in seconds)\n\n",
ospf->aggr_delay_interval);
} else {
- json_object_int_add(json_vrf, "aggregation delay interval",
- ospf->aggr_delay_interval);
json_object_int_add(json_vrf, "aggregationDelayInterval",
ospf->aggr_delay_interval);
}
@@ -11684,37 +11649,17 @@ static int ospf_show_summary_address(struct vty *vty, struct ospf *ospf,
json_object_object_add(json_vrf, buf,
json_aggr);
-
- json_object_string_add(json_aggr,
- "Summary address", buf);
json_object_string_add(json_aggr,
"summaryAddress", buf);
-
- json_object_string_add(
- json_aggr, "Metric-type",
- (mtype == EXTERNAL_METRIC_TYPE_1)
- ? "E1"
- : "E2");
json_object_string_add(
json_aggr, "metricType",
(mtype == EXTERNAL_METRIC_TYPE_1)
? "E1"
: "E2");
-#if CONFDATE > 20230131
-CPP_NOTICE("Remove JSON object commands with keys starting with capital")
-#endif
- json_object_int_add(json_aggr, "Metric", mval);
json_object_int_add(json_aggr, "metric", mval);
-
- json_object_int_add(json_aggr, "Tag",
- aggr->tag);
json_object_int_add(json_aggr, "tag",
aggr->tag);
-
- json_object_int_add(
- json_aggr, "External route count",
- OSPF_EXTERNAL_RT_COUNT(aggr));
json_object_int_add(
json_aggr, "externalRouteCount",
OSPF_EXTERNAL_RT_COUNT(aggr));
diff --git a/pceplib/pcep_utils_counters.h b/pceplib/pcep_utils_counters.h
index 240e9758b7..b10ced7d65 100644
--- a/pceplib/pcep_utils_counters.h
+++ b/pceplib/pcep_utils_counters.h
@@ -30,6 +30,7 @@
#include <stdbool.h>
#include <stdint.h>
+#include <time.h>
#ifdef __cplusplus
extern "C" {
diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c
index d220ae082f..9b571415fd 100644
--- a/pimd/pim_cmd_common.c
+++ b/pimd/pim_cmd_common.c
@@ -1140,42 +1140,24 @@ void pim_show_state(struct pim_instance *pim, struct vty *vty,
json_ifp_in = json_object_new_object();
json_object_object_add(json_source, in_ifname,
json_ifp_in);
- json_object_int_add(json_source, "Installed",
- c_oil->installed);
json_object_int_add(json_source, "installed",
c_oil->installed);
json_object_boolean_add(json_source, "isRpt",
isRpt);
- json_object_int_add(json_source, "RefCount",
- c_oil->oil_ref_count);
json_object_int_add(json_source, "refCount",
c_oil->oil_ref_count);
- json_object_int_add(json_source, "OilListSize",
- c_oil->oil_size);
json_object_int_add(json_source, "oilListSize",
c_oil->oil_size);
json_object_int_add(
- json_source, "OilRescan",
- c_oil->oil_inherited_rescan);
- json_object_int_add(
json_source, "oilRescan",
c_oil->oil_inherited_rescan);
- json_object_int_add(json_source, "LastUsed",
- c_oil->cc.lastused);
json_object_int_add(json_source, "lastUsed",
c_oil->cc.lastused);
- json_object_int_add(json_source, "PacketCount",
- c_oil->cc.pktcnt);
json_object_int_add(json_source, "packetCount",
c_oil->cc.pktcnt);
- json_object_int_add(json_source, "ByteCount",
- c_oil->cc.bytecnt);
json_object_int_add(json_source, "byteCount",
c_oil->cc.bytecnt);
json_object_int_add(json_source,
- "WrongInterface",
- c_oil->cc.wrong_if);
- json_object_int_add(json_source,
"wrongInterface",
c_oil->cc.wrong_if);
}
@@ -1728,14 +1710,8 @@ static void pim_show_join_helper(struct pim_interface *pim_ifp,
json_object_string_add(
json_row, "channelJoinName",
pim_ifchannel_ifjoin_name(ch->ifjoin_state, ch->flags));
- if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags)) {
-#if CONFDATE > 20230131
- CPP_NOTICE(
- "Remove JSON object commands with keys starting with capital")
-#endif
- json_object_int_add(json_row, "SGRpt", 1);
+ if (PIM_IF_FLAG_TEST_S_G_RPT(ch->flags))
json_object_int_add(json_row, "sgRpt", 1);
- }
if (PIM_IF_FLAG_TEST_PROTO_PIM(ch->flags))
json_object_int_add(json_row, "protocolPim", 1);
if (PIM_IF_FLAG_TEST_PROTO_IGMP(ch->flags))
@@ -3786,8 +3762,6 @@ void show_mroute(struct pim_instance *pim, struct vty *vty, pim_sgaddr *sg,
c_oil->oil_ref_count);
json_object_int_add(json_source, "oilSize",
c_oil->oil_size);
- json_object_int_add(json_source, "OilInheritedRescan",
- c_oil->oil_inherited_rescan);
json_object_int_add(json_source, "oilInheritedRescan",
c_oil->oil_inherited_rescan);
json_object_string_add(json_source, "iif", in_ifname);
diff --git a/tests/bgpd/test_peer_attr.c b/tests/bgpd/test_peer_attr.c
index c2e86f2339..cc4f71e688 100644
--- a/tests/bgpd/test_peer_attr.c
+++ b/tests/bgpd/test_peer_attr.c
@@ -20,6 +20,7 @@
#include "memory.h"
#include "plist.h"
+#include "printfrr.h"
#include "bgpd/bgpd.h"
#include "bgpd/bgp_attr.h"
#include "bgpd/bgp_regex.h"
@@ -44,8 +45,9 @@
if ((T)->state != TEST_SUCCESS || (C)) \
break; \
(T)->state = TEST_ASSERT_ERROR; \
- (T)->error = str_printf("assertion failed: %s (%s:%d)", (#C), \
- __FILE__, __LINE__); \
+ (T)->error = \
+ asprintfrr(MTYPE_TMP, "assertion failed: %s (%s:%d)", \
+ (#C), __FILE__, __LINE__); \
} while (0)
#define TEST_ASSERT_EQ(T, A, B) \
@@ -53,9 +55,11 @@
if ((T)->state != TEST_SUCCESS || ((A) == (B))) \
break; \
(T)->state = TEST_ASSERT_ERROR; \
- (T)->error = str_printf( \
- "assertion failed: %s[%d] == [%d]%s (%s:%d)", (#A), \
- (A), (B), (#B), __FILE__, __LINE__); \
+ (T)->error = asprintfrr( \
+ MTYPE_TMP, \
+ "assertion failed: %s[%lld] == [%lld]%s (%s:%d)", \
+ (#A), (long long)(A), (long long)(B), (#B), __FILE__, \
+ __LINE__); \
} while (0)
#define TEST_HANDLER_MAX 5
@@ -212,44 +216,6 @@ static struct test_peer_family test_default_families[] = {
{.afi = AFI_IP6, .safi = SAFI_MULTICAST},
};
-static char *str_vprintf(const char *fmt, va_list ap)
-{
- int ret;
- int buf_size = 0;
- char *buf = NULL;
- va_list apc;
-
- while (1) {
- va_copy(apc, ap);
- ret = vsnprintf(buf, buf_size, fmt, apc);
- va_end(apc);
-
- if (ret >= 0 && ret < buf_size)
- break;
-
- if (ret >= 0)
- buf_size = ret + 1;
- else
- buf_size *= 2;
-
- buf = XREALLOC(MTYPE_TMP, buf, buf_size);
- }
-
- return buf;
-}
-
-static char *str_printf(const char *fmt, ...)
-{
- char *buf;
- va_list ap;
-
- va_start(ap, fmt);
- buf = str_vprintf(fmt, ap);
- va_end(ap);
-
- return buf;
-}
-
TEST_ATTR_HANDLER_DECL(advertisement_interval, v_routeadv, 10, 20);
TEST_STR_ATTR_HANDLER_DECL(password, password, "FRR-Peer", "FRR-Group");
TEST_ATTR_HANDLER_DECL(local_as, change_local_as, 1, 2);
@@ -724,6 +690,7 @@ static bool is_attr_type_global(enum test_peer_attr_type at)
return at == PEER_AT_GLOBAL_FLAG || at == PEER_AT_GLOBAL_CUSTOM;
}
+PRINTFRR(2, 3)
static void test_log(struct test *test, const char *fmt, ...)
{
va_list ap;
@@ -734,10 +701,11 @@ static void test_log(struct test *test, const char *fmt, ...)
/* Store formatted log message. */
va_start(ap, fmt);
- listnode_add(test->log, str_vprintf(fmt, ap));
+ listnode_add(test->log, vasprintfrr(MTYPE_TMP, fmt, ap));
va_end(ap);
}
+PRINTFRR(2, 3)
static void test_execute(struct test *test, const char *fmt, ...)
{
int ret;
@@ -751,12 +719,12 @@ static void test_execute(struct test *test, const char *fmt, ...)
/* Format command string with variadic arguments. */
va_start(ap, fmt);
- cmd = str_vprintf(fmt, ap);
+ cmd = vasprintfrr(MTYPE_TMP, fmt, ap);
va_end(ap);
if (!cmd) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not format command string [%s]", fmt);
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not format command string [%s]", fmt);
return;
}
@@ -764,7 +732,8 @@ static void test_execute(struct test *test, const char *fmt, ...)
vline = cmd_make_strvec(cmd);
if (vline == NULL) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"tokenizing command string [%s] returned empty result",
cmd);
XFREE(MTYPE_TMP, cmd);
@@ -776,7 +745,8 @@ static void test_execute(struct test *test, const char *fmt, ...)
ret = cmd_execute_command(vline, test->vty, NULL, 0);
if (ret != CMD_SUCCESS) {
test->state = TEST_COMMAND_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"execution of command [%s] has failed with code [%d]",
cmd, ret);
}
@@ -786,6 +756,7 @@ static void test_execute(struct test *test, const char *fmt, ...)
XFREE(MTYPE_TMP, cmd);
}
+PRINTFRR(2, 0)
static void test_config(struct test *test, const char *fmt, bool invert,
va_list ap)
{
@@ -800,12 +771,12 @@ static void test_config(struct test *test, const char *fmt, bool invert,
/* Format matcher string with variadic arguments. */
va_copy(apc, ap);
- matcher = str_vprintf(fmt, apc);
+ matcher = vasprintfrr(MTYPE_TMP, fmt, apc);
va_end(apc);
if (!matcher) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not format matcher string [%s]", fmt);
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not format matcher string [%s]", fmt);
return;
}
@@ -818,11 +789,13 @@ static void test_config(struct test *test, const char *fmt, bool invert,
matched = !!strstr(config, matcher);
if (!matched && !invert) {
test->state = TEST_CONFIG_ERROR;
- test->error = str_printf("expected config [%s] to be present",
+ test->error = asprintfrr(MTYPE_TMP,
+ "expected config [%s] to be present",
matcher);
} else if (matched && invert) {
test->state = TEST_CONFIG_ERROR;
- test->error = str_printf("expected config [%s] to be absent",
+ test->error = asprintfrr(MTYPE_TMP,
+ "expected config [%s] to be absent",
matcher);
}
@@ -831,6 +804,7 @@ static void test_config(struct test *test, const char *fmt, bool invert,
XFREE(MTYPE_TMP, config);
}
+PRINTFRR(2, 3)
static void test_config_present(struct test *test, const char *fmt, ...)
{
va_list ap;
@@ -840,6 +814,7 @@ static void test_config_present(struct test *test, const char *fmt, ...)
va_end(ap);
}
+PRINTFRR(2, 3)
static void test_config_absent(struct test *test, const char *fmt, ...)
{
va_list ap;
@@ -886,8 +861,8 @@ static void test_initialize(struct test *test)
test->bgp = bgp_get_default();
if (!test->bgp) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("could not retrieve default bgp instance");
+ test->error = asprintfrr(
+ MTYPE_TMP, "could not retrieve default bgp instance");
return;
}
@@ -901,7 +876,8 @@ static void test_initialize(struct test *test)
}
if (!test->peer) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"could not retrieve instance of bgp peer [%s]",
cfg.peer_address);
return;
@@ -911,7 +887,8 @@ static void test_initialize(struct test *test)
test->group = peer_group_lookup(test->bgp, cfg.peer_group);
if (!test->group) {
test->state = TEST_INTERNAL_ERROR;
- test->error = str_printf(
+ test->error = asprintfrr(
+ MTYPE_TMP,
"could not retrieve instance of bgp peer-group [%s]",
cfg.peer_group);
return;
@@ -1081,7 +1058,8 @@ static void test_custom(struct test *test, struct test_peer_attr *pa,
if (test->state != TEST_SUCCESS) {
test->state = TEST_CUSTOM_ERROR;
handler_error = test->error;
- test->error = str_printf("custom handler failed: %s",
+ test->error = asprintfrr(MTYPE_TMP,
+ "custom handler failed: %s",
handler_error);
XFREE(MTYPE_TMP, handler_error);
}
@@ -1123,8 +1101,8 @@ static void test_process(struct test *test, struct test_peer_attr *pa,
default:
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("invalid attribute type: %d", pa->type);
+ test->error = asprintfrr(
+ MTYPE_TMP, "invalid attribute type: %d", pa->type);
break;
}
@@ -1149,8 +1127,8 @@ static void test_peer_attr(struct test *test, struct test_peer_attr *pa)
type = str_from_attr_type(pa->type);
if (!type) {
test->state = TEST_INTERNAL_ERROR;
- test->error =
- str_printf("invalid attribute type: %d", pa->type);
+ test->error = asprintfrr(
+ MTYPE_TMP, "invalid attribute type: %d", pa->type);
return;
}
@@ -1485,11 +1463,11 @@ int main(void)
/* Build test description string. */
if (pa->afi && pa->safi)
- desc = str_printf("peer\\%s-%s\\%s",
+ desc = asprintfrr(MTYPE_TMP, "peer\\%s-%s\\%s",
str_from_afi(pa->afi),
str_from_safi(pa->safi), pa->cmd);
else
- desc = str_printf("peer\\%s", pa->cmd);
+ desc = asprintfrr(MTYPE_TMP, "peer\\%s", pa->cmd);
/* Initialize new test instance. */
test = test_new(desc, pa->o.use_ibgp, pa->o.use_iface_peer);
diff --git a/tests/lib/test_nexthop_iter.c b/tests/lib/test_nexthop_iter.c
index f21f3bbb33..a6995d13e8 100644
--- a/tests/lib/test_nexthop_iter.c
+++ b/tests/lib/test_nexthop_iter.c
@@ -41,6 +41,7 @@ static void str_append(char **buf, const char *repr)
}
}
+PRINTFRR(2, 3)
static void str_appendf(char **buf, const char *format, ...)
{
va_list ap;
diff --git a/tests/topotests/bgp_lu_topo1/R1/labelpool.summ.json b/tests/topotests/bgp_lu_topo1/R1/labelpool.summ.json
index e2eee513e6..6db8e002f4 100644
--- a/tests/topotests/bgp_lu_topo1/R1/labelpool.summ.json
+++ b/tests/topotests/bgp_lu_topo1/R1/labelpool.summ.json
@@ -1,8 +1,8 @@
{
- "Ledger":506,
- "InUse":506,
- "Requests":0,
- "LabelChunks":3,
- "Pending":0,
- "Reconnects":0
+ "ledger":506,
+ "inUse":506,
+ "requests":0,
+ "labelChunks":3,
+ "pending":0,
+ "reconnects":0
}
diff --git a/tests/topotests/bgp_lu_topo1/R2/labelpool.summ.json b/tests/topotests/bgp_lu_topo1/R2/labelpool.summ.json
index 9c817e8075..9f9e57511c 100644
--- a/tests/topotests/bgp_lu_topo1/R2/labelpool.summ.json
+++ b/tests/topotests/bgp_lu_topo1/R2/labelpool.summ.json
@@ -1,8 +1,8 @@
{
- "Ledger":0,
- "InUse":0,
- "Requests":0,
- "LabelChunks":0,
- "Pending":0,
- "Reconnects":0
+ "ledger":0,
+ "inUse":0,
+ "requests":0,
+ "labelChunks":0,
+ "pending":0,
+ "reconnects":0
}
diff --git a/tests/topotests/bgp_lu_topo2/R1/labelpool.summ.json b/tests/topotests/bgp_lu_topo2/R1/labelpool.summ.json
index 0dc59b58cf..59ecd27f7f 100644
--- a/tests/topotests/bgp_lu_topo2/R1/labelpool.summ.json
+++ b/tests/topotests/bgp_lu_topo2/R1/labelpool.summ.json
@@ -1,8 +1,8 @@
{
- "Ledger":51,
- "InUse":51,
- "Requests":0,
- "LabelChunks":1,
- "Pending":0,
- "Reconnects":0
+ "ledger":51,
+ "inUse":51,
+ "requests":0,
+ "labelChunks":1,
+ "pending":0,
+ "reconnects":0
}
diff --git a/tests/topotests/bgp_lu_topo2/R2/labelpool.summ.json b/tests/topotests/bgp_lu_topo2/R2/labelpool.summ.json
index eb1ae93b6c..2c52192cd6 100644
--- a/tests/topotests/bgp_lu_topo2/R2/labelpool.summ.json
+++ b/tests/topotests/bgp_lu_topo2/R2/labelpool.summ.json
@@ -1,8 +1,8 @@
{
- "Ledger":1,
- "InUse":1,
- "Requests":0,
- "LabelChunks":1,
- "Pending":0,
- "Reconnects":0
+ "ledger":1,
+ "inUse":1,
+ "requests":0,
+ "labelChunks":1,
+ "pending":0,
+ "reconnects":0
}
diff --git a/tests/topotests/bgp_route_map_vpn_import/__init__.py b/tests/topotests/bgp_route_map_vpn_import/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/topotests/bgp_route_map_vpn_import/__init__.py
diff --git a/tests/topotests/bgp_route_map_vpn_import/r1/bgpd.conf b/tests/topotests/bgp_route_map_vpn_import/r1/bgpd.conf
new file mode 100644
index 0000000000..c9ad0b1a5b
--- /dev/null
+++ b/tests/topotests/bgp_route_map_vpn_import/r1/bgpd.conf
@@ -0,0 +1,46 @@
+!
+debug bgp updates
+debug bgp vpn leak-from-vrf
+debug bgp vpn leak-to-vrf
+debug bgp nht
+debug route-map
+!
+router bgp 65001
+ bgp router-id 10.10.10.10
+ no bgp ebgp-requires-policy
+!
+router bgp 65001 vrf Customer
+ bgp router-id 192.168.1.2
+ no bgp ebgp-requires-policy
+ address-family ipv4 unicast
+ redistribute connected
+ rd vpn export 192.168.1.2:2
+ rt vpn import 192.168.1.2:2
+ rt vpn export 192.168.1.2:2
+ export vpn
+ import vpn
+ exit-address-family
+!
+router bgp 65001 vrf Service
+ bgp router-id 192.168.2.2
+ no bgp ebgp-requires-policy
+ address-family ipv4 unicast
+ redistribute connected
+ rd vpn export 192.168.2.2:2
+ rt vpn import 192.168.2.2:2 192.168.1.2:2
+ rt vpn export 192.168.2.2:2
+ route-map vpn import from-customer
+ export vpn
+ import vpn
+ exit-address-family
+!
+bgp extcommunity-list standard from-customer seq 5 permit rt 192.168.1.2:2
+!
+ip prefix-list p1 seq 5 permit 192.0.2.0/24
+!
+route-map from-customer permit 10
+ match extcommunity from-customer
+ match ip address prefix-list p1
+ set local-preference 123
+route-map from-customer permit 20
+!
diff --git a/tests/topotests/bgp_route_map_vpn_import/r1/zebra.conf b/tests/topotests/bgp_route_map_vpn_import/r1/zebra.conf
new file mode 100644
index 0000000000..51966b2636
--- /dev/null
+++ b/tests/topotests/bgp_route_map_vpn_import/r1/zebra.conf
@@ -0,0 +1,16 @@
+!
+interface lo
+ ip address 10.10.10.10/32
+!
+interface r1-eth0 vrf Customer
+ ip address 192.168.1.2/24
+!
+interface r1-eth1 vrf Service
+ ip address 192.168.2.2/24
+!
+interface r1-eth2
+ ip address 10.0.1.1/24
+!
+interface r1-eth3 vrf Customer
+ ip address 192.0.2.1/24
+!
diff --git a/tests/topotests/bgp_route_map_vpn_import/test_bgp_route_map_vpn_import.py b/tests/topotests/bgp_route_map_vpn_import/test_bgp_route_map_vpn_import.py
new file mode 100644
index 0000000000..9de1b1a0e3
--- /dev/null
+++ b/tests/topotests/bgp_route_map_vpn_import/test_bgp_route_map_vpn_import.py
@@ -0,0 +1,126 @@
+#!/usr/bin/env python
+
+#
+# Copyright (c) 2022 by
+# Donatas Abraitis <donatas@opensourcerouting.org>
+#
+# Permission to use, copy, modify, and/or distribute this software
+# for any purpose with or without fee is hereby granted, provided
+# that the above copyright notice and this permission notice appear
+# in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
+# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+# OF THIS SOFTWARE.
+#
+
+"""
+Test if `route-map vpn import NAME` works by setting/matching via route-maps.
+Routes from VRF Customer to VRF Service MUST be leaked and modified later
+with `route-map vpn import`.
+"""
+
+import os
+import sys
+import json
+import pytest
+import functools
+
+CWD = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(os.path.join(CWD, "../"))
+
+# pylint: disable=C0413
+from lib import topotest
+from lib.topogen import Topogen, TopoRouter, get_topogen
+from lib.common_config import step
+
+pytestmark = [pytest.mark.bgpd]
+
+
+def build_topo(tgen):
+ tgen.add_router("r1")
+
+ switch = tgen.add_switch("s1")
+ switch.add_link(tgen.gears["r1"])
+
+ switch = tgen.add_switch("s2")
+ switch.add_link(tgen.gears["r1"])
+
+ switch = tgen.add_switch("s3")
+ switch.add_link(tgen.gears["r1"])
+
+ switch = tgen.add_switch("s4")
+ switch.add_link(tgen.gears["r1"])
+
+
+def setup_module(mod):
+ tgen = Topogen(build_topo, mod.__name__)
+ tgen.start_topology()
+
+ r1 = tgen.gears["r1"]
+
+ r1.run("ip link add Customer type vrf table 1001")
+ r1.run("ip link set up dev Customer")
+ r1.run("ip link set r1-eth0 master Customer")
+ r1.run("ip link add Service type vrf table 1002")
+ r1.run("ip link set up dev Service")
+ r1.run("ip link set r1-eth1 master Service")
+ r1.run("ip link set r1-eth3 master Customer")
+
+ router_list = tgen.routers()
+
+ for i, (rname, router) in enumerate(router_list.items(), 1):
+ router.load_config(
+ TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
+ )
+ router.load_config(
+ TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
+ )
+
+ tgen.start_router()
+
+
+def teardown_module(mod):
+ tgen = get_topogen()
+ tgen.stop_topology()
+
+
+def test_bgp_route_map_vpn_import():
+ tgen = get_topogen()
+
+ if tgen.routers_have_failure():
+ pytest.skip(tgen.errors)
+
+ r1 = tgen.gears["r1"]
+
+ def _bgp_check_received_leaked_with_vpn_import():
+ output = json.loads(r1.vtysh_cmd("show bgp vrf Service ipv4 unicast json"))
+ expected = {
+ "routes": {
+ "192.0.2.0/24": [
+ {
+ "locPrf": 123,
+ },
+ ],
+ "192.168.1.0/24": [
+ {
+ "locPrf": None,
+ }
+ ],
+ }
+ }
+ return topotest.json_cmp(output, expected)
+
+ test_func = functools.partial(_bgp_check_received_leaked_with_vpn_import)
+ _, result = topotest.run_and_expect(test_func, None, count=60, wait=1)
+ assert result is None, "Failed, imported routes are not modified"
+
+
+if __name__ == "__main__":
+ args = ["-s"] + sys.argv[1:]
+ sys.exit(pytest.main(args))
diff --git a/tests/topotests/ldp_snmp/r1/show_l2vpn_vc.ref b/tests/topotests/ldp_snmp/r1/show_l2vpn_vc.ref
index 29e9df1089..675af4d788 100644
--- a/tests/topotests/ldp_snmp/r1/show_l2vpn_vc.ref
+++ b/tests/topotests/ldp_snmp/r1/show_l2vpn_vc.ref
@@ -2,7 +2,7 @@
"r1-mpw0":{
"peerId":"2.2.2.2",
"vcId":100,
- "VpnName":"CUST_A",
+ "vpnName":"CUST_A",
"status":"up"
}
}
diff --git a/tests/topotests/ldp_snmp/r2/show_l2vpn_vc.ref b/tests/topotests/ldp_snmp/r2/show_l2vpn_vc.ref
index 942ed23a1e..045a8cfb9c 100644
--- a/tests/topotests/ldp_snmp/r2/show_l2vpn_vc.ref
+++ b/tests/topotests/ldp_snmp/r2/show_l2vpn_vc.ref
@@ -2,7 +2,7 @@
"r2-mpw0":{
"peerId":"1.1.1.1",
"vcId":100,
- "VpnName":"CUST_A",
+ "vpnName":"CUST_A",
"status":"up"
}
}
diff --git a/tests/topotests/ldp_sync_isis_topo1/r1/show_l2vpn_vc.ref b/tests/topotests/ldp_sync_isis_topo1/r1/show_l2vpn_vc.ref
index 29e9df1089..675af4d788 100644
--- a/tests/topotests/ldp_sync_isis_topo1/r1/show_l2vpn_vc.ref
+++ b/tests/topotests/ldp_sync_isis_topo1/r1/show_l2vpn_vc.ref
@@ -2,7 +2,7 @@
"r1-mpw0":{
"peerId":"2.2.2.2",
"vcId":100,
- "VpnName":"CUST_A",
+ "vpnName":"CUST_A",
"status":"up"
}
}
diff --git a/tests/topotests/ldp_sync_isis_topo1/r2/show_l2vpn_vc.ref b/tests/topotests/ldp_sync_isis_topo1/r2/show_l2vpn_vc.ref
index 942ed23a1e..045a8cfb9c 100644
--- a/tests/topotests/ldp_sync_isis_topo1/r2/show_l2vpn_vc.ref
+++ b/tests/topotests/ldp_sync_isis_topo1/r2/show_l2vpn_vc.ref
@@ -2,7 +2,7 @@
"r2-mpw0":{
"peerId":"1.1.1.1",
"vcId":100,
- "VpnName":"CUST_A",
+ "vpnName":"CUST_A",
"status":"up"
}
}
diff --git a/tests/topotests/ldp_sync_ospf_topo1/r1/show_l2vpn_vc.ref b/tests/topotests/ldp_sync_ospf_topo1/r1/show_l2vpn_vc.ref
index 29e9df1089..675af4d788 100644
--- a/tests/topotests/ldp_sync_ospf_topo1/r1/show_l2vpn_vc.ref
+++ b/tests/topotests/ldp_sync_ospf_topo1/r1/show_l2vpn_vc.ref
@@ -2,7 +2,7 @@
"r1-mpw0":{
"peerId":"2.2.2.2",
"vcId":100,
- "VpnName":"CUST_A",
+ "vpnName":"CUST_A",
"status":"up"
}
}
diff --git a/tests/topotests/ldp_sync_ospf_topo1/r2/show_l2vpn_vc.ref b/tests/topotests/ldp_sync_ospf_topo1/r2/show_l2vpn_vc.ref
index 942ed23a1e..045a8cfb9c 100644
--- a/tests/topotests/ldp_sync_ospf_topo1/r2/show_l2vpn_vc.ref
+++ b/tests/topotests/ldp_sync_ospf_topo1/r2/show_l2vpn_vc.ref
@@ -2,7 +2,7 @@
"r2-mpw0":{
"peerId":"1.1.1.1",
"vcId":100,
- "VpnName":"CUST_A",
+ "vpnName":"CUST_A",
"status":"up"
}
}
diff --git a/tests/topotests/ldp_vpls_topo1/r1/show_l2vpn_vc.ref b/tests/topotests/ldp_vpls_topo1/r1/show_l2vpn_vc.ref
index 29e9df1089..675af4d788 100644
--- a/tests/topotests/ldp_vpls_topo1/r1/show_l2vpn_vc.ref
+++ b/tests/topotests/ldp_vpls_topo1/r1/show_l2vpn_vc.ref
@@ -2,7 +2,7 @@
"r1-mpw0":{
"peerId":"2.2.2.2",
"vcId":100,
- "VpnName":"CUST_A",
+ "vpnName":"CUST_A",
"status":"up"
}
}
diff --git a/tests/topotests/ldp_vpls_topo1/r2/show_l2vpn_vc.ref b/tests/topotests/ldp_vpls_topo1/r2/show_l2vpn_vc.ref
index 942ed23a1e..045a8cfb9c 100644
--- a/tests/topotests/ldp_vpls_topo1/r2/show_l2vpn_vc.ref
+++ b/tests/topotests/ldp_vpls_topo1/r2/show_l2vpn_vc.ref
@@ -2,7 +2,7 @@
"r2-mpw0":{
"peerId":"1.1.1.1",
"vcId":100,
- "VpnName":"CUST_A",
+ "vpnName":"CUST_A",
"status":"up"
}
}
diff --git a/tests/topotests/lib/bgp.py b/tests/topotests/lib/bgp.py
index 2be0f5773b..aa7b4a2174 100644
--- a/tests/topotests/lib/bgp.py
+++ b/tests/topotests/lib/bgp.py
@@ -4277,7 +4277,7 @@ def verify_attributes_for_evpn_routes(
for _rd, route_data in evpn_rd_value_json.items():
if route_data["ip"] == route:
for rt_data in route_data["paths"]:
- if vni_dict[vrf] == rt_data["VNI"]:
+ if vni_dict[vrf] == rt_data["vni"]:
rt_string = rt_data["extendedCommunity"][
"string"
]
diff --git a/tests/topotests/lib/ospf.py b/tests/topotests/lib/ospf.py
index e7ea7d32ba..59ae1a2559 100644
--- a/tests/topotests/lib/ospf.py
+++ b/tests/topotests/lib/ospf.py
@@ -1533,11 +1533,11 @@ def verify_ospf_summary(tgen, topo, dut, input_dict, ospf=None, expected=True):
-----
input_dict = {
"11.0.0.0/8": {
- "Summary address": "11.0.0.0/8",
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5
+ "summaryAddress": "11.0.0.0/8",
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5
}
}
result = verify_ospf_summary(tgen, topo, dut, input_dict)
@@ -1586,7 +1586,7 @@ def verify_ospf_summary(tgen, topo, dut, input_dict, ospf=None, expected=True):
for ospf_summ, summ_data in ospf_summary_data.items():
if ospf_summ not in show_ospf_json:
continue
- summary = ospf_summary_data[ospf_summ]["Summary address"]
+ summary = ospf_summary_data[ospf_summ]["summaryAddress"]
if summary in show_ospf_json:
for summ in summ_data:
diff --git a/tests/topotests/lib/pim.py b/tests/topotests/lib/pim.py
index 32dda82712..0af1ecf6a0 100644
--- a/tests/topotests/lib/pim.py
+++ b/tests/topotests/lib/pim.py
@@ -1827,12 +1827,12 @@ def verify_pim_state(
else:
pim_state_json = show_pim_state_json[grp_addr][src_address]
- if pim_state_json["Installed"] == installed_fl:
+ if pim_state_json["installed"] == installed_fl:
logger.info(
"[DUT %s]: group %s is installed flag: %s",
dut,
grp_addr,
- pim_state_json["Installed"],
+ pim_state_json["installed"],
)
for interface, data in pim_state_json[iif].items():
if interface != oil:
diff --git a/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_topo1.py b/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_topo1.py
index 5b163d28e4..af21290dd6 100644
--- a/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_topo1.py
+++ b/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_topo1.py
@@ -308,11 +308,11 @@ def test_ospf_type5_summary_tc43_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -336,11 +336,11 @@ def test_ospf_type5_summary_tc43_p0(request):
input_dict = {
"11.0.0.0/16": {
- "Summary address": "11.0.0.0/16",
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": "11.0.0.0/16",
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -380,11 +380,11 @@ def test_ospf_type5_summary_tc43_p0(request):
input_dict = {
"11.0.0.0/16": {
- "Summary address": "11.0.0.0/24",
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 0,
+ "summaryAddress": "11.0.0.0/24",
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 0,
}
}
dut = "r0"
@@ -556,11 +556,11 @@ def test_ospf_type5_summary_tc48_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -652,11 +652,11 @@ def test_ospf_type5_summary_tc48_p0(request):
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -749,11 +749,11 @@ def test_ospf_type5_summary_tc42_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -820,11 +820,11 @@ def test_ospf_type5_summary_tc42_p0(request):
step("show ip ospf summary should not have any summary address.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -859,11 +859,11 @@ def test_ospf_type5_summary_tc42_p0(request):
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -942,11 +942,11 @@ def test_ospf_type5_summary_tc42_p0(request):
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1078,11 +1078,11 @@ def test_ospf_type5_summary_tc42_p0(request):
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1242,11 +1242,11 @@ def test_ospf_type5_summary_tc45_p0(request):
step("Verify that show ip ospf summary should show the summaries with tag.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 1234,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 1234,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1294,11 +1294,11 @@ def test_ospf_type5_summary_tc45_p0(request):
step("show ip ospf summary should not have any summary address.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 1234,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 1234,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1335,11 +1335,11 @@ def test_ospf_type5_summary_tc45_p0(request):
step("Verify that show ip ospf summary should show the summaries with tag.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 1,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 1,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1384,11 +1384,11 @@ def test_ospf_type5_summary_tc45_p0(request):
)
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 4294967295,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 4294967295,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1441,11 +1441,11 @@ def test_ospf_type5_summary_tc45_p0(request):
)
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 88888,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 88888,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1673,11 +1673,11 @@ def test_ospf_type5_summary_tc45_p0(request):
step("Verify that show ip ospf summary should show the summaries with tag.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 1234,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 1234,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1722,11 +1722,11 @@ def test_ospf_type5_summary_tc45_p0(request):
step("show ip ospf summary should not have any summary address.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 1234,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 1234,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1763,11 +1763,11 @@ def test_ospf_type5_summary_tc45_p0(request):
step("Verify that show ip ospf summary should show the summaries with tag.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 1,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 1,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1812,11 +1812,11 @@ def test_ospf_type5_summary_tc45_p0(request):
)
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 4294967295,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 4294967295,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1869,11 +1869,11 @@ def test_ospf_type5_summary_tc45_p0(request):
)
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 88888,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 88888,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2060,8 +2060,8 @@ def test_ospf_type5_summary_tc46_p0(request):
step("Verify that show ip ospf summary should show the " "configured summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2111,11 +2111,11 @@ def test_ospf_type5_summary_tc46_p0(request):
step("show ip ospf summary should not have any summary address.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 1234,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 1234,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2167,8 +2167,8 @@ def test_ospf_type5_summary_tc46_p0(request):
step("Verify that show ip ospf summary should show the " "configured summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2229,11 +2229,11 @@ def test_ospf_type5_summary_tc46_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2343,11 +2343,11 @@ def test_ospf_type5_summary_tc47_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2440,11 +2440,11 @@ def test_ospf_type5_summary_tc47_p0(request):
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2528,11 +2528,11 @@ def test_ospf_type5_summary_tc47_p0(request):
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2623,11 +2623,11 @@ def test_ospf_type5_summary_tc47_p0(request):
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2791,11 +2791,11 @@ def test_ospf_type5_summary_tc47_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
"12.0.0.0/8": {
- "Summary address": "12.0.0.0/8",
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": "12.0.0.0/8",
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2997,11 +2997,11 @@ def test_ospf_type5_summary_tc51_p2(request):
input_dict = {
SUMMARY["ipv4"][2]: {
- "Summary address": SUMMARY["ipv4"][2],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 0,
+ "summaryAddress": SUMMARY["ipv4"][2],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 0,
}
}
dut = "r0"
@@ -3092,11 +3092,11 @@ def test_ospf_type5_summary_tc49_p2(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -3148,11 +3148,11 @@ def test_ospf_type5_summary_tc49_p2(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -3212,11 +3212,11 @@ def test_ospf_type5_summary_tc49_p2(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -3269,11 +3269,11 @@ def test_ospf_type5_summary_tc49_p2(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][0]: {
- "Summary address": SUMMARY["ipv4"][0],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][0],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
diff --git a/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_type7_lsa.py b/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_type7_lsa.py
index b890f9a8aa..9886339796 100644
--- a/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_type7_lsa.py
+++ b/tests/topotests/ospf_basic_functionality/test_ospf_asbr_summary_type7_lsa.py
@@ -290,11 +290,11 @@ def test_ospf_type5_summary_tc44_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv4"][3]: {
- "Summary address": SUMMARY["ipv4"][3],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][3],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -342,11 +342,11 @@ def test_ospf_type5_summary_tc44_p0(request):
step("Verify that type7 LSAs received from neighbor are not summarised.")
input_dict = {
"13.0.0.0/8": {
- "Summary address": "13.0.0.0/8",
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 0,
+ "summaryAddress": "13.0.0.0/8",
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 0,
}
}
dut = "r0"
@@ -358,11 +358,11 @@ def test_ospf_type5_summary_tc44_p0(request):
step("Verify that already originated summary is intact.")
input_dict = {
SUMMARY["ipv4"][3]: {
- "Summary address": SUMMARY["ipv4"][3],
- "Metric-type": "E2",
- "Metric": 20,
- "Tag": 0,
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv4"][3],
+ "metricType": "E2",
+ "metric": 20,
+ "tag": 0,
+ "externalRouteCount": 5,
}
}
dut = "r0"
diff --git a/tests/topotests/ospf_gr_topo1/rt1/show_ip_ospf_route.json b/tests/topotests/ospf_gr_topo1/rt1/show_ip_ospf_route.json
index 548ca1e2d1..dc19e03b30 100644
--- a/tests/topotests/ospf_gr_topo1/rt1/show_ip_ospf_route.json
+++ b/tests/topotests/ospf_gr_topo1/rt1/show_ip_ospf_route.json
@@ -6,7 +6,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"lo"
+ "directlyAttachedTo":"lo"
}
]
},
@@ -83,7 +83,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt2"
+ "directlyAttachedTo":"eth-rt2"
}
]
},
diff --git a/tests/topotests/ospf_gr_topo1/rt2/show_ip_ospf_route.json b/tests/topotests/ospf_gr_topo1/rt2/show_ip_ospf_route.json
index 4accb2ba4a..3e2aba81e8 100644
--- a/tests/topotests/ospf_gr_topo1/rt2/show_ip_ospf_route.json
+++ b/tests/topotests/ospf_gr_topo1/rt2/show_ip_ospf_route.json
@@ -17,7 +17,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"lo"
+ "directlyAttachedTo":"lo"
}
]
},
@@ -83,7 +83,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt1"
+ "directlyAttachedTo":"eth-rt1"
}
]
},
@@ -94,7 +94,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt3"
+ "directlyAttachedTo":"eth-rt3"
}
]
},
diff --git a/tests/topotests/ospf_gr_topo1/rt3/show_ip_ospf_route.json b/tests/topotests/ospf_gr_topo1/rt3/show_ip_ospf_route.json
index b2f37e25a1..c17cf65c8a 100644
--- a/tests/topotests/ospf_gr_topo1/rt3/show_ip_ospf_route.json
+++ b/tests/topotests/ospf_gr_topo1/rt3/show_ip_ospf_route.json
@@ -28,7 +28,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"lo"
+ "directlyAttachedTo":"lo"
}
]
},
@@ -94,7 +94,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt2"
+ "directlyAttachedTo":"eth-rt2"
}
]
},
@@ -105,7 +105,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt4"
+ "directlyAttachedTo":"eth-rt4"
}
]
},
@@ -116,7 +116,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt6"
+ "directlyAttachedTo":"eth-rt6"
}
]
},
diff --git a/tests/topotests/ospf_gr_topo1/rt4/show_ip_ospf_route.json b/tests/topotests/ospf_gr_topo1/rt4/show_ip_ospf_route.json
index 04e318aef0..74de027860 100644
--- a/tests/topotests/ospf_gr_topo1/rt4/show_ip_ospf_route.json
+++ b/tests/topotests/ospf_gr_topo1/rt4/show_ip_ospf_route.json
@@ -39,7 +39,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"lo"
+ "directlyAttachedTo":"lo"
}
]
},
@@ -105,7 +105,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt3"
+ "directlyAttachedTo":"eth-rt3"
}
]
},
@@ -127,7 +127,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt5"
+ "directlyAttachedTo":"eth-rt5"
}
]
},
diff --git a/tests/topotests/ospf_gr_topo1/rt5/show_ip_ospf_route.json b/tests/topotests/ospf_gr_topo1/rt5/show_ip_ospf_route.json
index e7f712ea6b..5ecc222a94 100644
--- a/tests/topotests/ospf_gr_topo1/rt5/show_ip_ospf_route.json
+++ b/tests/topotests/ospf_gr_topo1/rt5/show_ip_ospf_route.json
@@ -50,7 +50,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"lo"
+ "directlyAttachedTo":"lo"
}
]
},
@@ -127,7 +127,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt4"
+ "directlyAttachedTo":"eth-rt4"
}
]
},
diff --git a/tests/topotests/ospf_gr_topo1/rt6/show_ip_ospf_route.json b/tests/topotests/ospf_gr_topo1/rt6/show_ip_ospf_route.json
index d9009724d5..50de685aec 100644
--- a/tests/topotests/ospf_gr_topo1/rt6/show_ip_ospf_route.json
+++ b/tests/topotests/ospf_gr_topo1/rt6/show_ip_ospf_route.json
@@ -61,7 +61,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"lo"
+ "directlyAttachedTo":"lo"
}
]
},
@@ -116,7 +116,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt3"
+ "directlyAttachedTo":"eth-rt3"
}
]
},
@@ -138,7 +138,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt7"
+ "directlyAttachedTo":"eth-rt7"
}
]
},
diff --git a/tests/topotests/ospf_gr_topo1/rt7/show_ip_ospf_route.json b/tests/topotests/ospf_gr_topo1/rt7/show_ip_ospf_route.json
index 89bad320bb..b8177d1cdc 100644
--- a/tests/topotests/ospf_gr_topo1/rt7/show_ip_ospf_route.json
+++ b/tests/topotests/ospf_gr_topo1/rt7/show_ip_ospf_route.json
@@ -83,7 +83,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"lo"
+ "directlyAttachedTo":"lo"
}
]
},
@@ -149,7 +149,7 @@
"nexthops":[
{
"ip":" ",
- "directly attached to":"eth-rt6"
+ "directlyAttachedTo":"eth-rt6"
}
]
},
diff --git a/tests/topotests/ospf_unnumbered/r1/ospf-route.json b/tests/topotests/ospf_unnumbered/r1/ospf-route.json
index 6beb7e9bed..cfd9d85e61 100644
--- a/tests/topotests/ospf_unnumbered/r1/ospf-route.json
+++ b/tests/topotests/ospf_unnumbered/r1/ospf-route.json
@@ -1 +1 @@
-{ "10.0.1.1\/32": { "routeType": "N", "cost": 10, "area": "0.0.0.0", "nexthops": [ { "ip": " ", "directly attached to": "r1-eth0" } ] }, "10.0.20.1\/32": { "routeType": "N", "cost": 20, "area": "0.0.0.0", "nexthops": [ { "ip": "10.0.3.2", "via": "r1-eth1" } ] }, "10.0.255.2": { "routeType": "R ", "cost": 10, "area": "0.0.0.0", "routerType": "asbr", "nexthops": [ { "ip": "10.0.3.2", "via": "r1-eth1" } ] } }
+{ "10.0.1.1\/32": { "routeType": "N", "cost": 10, "area": "0.0.0.0", "nexthops": [ { "ip": " ", "directlyAttachedTo": "r1-eth0" } ] }, "10.0.20.1\/32": { "routeType": "N", "cost": 20, "area": "0.0.0.0", "nexthops": [ { "ip": "10.0.3.2", "via": "r1-eth1" } ] }, "10.0.255.2": { "routeType": "R ", "cost": 10, "area": "0.0.0.0", "routerType": "asbr", "nexthops": [ { "ip": "10.0.3.2", "via": "r1-eth1" } ] } }
diff --git a/tests/topotests/ospf_unnumbered/r2/ospf-route.json b/tests/topotests/ospf_unnumbered/r2/ospf-route.json
index 3cfd255bfd..e56b872411 100644
--- a/tests/topotests/ospf_unnumbered/r2/ospf-route.json
+++ b/tests/topotests/ospf_unnumbered/r2/ospf-route.json
@@ -1 +1 @@
-{ "10.0.1.1\/32": { "routeType": "N", "cost": 20, "area": "0.0.0.0", "nexthops": [ { "ip": "10.0.3.4", "via": "r2-eth1" } ] }, "10.0.20.1\/32": { "routeType": "N", "cost": 10, "area": "0.0.0.0", "nexthops": [ { "ip": " ", "directly attached to": "r2-eth0" } ] }, "10.0.255.1": { "routeType": "R ", "cost": 10, "area": "0.0.0.0", "routerType": "asbr", "nexthops": [ { "ip": "10.0.3.4", "via": "r2-eth1" } ] } }
+{ "10.0.1.1\/32": { "routeType": "N", "cost": 20, "area": "0.0.0.0", "nexthops": [ { "ip": "10.0.3.4", "via": "r2-eth1" } ] }, "10.0.20.1\/32": { "routeType": "N", "cost": 10, "area": "0.0.0.0", "nexthops": [ { "ip": " ", "directlyAttachedTo": "r2-eth0" } ] }, "10.0.255.1": { "routeType": "R ", "cost": 10, "area": "0.0.0.0", "routerType": "asbr", "nexthops": [ { "ip": "10.0.3.4", "via": "r2-eth1" } ] } }
diff --git a/tests/topotests/ospfv3_basic_functionality/test_ospfv3_asbr_summary_topo1.py b/tests/topotests/ospfv3_basic_functionality/test_ospfv3_asbr_summary_topo1.py
index 1a92c597be..b8fbbb3f63 100644
--- a/tests/topotests/ospfv3_basic_functionality/test_ospfv3_asbr_summary_topo1.py
+++ b/tests/topotests/ospfv3_basic_functionality/test_ospfv3_asbr_summary_topo1.py
@@ -332,11 +332,11 @@ def test_ospfv3_type5_summary_tc42_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -403,11 +403,11 @@ def test_ospfv3_type5_summary_tc42_p0(request):
step("show ip ospf summary should not have any summary address.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -444,11 +444,11 @@ def test_ospfv3_type5_summary_tc42_p0(request):
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -527,11 +527,11 @@ def test_ospfv3_type5_summary_tc42_p0(request):
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -665,11 +665,11 @@ def test_ospfv3_type5_summary_tc42_p0(request):
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -822,11 +822,11 @@ def test_ospfv3_type5_summary_tc43_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -857,11 +857,11 @@ def test_ospfv3_type5_summary_tc43_p0(request):
input_dict = {
"2011::/16": {
- "Summary address": "2011::/16",
- "Metric-type": "E2",
+ "summaryAddress": "2011::/16",
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -901,11 +901,11 @@ def test_ospfv3_type5_summary_tc43_p0(request):
input_dict = {
"2011::/32": {
- "Summary address": "2011::/32",
- "Metric-type": "E2",
+ "summaryAddress": "2011::/32",
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 0,
+ "externalRouteCount": 0,
}
}
dut = "r0"
@@ -1084,11 +1084,11 @@ def ospfv3_type5_summary_tc45_p0(request):
step("Verify that show ip ospf summary should show the summaries with tag.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 1234,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1136,11 +1136,11 @@ def ospfv3_type5_summary_tc45_p0(request):
step("show ip ospf summary should not have any summary address.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 1234,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1179,11 +1179,11 @@ def ospfv3_type5_summary_tc45_p0(request):
step("Verify that show ip ospf summary should show the summaries with tag.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 1,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1228,11 +1228,11 @@ def ospfv3_type5_summary_tc45_p0(request):
)
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 4294967295,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1287,11 +1287,11 @@ def ospfv3_type5_summary_tc45_p0(request):
)
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 88888,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1521,11 +1521,11 @@ def ospfv3_type5_summary_tc45_p0(request):
step("Verify that show ip ospf summary should show the summaries with tag.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 1234,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1570,11 +1570,11 @@ def ospfv3_type5_summary_tc45_p0(request):
step("show ip ospf summary should not have any summary address.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 1234,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1613,11 +1613,11 @@ def ospfv3_type5_summary_tc45_p0(request):
step("Verify that show ip ospf summary should show the summaries with tag.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 1,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1662,11 +1662,11 @@ def ospfv3_type5_summary_tc45_p0(request):
)
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 4294967295,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1721,11 +1721,11 @@ def ospfv3_type5_summary_tc45_p0(request):
)
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 88888,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1914,8 +1914,8 @@ def test_ospfv3_type5_summary_tc46_p0(request):
step("Verify that show ip ospf summary should show the " "configured summaries.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -1965,11 +1965,11 @@ def test_ospfv3_type5_summary_tc46_p0(request):
step("show ip ospf summary should not have any summary address.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 1234,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2023,8 +2023,8 @@ def test_ospfv3_type5_summary_tc46_p0(request):
step("Verify that show ip ospf summary should show the " "configured summaries.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "External route count": 5,
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2085,11 +2085,11 @@ def test_ospfv3_type5_summary_tc46_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2207,11 +2207,11 @@ def test_ospfv3_type5_summary_tc48_p0(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2304,11 +2304,11 @@ def test_ospfv3_type5_summary_tc48_p0(request):
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2341,11 +2341,11 @@ def test_ospfv3_type5_summary_tc48_p0(request):
)
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2378,11 +2378,11 @@ def test_ospfv3_type5_summary_tc48_p0(request):
)
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2558,11 +2558,11 @@ def test_ospfv3_type5_summary_tc51_p2(request):
input_dict = {
SUMMARY["ipv6"][3]: {
- "Summary address": SUMMARY["ipv6"][3],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][3],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 0,
+ "externalRouteCount": 0,
}
}
dut = "r0"
@@ -2653,11 +2653,11 @@ def test_ospfv3_type5_summary_tc49_p2(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
@@ -2709,11 +2709,11 @@ def test_ospfv3_type5_summary_tc49_p2(request):
step("Verify that show ip ospf summary should show the summaries.")
input_dict = {
SUMMARY["ipv6"][0]: {
- "Summary address": SUMMARY["ipv6"][0],
- "Metric-type": "E2",
+ "summaryAddress": SUMMARY["ipv6"][0],
+ "metricType": "E2",
"Metric": 20,
"Tag": 0,
- "External route count": 5,
+ "externalRouteCount": 5,
}
}
dut = "r0"
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index 7885188483..acc984ced7 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -4014,6 +4014,9 @@ DEFUN (vtysh_traceroute6,
return CMD_SUCCESS;
}
+#if CONFDATE > 20240201
+CPP_NOTICE("Remove HAVE_SHELL_ACCESS and it's documentation");
+#endif
#if defined(HAVE_SHELL_ACCESS)
DEFUN (vtysh_telnet,
vtysh_telnet_cmd,
diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c
index 7e86d15b4b..c6ff5089ca 100644
--- a/zebra/zebra_vxlan.c
+++ b/zebra/zebra_vxlan.c
@@ -5554,6 +5554,7 @@ void zebra_vxlan_advertise_svi_macip(ZAPI_HANDLER_ARGS)
struct zebra_if *zif = NULL;
struct zebra_l2info_vxlan zl2_info;
struct interface *vlan_if = NULL;
+ int old_advertise;
zevpn = zebra_evpn_lookup(vni);
if (!zevpn)
@@ -5561,19 +5562,20 @@ void zebra_vxlan_advertise_svi_macip(ZAPI_HANDLER_ARGS)
if (IS_ZEBRA_DEBUG_VXLAN)
zlog_debug(
- "EVPN SVI macip Adv %s on VNI %d , currently %s",
+ "EVPN SVI macip Adv %s on VNI %d, currently %s",
advertise ? "enabled" : "disabled", vni,
advertise_svi_macip_enabled(zevpn)
? "enabled"
: "disabled");
- if (zevpn->advertise_svi_macip == advertise)
- return;
+ old_advertise = advertise_svi_macip_enabled(zevpn);
/* Store flag even though SVI is not present.
* Once SVI comes up triggers self MAC-IP route add.
*/
zevpn->advertise_svi_macip = advertise;
+ if (advertise_svi_macip_enabled(zevpn) == old_advertise)
+ return;
ifp = zevpn->vxlan_if;
if (!ifp)
@@ -5637,7 +5639,7 @@ void zebra_vxlan_advertise_subnet(ZAPI_HANDLER_ARGS)
return;
if (IS_ZEBRA_DEBUG_VXLAN)
- zlog_debug("EVPN subnet Adv %s on VNI %d , currently %s",
+ zlog_debug("EVPN subnet Adv %s on VNI %d, currently %s",
advertise ? "enabled" : "disabled", vni,
zevpn->advertise_subnet ? "enabled" : "disabled");
@@ -5719,6 +5721,7 @@ void zebra_vxlan_advertise_gw_macip(ZAPI_HANDLER_ARGS)
struct zebra_l2info_vxlan zl2_info;
struct interface *vlan_if = NULL;
struct interface *vrr_if = NULL;
+ int old_advertise;
zevpn = zebra_evpn_lookup(vni);
if (!zevpn)
@@ -5726,15 +5729,16 @@ void zebra_vxlan_advertise_gw_macip(ZAPI_HANDLER_ARGS)
if (IS_ZEBRA_DEBUG_VXLAN)
zlog_debug(
- "EVPN gateway macip Adv %s on VNI %d , currently %s",
+ "EVPN gateway macip Adv %s on VNI %d, currently %s",
advertise ? "enabled" : "disabled", vni,
advertise_gw_macip_enabled(zevpn) ? "enabled"
- : "disabled");
+ : "disabled");
- if (zevpn->advertise_gw_macip == advertise)
- return;
+ old_advertise = advertise_gw_macip_enabled(zevpn);
zevpn->advertise_gw_macip = advertise;
+ if (advertise_gw_macip_enabled(zevpn) == old_advertise)
+ return;
ifp = zevpn->vxlan_if;
if (!ifp)