From 20f038d98b8a8bfd841d5294b78d93900141c5ed Mon Sep 17 00:00:00 2001 From: arlakshm Date: Tue, 14 Apr 2026 05:03:09 +0000 Subject: [PATCH] BGP confederation support for Disaggregated T2 Port of sonic-net/sonic-buildimage#26427 to 202511 branch. Add BGP confederation configuration support for disaggregated T2 devices (LowerSpineRouter, UpperSpineRouter, FabricSpineRouter). Changes: - YANG model: Add CONFED container to sonic-bgp-device-global with asn and members fields - FRR templates: Add confederation identifier and peers config to bgpd.main.conf.j2, instance.conf.j2, and peer-group.conf.j2 - Constants: Add hide_internal_community for disaggregated T2 topologies - Documentation: Update Configuration.md with CONFED schema - Unit tests: Add bgpcfgd, config-engine, and YANG model test cases Signed-off-by: arlakshm --- .../docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 | 23 ++++++ .../templates/voq_chassis/instance.conf.j2 | 1 - .../templates/voq_chassis/peer-group.conf.j2 | 7 ++ files/image_config/constants/constants.yml | 1 + .../multi_asic_upper_t2.conf | 48 ++++++++++++ .../multi_asic_upper_t2.json | 26 +++++++ .../bgpd.main.conf.j2/single_asic_ft2.conf | 26 +++++++ .../bgpd.main.conf.j2/single_asic_ft2.json | 25 ++++++ .../bgpd.main.conf.j2/single_asic_lt2.conf | 26 +++++++ .../bgpd.main.conf.j2/single_asic_lt2.json | 25 ++++++ .../single_asic_upper_t2.conf | 26 +++++++ .../single_asic_upper_t2.json | 25 ++++++ .../instance.conf/result_all_v4.conf | 1 - .../instance.conf/result_all_v6.conf | 1 - .../instance.conf/result_base_v4.conf | 1 - .../instance.conf/result_base_v6.conf | 1 - .../instance.conf/result_shutdown_v4_1.conf | 1 - .../instance.conf/result_shutdown_v4_2.conf | 1 - .../instance.conf/result_shutdown_v6_1.conf | 1 - .../instance.conf/result_shutdown_v6_2.conf | 1 - .../instance.conf/result_timers_v4_1.conf | 1 - .../instance.conf/result_timers_v4_2.conf | 1 - .../instance.conf/result_timers_v6_1.conf | 1 - .../instance.conf/result_timers_v6_2.conf | 1 - .../peer-group.conf/param_all.json | 3 +- .../peer-group.conf/param_base.json | 4 +- .../peer-group.conf/result_all.conf | 2 + .../peer-group.conf/result_base.conf | 2 + src/sonic-bgpcfgd/tests/test_sonic-cfggen.py | 36 +++++++++ .../sample_output/py3/bgpd_frr_confed.conf | 76 +++++++++++++++++++ .../py3/bgpd_frr_confed_lt2.conf | 76 +++++++++++++++++++ .../py3/bgpd_frr_confed_masic.conf | 76 +++++++++++++++++++ src/sonic-yang-models/doc/Configuration.md | 15 ++++ .../tests/bgp_device_global.json | 8 ++ .../tests_config/bgp_device_global.json | 20 +++++ .../yang-models/sonic-bgp-device-global.yang | 19 +++++ 36 files changed, 593 insertions(+), 15 deletions(-) create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/multi_asic_upper_t2.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/multi_asic_upper_t2.json create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_ft2.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_ft2.json create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_lt2.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_lt2.json create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_upper_t2.conf create mode 100644 src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_upper_t2.json create mode 100644 src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed.conf create mode 100644 src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed_lt2.conf create mode 100644 src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed_masic.conf diff --git a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 index 0f848195af..00368fa785 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 @@ -14,6 +14,13 @@ ip prefix-list PL_LoopbackV4 permit {{ lo0_ipv4 }}/32 {% endif %} ! +{# Check if the device is a disaggregated T2 device #} +{% set disagg_t2 = "false" %} +{% if (DEVICE_METADATA is defined) and ('localhost' in DEVICE_METADATA) and ('type' in DEVICE_METADATA['localhost']) %} +{% if DEVICE_METADATA['localhost']['type'].lower() in ['lowerspinerouter', 'upperspinerouter', 'fabricspinerouter']%} +{% set disagg_t2 = "true" %} +{% endif%} +{% endif %} {% if get_ipv6_loopback_address(LOOPBACK_INTERFACE, "Loopback0") != 'None' %} {% if ( ('localhost' in DEVICE_METADATA) and ('bgp_adv_lo_prefix_as_128' in DEVICE_METADATA['localhost']) and (DEVICE_METADATA['localhost']['bgp_adv_lo_prefix_as_128'] == 'true') ) %} @@ -57,6 +64,14 @@ route-map V6_CONNECTED_ROUTES permit 10 ! route-map HIDE_INTERNAL permit 10 set community no-export +{% if disagg_t2 == "true" %} +{% if constants.bgp.hide_internal_community is defined %} + on-match next +! +route-map HIDE_INTERNAL permit 20 + set community {{ constants.bgp.hide_internal_community }} additive +{% endif %} +{% endif %} {% if constants.bgp.peers is defined and constants.bgp.peers.internal is defined and constants.bgp.peers.internal.community is defined %} on-match next route-map HIDE_INTERNAL permit 20 @@ -68,6 +83,14 @@ route-map HIDE_INTERNAL permit 20 {% if (DEVICE_METADATA is defined) and ('localhost' in DEVICE_METADATA) and ('bgp_asn' in DEVICE_METADATA['localhost']) and (DEVICE_METADATA['localhost']['bgp_asn'].lower() != 'none') and (DEVICE_METADATA['localhost']['bgp_asn'].lower() != 'null') %} router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} ! +{% if disagg_t2 == "true" %} +{% if (BGP_DEVICE_GLOBAL is defined) and ('CONFED' in BGP_DEVICE_GLOBAL) and ('asn' in BGP_DEVICE_GLOBAL['CONFED'] ) %} + bgp confederation identifier {{ BGP_DEVICE_GLOBAL['CONFED']['asn'] }} +{% endif %} +{% if (BGP_DEVICE_GLOBAL is defined) and ('CONFED' in BGP_DEVICE_GLOBAL) and ('peers' in BGP_DEVICE_GLOBAL['CONFED'] ) %} + bgp confederation peers {{ BGP_DEVICE_GLOBAL['CONFED']['peers'] | replace(';', ' ') }} +{% endif %} +{% endif %} {% block bgp_init %} bgp log-neighbor-changes bgp suppress-fib-pending diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/instance.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/instance.conf.j2 index c40d3b8423..4c92ab8def 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/instance.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/instance.conf.j2 @@ -9,7 +9,6 @@ {% elif neighbor_addr | ipv6 %} neighbor {{ neighbor_addr }} peer-group VOQ_CHASSIS_V6_PEER {% endif %} - neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} neighbor {{ neighbor_addr }} timers 2 7 neighbor {{ neighbor_addr }} timers connect 10 diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/peer-group.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/peer-group.conf.j2 index 802aa15ca6..5c4b756bf6 100644 --- a/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/peer-group.conf.j2 +++ b/dockers/docker-fpm-frr/frr/bgpd/templates/voq_chassis/peer-group.conf.j2 @@ -2,7 +2,14 @@ ! template: bgpd/templates/voq_chassis/peer-group.conf.j2 ! neighbor VOQ_CHASSIS_V4_PEER peer-group + {% if 'bgp_asn' in CONFIG_DB__DEVICE_METADATA['localhost'] %} + neighbor VOQ_CHASSIS_V4_PEER remote-as {{ CONFIG_DB__DEVICE_METADATA['localhost']['bgp_asn'] }} + {% endif %} neighbor VOQ_CHASSIS_V6_PEER peer-group + {% if 'bgp_asn' in CONFIG_DB__DEVICE_METADATA['localhost'] %} + neighbor VOQ_CHASSIS_V6_PEER remote-as {{ CONFIG_DB__DEVICE_METADATA['localhost']['bgp_asn'] }} + {% endif %} + address-family ipv4 {% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor VOQ_CHASSIS_V4_PEER allowas-in 1 diff --git a/files/image_config/constants/constants.yml b/files/image_config/constants/constants.yml index 8e32052a2c..340358eaae 100644 --- a/files/image_config/constants/constants.yml +++ b/files/image_config/constants/constants.yml @@ -10,6 +10,7 @@ constants: internal_community_match_tag: 201 route_do_not_send_appdb_tag: 202 route_eligible_for_fallback_to_default_tag: 203 + hide_internal_community: 55555:55555 families: - ipv4 - ipv6 diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/multi_asic_upper_t2.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/multi_asic_upper_t2.conf new file mode 100644 index 0000000000..efe160f795 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/multi_asic_upper_t2.conf @@ -0,0 +1,48 @@ +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 55.55.55.55/32 +! +ip prefix-list V4_P2P_IP permit 0.0.0.0/0 ge 31 le 31 +! +ipv6 prefix-list V6_P2P_IP permit ::/0 ge 126 le 126 +! +route-map V4_CONNECTED_ROUTES permit 10 + match ip address prefix-list V4_P2P_IP + call HIDE_INTERNAL +! +route-map V6_CONNECTED_ROUTES permit 10 + match ipv6 address prefix-list V6_P2P_IP + call HIDE_INTERNAL +! +route-map HIDE_INTERNAL permit 10 + set community no-export +! +router bgp 65001 +! + bgp confederation identifier 65000 + bgp confederation peers 65001 + bgp log-neighbor-changes + bgp suppress-fib-pending + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp router-id 55.55.55.55 +! + network 55.55.55.55/32 +! + address-family ipv4 + redistribute connected route-map V4_CONNECTED_ROUTES + exit-address-family + address-family ipv6 + redistribute connected route-map V6_CONNECTED_ROUTES + exit-address-family +! +! end of template: bgpd/bgpd.main.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/multi_asic_upper_t2.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/multi_asic_upper_t2.json new file mode 100644 index 0000000000..29c336815e --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/multi_asic_upper_t2.json @@ -0,0 +1,26 @@ +{ + "DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "sub_role": "FrontEnd", + "type": "UpperSpineRouter" + } + }, + "BGP_DEVICE_GLOBAL": { + "CONFED" : { + "asn": "65000", + "peers": "65001" + } + }, + "LOOPBACK_INTERFACE": { + "Loopback0|55.55.55.55/32": {}, + "Loopback1|fc00::1/128": {} + }, + "constants": { + "bgp": { + "multipath_relax": {}, + "graceful_restart": {}, + "maximum_paths": {} + } + } +} \ No newline at end of file diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_ft2.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_ft2.conf new file mode 100644 index 0000000000..1e59f2c402 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_ft2.conf @@ -0,0 +1,26 @@ +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 55.55.55.55/32 +! +router bgp 65001 +! + bgp confederation identifier 65000 + bgp confederation peers 65001 + bgp log-neighbor-changes + bgp suppress-fib-pending + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp router-id 55.55.55.55 +! + network 55.55.55.55/32 +! +! end of template: bgpd/bgpd.main.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_ft2.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_ft2.json new file mode 100644 index 0000000000..19165299aa --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_ft2.json @@ -0,0 +1,25 @@ +{ + "DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "type": "FabricSpineRouter" + } + }, + "BGP_DEVICE_GLOBAL": { + "CONFED" : { + "asn": "65000", + "peers": "65001" + } + }, + "LOOPBACK_INTERFACE": { + "Loopback0|55.55.55.55/32": {}, + "Loopback1|fc00::1/128": {} + }, + "constants": { + "bgp": { + "multipath_relax": {}, + "graceful_restart": {}, + "maximum_paths": {} + } + } +} \ No newline at end of file diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_lt2.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_lt2.conf new file mode 100644 index 0000000000..4d5ddcda7a --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_lt2.conf @@ -0,0 +1,26 @@ +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 55.55.55.55/32 +! +router bgp 65001 +! + bgp confederation identifier 65000 + bgp confederation peers 65001 65002 + bgp log-neighbor-changes + bgp suppress-fib-pending + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp router-id 55.55.55.55 +! + network 55.55.55.55/32 +! +! end of template: bgpd/bgpd.main.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_lt2.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_lt2.json new file mode 100644 index 0000000000..f84468288d --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_lt2.json @@ -0,0 +1,25 @@ +{ + "DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "type": "LowerSpineRouter" + } + }, + "BGP_DEVICE_GLOBAL": { + "CONFED" : { + "asn": "65000", + "peers": "65001;65002" + } + }, + "LOOPBACK_INTERFACE": { + "Loopback0|55.55.55.55/32": {}, + "Loopback1|fc00::1/128": {} + }, + "constants": { + "bgp": { + "multipath_relax": {}, + "graceful_restart": {}, + "maximum_paths": {} + } + } +} \ No newline at end of file diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_upper_t2.conf b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_upper_t2.conf new file mode 100644 index 0000000000..1e59f2c402 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_upper_t2.conf @@ -0,0 +1,26 @@ +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 55.55.55.55/32 +! +router bgp 65001 +! + bgp confederation identifier 65000 + bgp confederation peers 65001 + bgp log-neighbor-changes + bgp suppress-fib-pending + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp router-id 55.55.55.55 +! + network 55.55.55.55/32 +! +! end of template: bgpd/bgpd.main.conf.j2 +! diff --git a/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_upper_t2.json b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_upper_t2.json new file mode 100644 index 0000000000..4b7678a222 --- /dev/null +++ b/src/sonic-bgpcfgd/tests/data/sonic-cfggen/bgpd.main.conf.j2/single_asic_upper_t2.json @@ -0,0 +1,25 @@ +{ + "DEVICE_METADATA": { + "localhost": { + "bgp_asn": "65001", + "type": "UpperSpineRouter" + } + }, + "BGP_DEVICE_GLOBAL": { + "CONFED" : { + "asn": "65000", + "peers": "65001" + } + }, + "LOOPBACK_INTERFACE": { + "Loopback0|55.55.55.55/32": {}, + "Loopback1|fc00::1/128": {} + }, + "constants": { + "bgp": { + "multipath_relax": {}, + "graceful_restart": {}, + "maximum_paths": {} + } + } +} \ No newline at end of file diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v4.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v4.conf index 1250552211..ef6664efcd 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v4.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v4.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER - neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 2 7 neighbor 10.10.10.10 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v6.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v6.conf index e6274e0533..37ef6ab450 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v6.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_all_v6.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER - neighbor fc00::01 remote-as 555 neighbor fc00::01 description internal1 neighbor fc00::01 timers 2 7 neighbor fc00::01 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v4.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v4.conf index 4d2f2c251e..1eb069e848 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v4.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v4.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER - neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 2 7 neighbor 10.10.10.10 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v6.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v6.conf index 375d000511..c76731ad63 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v6.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_base_v6.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER - neighbor fc00::01 remote-as 555 neighbor fc00::01 description internal1 neighbor fc00::01 timers 2 7 neighbor fc00::01 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_1.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_1.conf index 5181fad518..aae72eb80d 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_1.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_1.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER - neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 2 7 neighbor 10.10.10.10 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_2.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_2.conf index 4d2f2c251e..1eb069e848 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_2.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v4_2.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER - neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 2 7 neighbor 10.10.10.10 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_1.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_1.conf index 144a26ca48..ac48bb301b 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_1.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_1.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER - neighbor fc00::01 remote-as 555 neighbor fc00::01 description internal1 neighbor fc00::01 timers 2 7 neighbor fc00::01 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_2.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_2.conf index 375d000511..c76731ad63 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_2.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_shutdown_v6_2.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER - neighbor fc00::01 remote-as 555 neighbor fc00::01 description internal1 neighbor fc00::01 timers 2 7 neighbor fc00::01 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_1.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_1.conf index 4d2f2c251e..1eb069e848 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_1.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_1.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER - neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 2 7 neighbor 10.10.10.10 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_2.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_2.conf index 4d2f2c251e..1eb069e848 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_2.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v4_2.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor 10.10.10.10 peer-group VOQ_CHASSIS_V4_PEER - neighbor 10.10.10.10 remote-as 555 neighbor 10.10.10.10 description internal1 neighbor 10.10.10.10 timers 2 7 neighbor 10.10.10.10 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_1.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_1.conf index 375d000511..c76731ad63 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_1.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_1.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER - neighbor fc00::01 remote-as 555 neighbor fc00::01 description internal1 neighbor fc00::01 timers 2 7 neighbor fc00::01 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_2.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_2.conf index 375d000511..c76731ad63 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_2.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/instance.conf/result_timers_v6_2.conf @@ -5,7 +5,6 @@ bgp bestpath peer-type multipath-relax ! neighbor fc00::01 peer-group VOQ_CHASSIS_V6_PEER - neighbor fc00::01 remote-as 555 neighbor fc00::01 description internal1 neighbor fc00::01 timers 2 7 neighbor fc00::01 timers connect 10 diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/param_all.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/param_all.json index 293ccc7990..9358b5637d 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/param_all.json +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/param_all.json @@ -1,7 +1,8 @@ { "CONFIG_DB__DEVICE_METADATA": { "localhost": { - "type": "ToRRouter" + "type": "ToRRouter", + "bgp_asn": "66000" } } } \ No newline at end of file diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/param_base.json b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/param_base.json index 7ef21c181d..76c01109c3 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/param_base.json +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/param_base.json @@ -1,5 +1,7 @@ { "CONFIG_DB__DEVICE_METADATA": { - "localhost": {} + "localhost": { + "bgp_asn": "66000" + } } } diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_all.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_all.conf index 350ff0eeeb..bcd0534ff4 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_all.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_all.conf @@ -2,7 +2,9 @@ ! template: bgpd/templates/voq_chassis/peer-group.conf.j2 ! neighbor VOQ_CHASSIS_V4_PEER peer-group + neighbor VOQ_CHASSIS_V4_PEER remote-as 66000 neighbor VOQ_CHASSIS_V6_PEER peer-group + neighbor VOQ_CHASSIS_V6_PEER remote-as 66000 address-family ipv4 neighbor VOQ_CHASSIS_V4_PEER allowas-in 1 neighbor VOQ_CHASSIS_V4_PEER activate diff --git a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_base.conf b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_base.conf index 9818358a77..9b9fa8f0f8 100644 --- a/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_base.conf +++ b/src/sonic-bgpcfgd/tests/data/voq_chassis/peer-group.conf/result_base.conf @@ -2,7 +2,9 @@ ! template: bgpd/templates/voq_chassis/peer-group.conf.j2 ! neighbor VOQ_CHASSIS_V4_PEER peer-group + neighbor VOQ_CHASSIS_V4_PEER remote-as 66000 neighbor VOQ_CHASSIS_V6_PEER peer-group + neighbor VOQ_CHASSIS_V6_PEER remote-as 66000 address-family ipv4 neighbor VOQ_CHASSIS_V4_PEER activate neighbor VOQ_CHASSIS_V4_PEER addpath-tx-all-paths diff --git a/src/sonic-bgpcfgd/tests/test_sonic-cfggen.py b/src/sonic-bgpcfgd/tests/test_sonic-cfggen.py index 908c4d802e..4ddf517069 100644 --- a/src/sonic-bgpcfgd/tests/test_sonic-cfggen.py +++ b/src/sonic-bgpcfgd/tests/test_sonic-cfggen.py @@ -206,3 +206,39 @@ def test_bgpd_main_conf_defaults_router_id(): "bgpd/bgpd.main.conf.j2", "bgpd.main.conf.j2/defaults_router_id.json", "bgpd.main.conf.j2/defaults_router_id.conf") + +def test_prefix_list_add_radian(): + run_test("Add radian configuration", + "bgpd/radian/add_radian.conf.j2", + "radian/add_radian.json", + "radian/add_radian.conf") + +def test_prefix_list_del_radian(): + run_test("Del radian configuration", + "bgpd/radian/del_radian.conf.j2", + "radian/del_radian.json", + "radian/del_radian.conf") + +def test_bgp_confed_ut2_multi_asic(): + run_test("BGP Confederation Upper T2 Multi-ASIC", + "bgpd/bgpd.main.conf.j2", + "bgpd.main.conf.j2/multi_asic_upper_t2.json", + "bgpd.main.conf.j2/multi_asic_upper_t2.conf") + +def test_bgp_confed_ut2_single_asic(): + run_test("BGP Confederation Upper T2 Single-ASIC", + "bgpd/bgpd.main.conf.j2", + "bgpd.main.conf.j2/single_asic_upper_t2.json", + "bgpd.main.conf.j2/single_asic_upper_t2.conf") + +def test_bgp_confed_lt2_single_asic(): + run_test("BGP Confederation Lower T2 Single-ASIC", + "bgpd/bgpd.main.conf.j2", + "bgpd.main.conf.j2/single_asic_lt2.json", + "bgpd.main.conf.j2/single_asic_lt2.conf") + +def test_bgp_confed_ft2_single_asic(): + run_test("BGP Confederation Fabric T2 Single-ASIC", + "bgpd/bgpd.main.conf.j2", + "bgpd.main.conf.j2/single_asic_ft2.json", + "bgpd.main.conf.j2/single_asic_ft2.conf") diff --git a/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed.conf b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed.conf new file mode 100644 index 0000000000..0959bc9e25 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed.conf @@ -0,0 +1,76 @@ +! +! template: bgpd/bgpd.conf.j2 +! +! +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 with config DB data +! file: bgpd.conf +! +! +! template: common/daemons.common.conf.j2 +! +hostname switch-t0 +password zebra +enable password zebra +! +log syslog informational +log facility local4 +! +! end of template: common/daemons.common.conf.j2! +! +! +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 10.1.0.32/32 +! +ipv6 prefix-list PL_LoopbackV6 permit fc00:1::/64 +! +ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 5 permit 192.168.0.0/27 +! +ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.200.0/27 +! +! +! +router bgp 65100 +! + bgp confederation identifier 65000 + bgp confederation peers 65001 + bgp log-neighbor-changes + bgp suppress-fib-pending + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp bestpath as-path multipath-relax +! +! + bgp router-id 10.1.0.32 +! + network 10.1.0.32/32 +! + address-family ipv6 + network fc00:1::32/64 + exit-address-family +! + network 192.168.0.1/27 + network 192.168.200.1/27 +! +! +! + address-family ipv4 + maximum-paths 514 + exit-address-family + address-family ipv6 + maximum-paths 514 + exit-address-family +! +! end of template: bgpd/bgpd.main.conf.j2 +!! +! end of template: bgpd/bgpd.conf.j2 +! diff --git a/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed_lt2.conf b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed_lt2.conf new file mode 100644 index 0000000000..82f578f6fa --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed_lt2.conf @@ -0,0 +1,76 @@ +! +! template: bgpd/bgpd.conf.j2 +! +! +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 with config DB data +! file: bgpd.conf +! +! +! template: common/daemons.common.conf.j2 +! +hostname switch-t0 +password zebra +enable password zebra +! +log syslog informational +log facility local4 +! +! end of template: common/daemons.common.conf.j2! +! +! +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 10.1.0.32/32 +! +ipv6 prefix-list PL_LoopbackV6 permit fc00:1::/64 +! +ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 5 permit 192.168.0.0/27 +! +ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.200.0/27 +! +! +! +router bgp 65100 +! + bgp confederation identifier 65000 + bgp confederation peers 65001 65002 + bgp log-neighbor-changes + bgp suppress-fib-pending + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp bestpath as-path multipath-relax +! +! + bgp router-id 10.1.0.32 +! + network 10.1.0.32/32 +! + address-family ipv6 + network fc00:1::32/64 + exit-address-family +! + network 192.168.0.1/27 + network 192.168.200.1/27 +! +! +! + address-family ipv4 + maximum-paths 514 + exit-address-family + address-family ipv6 + maximum-paths 514 + exit-address-family +! +! end of template: bgpd/bgpd.main.conf.j2 +!! +! end of template: bgpd/bgpd.conf.j2 +! diff --git a/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed_masic.conf b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed_masic.conf new file mode 100644 index 0000000000..82f578f6fa --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/py3/bgpd_frr_confed_masic.conf @@ -0,0 +1,76 @@ +! +! template: bgpd/bgpd.conf.j2 +! +! +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 with config DB data +! file: bgpd.conf +! +! +! template: common/daemons.common.conf.j2 +! +hostname switch-t0 +password zebra +enable password zebra +! +log syslog informational +log facility local4 +! +! end of template: common/daemons.common.conf.j2! +! +! +! +! template: bgpd/bgpd.main.conf.j2 +! +! bgp multiple-instance +! +! BGP configuration +! +! TSA configuration +! +ip prefix-list PL_LoopbackV4 permit 10.1.0.32/32 +! +ipv6 prefix-list PL_LoopbackV6 permit fc00:1::/64 +! +ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 5 permit 192.168.0.0/27 +! +ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.200.0/27 +! +! +! +router bgp 65100 +! + bgp confederation identifier 65000 + bgp confederation peers 65001 65002 + bgp log-neighbor-changes + bgp suppress-fib-pending + no bgp default ipv4-unicast + no bgp ebgp-requires-policy +! + bgp bestpath as-path multipath-relax +! +! + bgp router-id 10.1.0.32 +! + network 10.1.0.32/32 +! + address-family ipv6 + network fc00:1::32/64 + exit-address-family +! + network 192.168.0.1/27 + network 192.168.200.1/27 +! +! +! + address-family ipv4 + maximum-paths 514 + exit-address-family + address-family ipv6 + maximum-paths 514 + exit-address-family +! +! end of template: bgpd/bgpd.main.conf.j2 +!! +! end of template: bgpd/bgpd.conf.j2 +! diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index e0547d8330..d6ac249a65 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -492,6 +492,21 @@ The IDF isolation state **idf_isolation_state** could be one of isolated_no_expo } ``` +The **CONFED** object contains BGP confederation configuration for disaggregated T2 devices (LowerSpineRouter, UpperSpineRouter, FabricSpineRouter). +**asn** is the confederation identifier (the ASN visible to external peers). +**peers** is a semicolon-separated list of sub-AS numbers that are members of the confederation. + +```json +{ +"BGP_DEVICE_GLOBAL": { + "CONFED": { + "asn": 65100, + "peers": "66000;63000" + } +} +} +``` + ### BGP Sessions BGP session configuration is defined in **BGP_NEIGHBOR** table. BGP diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_device_global.json b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_device_global.json index b9cc07ed54..f5ebfb9870 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_device_global.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/bgp_device_global.json @@ -73,5 +73,13 @@ "desc": "Load bgp device global table with idf_isolation_state set to invalid value", "eStrKey": "InvalidValue", "eStr": ["idf_isolation_state"] + }, + "BGP_DEVICE_GLOBAL_CONFED" : { + "desc": "Load bgp device global table with confederation asn and peers" + }, + "BGP_DEVICE_GLOBAL_CONFED_INVALID_ASN" : { + "desc": "Load bgp device global table with confederation invalid asn", + "eStrKey": "InvalidValue", + "eStr": ["asn"] } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_device_global.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_device_global.json index f1be80b6b4..d21c2baa1d 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_device_global.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/bgp_device_global.json @@ -112,5 +112,25 @@ } } } + }, + "BGP_DEVICE_GLOBAL_CONFED": { + "sonic-bgp-device-global:sonic-bgp-device-global": { + "sonic-bgp-device-global:BGP_DEVICE_GLOBAL": { + "CONFED": { + "asn": 65100, + "peers": "66000;63000" + } + } + } + }, + "BGP_DEVICE_GLOBAL_CONFED_INVALID_ASN": { + "sonic-bgp-device-global:sonic-bgp-device-global": { + "sonic-bgp-device-global:BGP_DEVICE_GLOBAL": { + "CONFED": { + "asn": "abc", + "peers": "66000;63000" + } + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-bgp-device-global.yang b/src/sonic-yang-models/yang-models/sonic-bgp-device-global.yang index 447b89f10e..7931dc464f 100644 --- a/src/sonic-yang-models/yang-models/sonic-bgp-device-global.yang +++ b/src/sonic-yang-models/yang-models/sonic-bgp-device-global.yang @@ -61,6 +61,25 @@ module sonic-bgp-device-global { } /* end of STATE container */ + /* start of CONFED container */ + container CONFED + { + description "BGP Confederation related configuration"; + + leaf asn { + type uint32 { + range "1..4294967295"; + } + description "Autonomous System Number for BGP confederation"; + } + + /* List of peer ASN part of the confederation */ + leaf peers { + type string; + description "List of sub-ASNs in the confederation separated by semi-colon"; + } + } + /* end of CONFED container */ } /* end of BGP_DEVICE_GLOBAL container */ }