summaryrefslogtreecommitdiffstats
path: root/docs/aboutvpp
diff options
context:
space:
mode:
authorAndrew Yourtchenko <ayourtch@cisco.com>2022-10-19 09:23:03 +0000
committerAndrew Yourtchenko <ayourtch@gmail.com>2022-10-26 12:53:34 +0000
commit07e0c05e698cf5ffd1e2d2de0296d1907519dc3d (patch)
tree8428fa0b82b027b670ac8a2d90ee119b81bfb697 /docs/aboutvpp
parentad569da163d584e1df3803b3b51e4e05e5aef6ea (diff)
misc: VPP 22.10 Release Notesv22.10
Type: docs Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com> Change-Id: If0f2ca0344640b064fde52b8f2c09a340ed9c71b Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
Diffstat (limited to 'docs/aboutvpp')
-rw-r--r--docs/aboutvpp/releasenotes/index.rst2
-rw-r--r--docs/aboutvpp/releasenotes/past.rst1
-rw-r--r--docs/aboutvpp/releasenotes/v22.10.rst504
3 files changed, 506 insertions, 1 deletions
diff --git a/docs/aboutvpp/releasenotes/index.rst b/docs/aboutvpp/releasenotes/index.rst
index 1ef5ff0100f..fa8d6a91bac 100644
--- a/docs/aboutvpp/releasenotes/index.rst
+++ b/docs/aboutvpp/releasenotes/index.rst
@@ -6,7 +6,7 @@ Release notes
.. toctree::
:maxdepth: 2
+ v22.10
v22.06
v22.02
- v21.10.1
past
diff --git a/docs/aboutvpp/releasenotes/past.rst b/docs/aboutvpp/releasenotes/past.rst
index f518055825d..b60ff7fcc9f 100644
--- a/docs/aboutvpp/releasenotes/past.rst
+++ b/docs/aboutvpp/releasenotes/past.rst
@@ -6,6 +6,7 @@ Past releases
.. toctree::
:maxdepth: 1
+ v21.10.1
v21.10
v21.06
v21.01
diff --git a/docs/aboutvpp/releasenotes/v22.10.rst b/docs/aboutvpp/releasenotes/v22.10.rst
new file mode 100644
index 00000000000..5dfbff5d48e
--- /dev/null
+++ b/docs/aboutvpp/releasenotes/v22.10.rst
@@ -0,0 +1,504 @@
+Release notes for VPP 22.10
+===========================
+
+More than 212 commits since the previous release, including 118 fixes.
+
+Features
+--------
+
+- Packetforge
+
+ - Add packetforge for generic flow to extras (`ce4b64517 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ce4b64517>`_)
+
+- Plugins
+
+ - DPDK
+
+ - Enable interrupt support for vmxnet3 (`157e4f5d2 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=157e4f5d2>`_)
+ - Bump to 22.07 (`3c285b54a <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=3c285b54a>`_)
+ - Build MLX libraries into DPDK plugin when verified to be compatible with the DPDK & RDMA version specified
+ in the matrix file. (`4e939ced <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4e939ced>`_)
+
+ | **NOTE**: A daily CI job verifies that the MLX libraries are being built into
+ | the DPDK plugin and sends an email to vpp-build@lists.fd.io if the job fails.
+ | Anyone desiring to be notified of the absense of the MLX drivers being built
+ | into the DPDK plugin should subscribe to the mailing list at
+ | https://lists.fd.io/g/vpp-build
+
+ - Wireguard
+
+ - Add processing of received cookie messages (`44ec846f4 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=44ec846f4>`_)
+ - Add dos mitigation support (`ce91af8ad <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ce91af8ad>`_)
+ - Add handshake rate limiting support (`a6328e51e <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=a6328e51e>`_)
+ - Add peers roaming support (`fee9853a4 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=fee9853a4>`_)
+
+ - Performance counter
+
+ - Enable perfmon plugin for Arm (`268d7be66 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=268d7be66>`_)
+ - Add Arm event bundles (`af82211d3 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=af82211d3>`_)
+
+- Test Infrastructure
+
+ - Add ipsec flow performance unit test (`422544363 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=422544363>`_)
+ - Add fast path ipv6 python tests for outbound policy matching (`651cc01b6 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=651cc01b6>`_)
+
+- VNET
+
+ - IP Neighbors
+
+ - ARP and ND stats per-interface. (`fd2417b2a <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=fd2417b2a>`_)
+
+ - IPSec
+
+ - Introduce spd fast path types (`d699a347c <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=d699a347c>`_)
+ - Add/delete ipsec fast path policy (`0464310fd <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0464310fd>`_)
+ - Add spd fast path matching (`e1dce3758 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=e1dce3758>`_)
+ - Add fast path configuration parser (`4da8a63a9 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=4da8a63a9>`_)
+ - Show fast path flag in cli (`93bc431df <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=93bc431df>`_)
+ - Add fast path python tests (`ab0bf0c0c <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ab0bf0c0c>`_)
+ - Fast path outbound policy matching implementation for ipv6 (`86f8208af <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=86f8208af>`_)
+ - Introduce fast path ipv4 inbound matching (`993b6bee6 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=993b6bee6>`_)
+ - Make chacha20-poly1305 available via API (`d7c030d60 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=d7c030d60>`_)
+
+ - Segment Routing (IPv6 and MPLS)
+
+ - SRv6 TEF behavior support (`9cca694c8 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=9cca694c8>`_)
+ - Add support for SRv6 Path Tracing Infrastructure (`c933bb7e3 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=c933bb7e3>`_)
+ - SRv6 Path Tracing Sink node behavior (`d50e661d6 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=d50e661d6>`_)
+
+ - Session Layer
+
+ - Support dma option (`0654242d1 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=0654242d1>`_)
+
+- VPP Comms Library
+
+ - Add hugepage for vcl configure and svm (`c795b8836 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=c795b8836>`_)
+
+- Vector Library
+
+ - Introduce DMA infrastructure (`abd566942 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=abd566942>`_)
+
+- VPP StrongSwan Daemon
+
+ - Add plugin for VPP-swan (`225d15cae <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=225d15cae>`_)
+
+- VPP Host Stack
+
+ - Add test framework for host stack (`229f5fcf1 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=229f5fcf1>`_)
+
+- Packetforge
+
+ - Add a tool to create generic flow rules using a format of naming protocols or json profile. (`ce4b64517 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=ce4b64517>`_)
+
+Known issues
+------------
+
+For the full list of issues please refer to fd.io `JIRA <https://jira.fd.io>`_.
+
+Fixed issues
+------------
+
+For the full list of fixed issues please refer to:
+- fd.io `JIRA <https://jira.fd.io>`_
+- git `commit log <https://git.fd.io/vpp/log/?h=master>`_
+
+
+API changes
+-----------
+
+Description of results:
+
+- *Definition changed*: indicates that the API file was modified between releases.
+- *Only in image*: indicates the API is new for this release.
+- *Only in file*: indicates the API has been removed in this release.
+
+============================================================= ==================
+Message Name Result
+============================================================= ==================
+ipsec_spd_entry_add_del_v2 only in image
+ipsec_spd_entry_add_del_v2_reply only in image
+============================================================= ==================
+
+Found 2 api message signature differences
+
+
+Newly deprecated API messages
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+These messages are still there in the API, but can and probably
+will disappear in the next release.
+
+- ipsec_spd_entry_add_del
+
+In-progress API messages
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+These messages are provided for testing and experimentation only.
+They are *not* subject to any compatibility process,
+and therefore can arbitrarily change or disappear at *any* moment.
+Also they may have less than satisfactory testing, making
+them unsuitable for other use than the technology preview.
+If you are intending to use these messages in production projects,
+please collaborate with the feature maintainer on their productization.
+
+- abf_itf_attach_add_del
+- abf_itf_attach_add_del_reply
+- abf_itf_attach_details
+- abf_itf_attach_dump
+- abf_plugin_get_version
+- abf_plugin_get_version_reply
+- abf_policy_add_del
+- abf_policy_add_del_reply
+- abf_policy_details
+- abf_policy_dump
+- acl_plugin_use_hash_lookup_get
+- acl_plugin_use_hash_lookup_get_reply
+- acl_plugin_use_hash_lookup_set
+- acl_plugin_use_hash_lookup_set_reply
+- adl_allowlist_enable_disable
+- adl_allowlist_enable_disable_reply
+- adl_interface_enable_disable
+- adl_interface_enable_disable_reply
+- cnat_get_snat_addresses
+- cnat_get_snat_addresses_reply
+- cnat_session_details
+- cnat_session_dump
+- cnat_session_purge
+- cnat_session_purge_reply
+- cnat_set_snat_addresses
+- cnat_set_snat_addresses_reply
+- cnat_set_snat_policy
+- cnat_set_snat_policy_reply
+- cnat_snat_policy_add_del_exclude_pfx
+- cnat_snat_policy_add_del_exclude_pfx_reply
+- cnat_snat_policy_add_del_if
+- cnat_snat_policy_add_del_if_reply
+- cnat_translation_del
+- cnat_translation_del_reply
+- cnat_translation_details
+- cnat_translation_dump
+- cnat_translation_update
+- cnat_translation_update_reply
+- crypto_sw_scheduler_set_worker
+- crypto_sw_scheduler_set_worker_reply
+- det44_get_timeouts_reply
+- det44_interface_add_del_feature
+- det44_interface_add_del_feature_reply
+- det44_interface_details
+- det44_interface_dump
+- det44_plugin_enable_disable
+- det44_plugin_enable_disable_reply
+- det44_set_timeouts
+- det44_set_timeouts_reply
+- flow_add
+- flow_add_reply
+- flow_add_v2
+- flow_add_v2_reply
+- flow_del
+- flow_del_reply
+- flow_disable
+- flow_disable_reply
+- flow_enable
+- flow_enable_reply
+- flowprobe_get_params
+- flowprobe_get_params_reply
+- flowprobe_interface_add_del
+- flowprobe_interface_add_del_reply
+- flowprobe_interface_details
+- flowprobe_interface_dump
+- flowprobe_set_params
+- flowprobe_set_params_reply
+- gbp_bridge_domain_add
+- gbp_bridge_domain_add_reply
+- gbp_bridge_domain_del
+- gbp_bridge_domain_del_reply
+- gbp_bridge_domain_details
+- gbp_bridge_domain_dump
+- gbp_bridge_domain_dump_reply
+- gbp_contract_add_del
+- gbp_contract_add_del_reply
+- gbp_contract_details
+- gbp_contract_dump
+- gbp_endpoint_add
+- gbp_endpoint_add_reply
+- gbp_endpoint_del
+- gbp_endpoint_del_reply
+- gbp_endpoint_details
+- gbp_endpoint_dump
+- gbp_endpoint_group_add
+- gbp_endpoint_group_add_reply
+- gbp_endpoint_group_del
+- gbp_endpoint_group_del_reply
+- gbp_endpoint_group_details
+- gbp_endpoint_group_dump
+- gbp_ext_itf_add_del
+- gbp_ext_itf_add_del_reply
+- gbp_ext_itf_details
+- gbp_ext_itf_dump
+- gbp_recirc_add_del
+- gbp_recirc_add_del_reply
+- gbp_recirc_details
+- gbp_recirc_dump
+- gbp_route_domain_add
+- gbp_route_domain_add_reply
+- gbp_route_domain_del
+- gbp_route_domain_del_reply
+- gbp_route_domain_details
+- gbp_route_domain_dump
+- gbp_route_domain_dump_reply
+- gbp_subnet_add_del
+- gbp_subnet_add_del_reply
+- gbp_subnet_details
+- gbp_subnet_dump
+- gbp_vxlan_tunnel_add
+- gbp_vxlan_tunnel_add_reply
+- gbp_vxlan_tunnel_del
+- gbp_vxlan_tunnel_del_reply
+- gbp_vxlan_tunnel_details
+- gbp_vxlan_tunnel_dump
+- ikev2_child_sa_details
+- ikev2_child_sa_dump
+- ikev2_initiate_del_child_sa
+- ikev2_initiate_del_child_sa_reply
+- ikev2_initiate_del_ike_sa
+- ikev2_initiate_del_ike_sa_reply
+- ikev2_initiate_rekey_child_sa
+- ikev2_initiate_rekey_child_sa_reply
+- ikev2_initiate_sa_init
+- ikev2_initiate_sa_init_reply
+- ikev2_nonce_get
+- ikev2_nonce_get_reply
+- ikev2_profile_add_del
+- ikev2_profile_add_del_reply
+- ikev2_profile_details
+- ikev2_profile_disable_natt
+- ikev2_profile_disable_natt_reply
+- ikev2_profile_dump
+- ikev2_profile_set_auth
+- ikev2_profile_set_auth_reply
+- ikev2_profile_set_id
+- ikev2_profile_set_id_reply
+- ikev2_profile_set_ipsec_udp_port
+- ikev2_profile_set_ipsec_udp_port_reply
+- ikev2_profile_set_liveness
+- ikev2_profile_set_liveness_reply
+- ikev2_profile_set_ts
+- ikev2_profile_set_ts_reply
+- ikev2_profile_set_udp_encap
+- ikev2_profile_set_udp_encap_reply
+- ikev2_sa_details
+- ikev2_sa_dump
+- ikev2_set_esp_transforms
+- ikev2_set_esp_transforms_reply
+- ikev2_set_ike_transforms
+- ikev2_set_ike_transforms_reply
+- ikev2_set_local_key
+- ikev2_set_local_key_reply
+- ikev2_set_responder
+- ikev2_set_responder_hostname
+- ikev2_set_responder_hostname_reply
+- ikev2_set_responder_reply
+- ikev2_set_sa_lifetime
+- ikev2_set_sa_lifetime_reply
+- ikev2_set_tunnel_interface
+- ikev2_set_tunnel_interface_reply
+- ikev2_traffic_selector_details
+- ikev2_traffic_selector_dump
+- ip_route_add_del_v2
+- ip_route_add_del_v2_reply
+- ip_route_lookup_v2
+- ip_route_lookup_v2_reply
+- ip_route_v2_details
+- ip_route_v2_dump
+- l2_emulation
+- l2_emulation_reply
+- lcp_default_ns_get_reply
+- lcp_default_ns_set
+- lcp_default_ns_set_reply
+- lcp_itf_pair_add_del
+- lcp_itf_pair_add_del_reply
+- lcp_itf_pair_add_del_v2
+- lcp_itf_pair_details
+- mdata_enable_disable
+- mdata_enable_disable_reply
+- nat44_ei_add_del_address_range
+- nat44_ei_add_del_address_range_reply
+- nat44_ei_add_del_static_mapping
+- nat44_ei_add_del_static_mapping_reply
+- nat44_ei_address_details
+- nat44_ei_address_dump
+- nat44_ei_del_session
+- nat44_ei_del_session_reply
+- nat44_ei_del_user
+- nat44_ei_del_user_reply
+- nat44_ei_forwarding_enable_disable
+- nat44_ei_forwarding_enable_disable_reply
+- nat44_ei_ha_flush
+- nat44_ei_ha_flush_reply
+- nat44_ei_ha_resync
+- nat44_ei_ha_resync_completed_event
+- nat44_ei_ha_resync_reply
+- nat44_ei_ha_set_failover
+- nat44_ei_ha_set_failover_reply
+- nat44_ei_ha_set_listener
+- nat44_ei_ha_set_listener_reply
+- nat44_ei_interface_add_del_feature
+- nat44_ei_interface_add_del_feature_reply
+- nat44_ei_interface_details
+- nat44_ei_interface_dump
+- nat44_ei_ipfix_enable_disable
+- nat44_ei_ipfix_enable_disable_reply
+- nat44_ei_plugin_enable_disable
+- nat44_ei_plugin_enable_disable_reply
+- nat44_ei_set_addr_and_port_alloc_alg
+- nat44_ei_set_addr_and_port_alloc_alg_reply
+- nat44_ei_set_fq_options
+- nat44_ei_set_fq_options_reply
+- nat44_ei_set_mss_clamping
+- nat44_ei_set_mss_clamping_reply
+- nat44_ei_set_timeouts
+- nat44_ei_set_timeouts_reply
+- nat44_ei_set_workers
+- nat44_ei_set_workers_reply
+- nat44_ei_show_fq_options
+- nat44_ei_show_fq_options_reply
+- nat44_ei_show_running_config
+- nat44_ei_show_running_config_reply
+- nat44_ei_static_mapping_details
+- nat44_ei_static_mapping_dump
+- nat44_ei_user_details
+- nat44_ei_user_dump
+- nat44_ei_user_session_details
+- nat44_ei_user_session_dump
+- nat44_ei_worker_details
+- nat44_ei_worker_dump
+- nat64_plugin_enable_disable
+- nat64_plugin_enable_disable_reply
+- oddbuf_enable_disable
+- oddbuf_enable_disable_reply
+- pg_interface_enable_disable_coalesce
+- pg_interface_enable_disable_coalesce_reply
+- pnat_binding_add
+- pnat_binding_add_reply
+- pnat_binding_add_v2
+- pnat_binding_add_v2_reply
+- pnat_binding_attach
+- pnat_binding_attach_reply
+- pnat_binding_del
+- pnat_binding_del_reply
+- pnat_binding_detach
+- pnat_binding_detach_reply
+- pnat_bindings_details
+- pnat_bindings_get
+- pnat_bindings_get_reply
+- pnat_interfaces_details
+- pnat_interfaces_get
+- pnat_interfaces_get_reply
+- sample_macswap_enable_disable
+- sample_macswap_enable_disable_reply
+- sr_policies_with_sl_index_details
+- sr_policies_with_sl_index_dump
+- sw_interface_set_vxlan_gbp_bypass
+- sw_interface_set_vxlan_gbp_bypass_reply
+- test_addresses
+- test_addresses2
+- test_addresses2_reply
+- test_addresses3
+- test_addresses3_reply
+- test_addresses_reply
+- test_empty
+- test_empty_reply
+- test_enum
+- test_enum_reply
+- test_interface
+- test_interface_reply
+- test_prefix
+- test_prefix_reply
+- test_string
+- test_string2
+- test_string2_reply
+- test_string_reply
+- test_vla
+- test_vla2
+- test_vla2_reply
+- test_vla3
+- test_vla3_reply
+- test_vla4
+- test_vla4_reply
+- test_vla5
+- test_vla5_reply
+- test_vla_reply
+- trace_capture_packets
+- trace_capture_packets_reply
+- trace_clear_capture
+- trace_clear_capture_reply
+- trace_details
+- trace_dump
+- trace_dump_reply
+- trace_set_filters
+- trace_set_filters_reply
+- vxlan_gbp_tunnel_add_del
+- vxlan_gbp_tunnel_add_del_reply
+- vxlan_gbp_tunnel_details
+- vxlan_gbp_tunnel_dump
+- want_wireguard_peer_events
+- want_wireguard_peer_events_reply
+- wg_set_async_mode
+- wg_set_async_mode_reply
+- wireguard_interface_create
+- wireguard_interface_create_reply
+- wireguard_interface_delete
+- wireguard_interface_delete_reply
+- wireguard_interface_details
+- wireguard_interface_dump
+- wireguard_peer_add
+- wireguard_peer_add_reply
+- wireguard_peer_event
+- wireguard_peer_remove
+- wireguard_peer_remove_reply
+- wireguard_peers_details
+- wireguard_peers_dump
+
+Patches that changed API definitions
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+``src/vnet/ipsec/ipsec.api``
+
+* `93688d734 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=93688d734>`_ ipsec: Use .api declared error counters
+* `815c6a4fb <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=815c6a4fb>`_ ipsec: change wildcard value for any protocol of spd policy
+
+``src/vnet/ipsec/ipsec_types.api``
+
+* `d7c030d60 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=d7c030d60>`_ ipsec: make chacha20-poly1305 available via API
+* `815c6a4fb <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=815c6a4fb>`_ ipsec: change wildcard value for any protocol of spd policy
+
+``src/vnet/mpls/mpls.api``
+
+* `41a85c0a2 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=41a85c0a2>`_ mpls: Use the .api for the definition of error/info counters
+
+``src/vnet/arp/arp.api``
+
+* `13a74ae25 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=13a74ae25>`_ arp: Use the new style error count declaration
+
+``src/vnet/ip/ip.api``
+
+* `b29c60660 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=b29c60660>`_ ip: Use .api declarative counters for ICMP.
+* `e22a70416 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=e22a70416>`_ ip: Use .api declared error counters
+
+``src/vnet/ip-neighbor/ip_neighbor.api``
+
+* `6e4a56e65 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=6e4a56e65>`_ ip-neighbor: Declarative .api counters.
+
+``src/vnet/bfd/bfd.api``
+
+* `5c7e579f7 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=5c7e579f7>`_ bfd: Express node stats using the .api file
+
+``src/plugins/abf/abf.api``
+
+* `755b529c1 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=755b529c1>`_ abf: add API parameter n_paths range checks
+
+``src/plugins/linux-cp/lcp.api``
+
+* `3f245e687 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=3f245e687>`_ linux-cp: change namespace to netns
+* `99e3b8b84 <https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commit;h=99e3b8b84>`_ linux-cp: API downgrade due to namespace keyword