From e5384b2a024e54fb7873c66abdabc4881baffa66 Mon Sep 17 00:00:00 2001 From: Jeroen van Bemmel Date: Wed, 24 Jun 2026 14:05:39 -0500 Subject: [PATCH 1/6] Fix: Originate BIRD default routes in VRF BGP Co-authored-by: Cursor --- netsim/daemons/bird/bgp.macros.j2 | 12 +++++++++--- netsim/daemons/bird/vrf-daemon.j2 | 5 ++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/netsim/daemons/bird/bgp.macros.j2 b/netsim/daemons/bird/bgp.macros.j2 index 598446f079..b26f48b01e 100644 --- a/netsim/daemons/bird/bgp.macros.j2 +++ b/netsim/daemons/bird/bgp.macros.j2 @@ -19,12 +19,18 @@ {# # bgp_default_originate_routes: Render reject static routes used to originate default routes toward selected BGP neighbors. #} -{% macro bgp_default_originate_routes(bgp_data) %} +{% macro bgp_default_originate_routes(bgp_data,proto_suffix='',table_name='',af_list=['ipv4','ipv6']) %} {% for ngb in bgp_data.neighbors|default([]) if ngb.default_originate|default(False) %} {% if loop.first %} -{% for _af in ['ipv4','ipv6'] if _af in af %} -protocol static static_bgp_default_{{ _af }} { +{% for _af in af_list if _af in af %} +protocol static static_bgp_default{{ proto_suffix }}_{{ _af }} { +{% if table_name %} + {{ _af }} { + table {{ table_name }}; + }; +{% else %} {{ _af }}; +{% endif %} route {{ '0.0.0.0/0' if _af=='ipv4' else '::/0' }} reject; } {% endfor %} diff --git a/netsim/daemons/bird/vrf-daemon.j2 b/netsim/daemons/bird/vrf-daemon.j2 index fa865e4b3e..adee092b05 100644 --- a/netsim/daemons/bird/vrf-daemon.j2 +++ b/netsim/daemons/bird/vrf-daemon.j2 @@ -110,8 +110,11 @@ protocol static static_vrf_leak_{{ vname }}_{{ dst_name }}_{{ sr_af }} { {# VRF BGP configuration #} {% if vdata.bgp is defined %} +{% for _af in vdata.af %} +{{ bird_bgp.bgp_default_originate_routes(vdata.bgp,'_vrf_' + vname,vrf_table(vname,_af),[_af]) }} +{% endfor %} {{ bird_bgp.bgp_advertise_list('bgp_advertise_vrf_' + vname,vdata.bgp.advertise) }} -{{ bird_bgp.bgp_prefixes_function('bgp_prefixes_vrf_' + vname,vdata.bgp,'bgp_advertise_vrf_' + vname,vdata.bgp.import|default(['connected','ospf']),False) }} +{{ bird_bgp.bgp_prefixes_function('bgp_prefixes_vrf_' + vname,vdata.bgp,'bgp_advertise_vrf_' + vname,vdata.bgp.import|default(['connected','ospf']),True) }} {{ bird_bgp.bgp_export_filters('bgp_export_vrf_' + vname + '_','bgp_prefixes_vrf_' + vname) }} {% for n in vdata.bgp.neighbors|default([]) %} {{ bird_bgp.bgp_session(n,bgp,vname,vdata,netlab_interfaces) }} From 70ce5ca23097edc6523ca20787e5c2fc001aaf03 Mon Sep 17 00:00:00 2001 From: Jeroen van Bemmel Date: Wed, 24 Jun 2026 14:28:22 -0500 Subject: [PATCH 2/6] Cleanup: Use explicit AF for BIRD default originate Co-authored-by: Cursor --- netsim/daemons/bird/bgp.j2 | 4 +++- netsim/daemons/bird/bgp.macros.j2 | 14 +++++++------- netsim/daemons/bird/vrf-daemon.j2 | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/netsim/daemons/bird/bgp.j2 b/netsim/daemons/bird/bgp.j2 index b31ea75c2d..0fe02ae536 100644 --- a/netsim/daemons/bird/bgp.j2 +++ b/netsim/daemons/bird/bgp.j2 @@ -3,7 +3,9 @@ {% if 'router_id' in bgp %} router id {{ bgp.router_id }}; {% endif %} -{{ bgp_config.bgp_default_originate_routes(bgp) }} +{% for _af in ['ipv4','ipv6'] %} +{{ bgp_config.bgp_default_originate_routes(bgp,_af) }} +{% endfor %} {{ bgp_config.bgp_advertise_list('bgp_advertise',bgp.advertise) }} {{ bgp_config.bgp_prefixes_function('bgp_prefixes',bgp,'bgp_advertise',bgp.import|default([]),True) }} {{ bgp_config.bgp_export_filters('bgp_export_','bgp_prefixes') }} diff --git a/netsim/daemons/bird/bgp.macros.j2 b/netsim/daemons/bird/bgp.macros.j2 index b26f48b01e..40909e914a 100644 --- a/netsim/daemons/bird/bgp.macros.j2 +++ b/netsim/daemons/bird/bgp.macros.j2 @@ -19,21 +19,21 @@ {# # bgp_default_originate_routes: Render reject static routes used to originate default routes toward selected BGP neighbors. #} -{% macro bgp_default_originate_routes(bgp_data,proto_suffix='',table_name='',af_list=['ipv4','ipv6']) %} +{% macro bgp_default_originate_routes(bgp_data,bgp_af,proto_suffix='',table_name='') %} {% for ngb in bgp_data.neighbors|default([]) if ngb.default_originate|default(False) %} {% if loop.first %} -{% for _af in af_list if _af in af %} -protocol static static_bgp_default{{ proto_suffix }}_{{ _af }} { +{% if bgp_af in af %} +protocol static static_bgp_default{{ proto_suffix }}_{{ bgp_af }} { {% if table_name %} - {{ _af }} { + {{ bgp_af }} { table {{ table_name }}; }; {% else %} - {{ _af }}; + {{ bgp_af }}; {% endif %} - route {{ '0.0.0.0/0' if _af=='ipv4' else '::/0' }} reject; + route {{ '0.0.0.0/0' if bgp_af=='ipv4' else '::/0' }} reject; } -{% endfor %} +{% endif %} {% endif %} {% endfor %} {% endmacro %} diff --git a/netsim/daemons/bird/vrf-daemon.j2 b/netsim/daemons/bird/vrf-daemon.j2 index adee092b05..39749ca22b 100644 --- a/netsim/daemons/bird/vrf-daemon.j2 +++ b/netsim/daemons/bird/vrf-daemon.j2 @@ -111,7 +111,7 @@ protocol static static_vrf_leak_{{ vname }}_{{ dst_name }}_{{ sr_af }} { {# VRF BGP configuration #} {% if vdata.bgp is defined %} {% for _af in vdata.af %} -{{ bird_bgp.bgp_default_originate_routes(vdata.bgp,'_vrf_' + vname,vrf_table(vname,_af),[_af]) }} +{{ bird_bgp.bgp_default_originate_routes(vdata.bgp,_af,'_vrf_' + vname,vrf_table(vname,_af)) }} {% endfor %} {{ bird_bgp.bgp_advertise_list('bgp_advertise_vrf_' + vname,vdata.bgp.advertise) }} {{ bird_bgp.bgp_prefixes_function('bgp_prefixes_vrf_' + vname,vdata.bgp,'bgp_advertise_vrf_' + vname,vdata.bgp.import|default(['connected','ospf']),True) }} From f1139ee15c681663b631bba7dc5ba2847b21b711 Mon Sep 17 00:00:00 2001 From: Jeroen van Bemmel Date: Wed, 24 Jun 2026 14:35:45 -0500 Subject: [PATCH 3/6] Cleanup: Let BIRD BGP callers select default AF Co-authored-by: Cursor --- netsim/daemons/bird/bgp.j2 | 2 +- netsim/daemons/bird/bgp.macros.j2 | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/netsim/daemons/bird/bgp.j2 b/netsim/daemons/bird/bgp.j2 index 0fe02ae536..9ea4b6c304 100644 --- a/netsim/daemons/bird/bgp.j2 +++ b/netsim/daemons/bird/bgp.j2 @@ -3,7 +3,7 @@ {% if 'router_id' in bgp %} router id {{ bgp.router_id }}; {% endif %} -{% for _af in ['ipv4','ipv6'] %} +{% for _af in af %} {{ bgp_config.bgp_default_originate_routes(bgp,_af) }} {% endfor %} {{ bgp_config.bgp_advertise_list('bgp_advertise',bgp.advertise) }} diff --git a/netsim/daemons/bird/bgp.macros.j2 b/netsim/daemons/bird/bgp.macros.j2 index 40909e914a..453e4982c4 100644 --- a/netsim/daemons/bird/bgp.macros.j2 +++ b/netsim/daemons/bird/bgp.macros.j2 @@ -22,7 +22,6 @@ {% macro bgp_default_originate_routes(bgp_data,bgp_af,proto_suffix='',table_name='') %} {% for ngb in bgp_data.neighbors|default([]) if ngb.default_originate|default(False) %} {% if loop.first %} -{% if bgp_af in af %} protocol static static_bgp_default{{ proto_suffix }}_{{ bgp_af }} { {% if table_name %} {{ bgp_af }} { @@ -33,7 +32,6 @@ protocol static static_bgp_default{{ proto_suffix }}_{{ bgp_af }} { {% endif %} route {{ '0.0.0.0/0' if bgp_af=='ipv4' else '::/0' }} reject; } -{% endif %} {% endif %} {% endfor %} {% endmacro %} From f1e33105cd1918f064562db16e8ffb48f09c6f18 Mon Sep 17 00:00:00 2001 From: Jeroen van Bemmel Date: Wed, 24 Jun 2026 14:46:35 -0500 Subject: [PATCH 4/6] Fix: Limit BIRD default originate to unicast AF Co-authored-by: Cursor --- netsim/daemons/bird/bgp.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netsim/daemons/bird/bgp.j2 b/netsim/daemons/bird/bgp.j2 index 9ea4b6c304..3fe588046b 100644 --- a/netsim/daemons/bird/bgp.j2 +++ b/netsim/daemons/bird/bgp.j2 @@ -3,7 +3,7 @@ {% if 'router_id' in bgp %} router id {{ bgp.router_id }}; {% endif %} -{% for _af in af %} +{% for _af in af if _af in ['ipv4','ipv6'] %} {{ bgp_config.bgp_default_originate_routes(bgp,_af) }} {% endfor %} {{ bgp_config.bgp_advertise_list('bgp_advertise',bgp.advertise) }} From c93aafeac807d1e4d0e5eb2dd9ae6adbc5231356 Mon Sep 17 00:00:00 2001 From: Jeroen van Bemmel Date: Wed, 24 Jun 2026 14:47:06 -0500 Subject: [PATCH 5/6] Cleanup: Align BIRD default originate call Co-authored-by: Cursor --- netsim/daemons/bird/bgp.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netsim/daemons/bird/bgp.j2 b/netsim/daemons/bird/bgp.j2 index 3fe588046b..6e3175acdd 100644 --- a/netsim/daemons/bird/bgp.j2 +++ b/netsim/daemons/bird/bgp.j2 @@ -4,7 +4,7 @@ router id {{ bgp.router_id }}; {% endif %} {% for _af in af if _af in ['ipv4','ipv6'] %} -{{ bgp_config.bgp_default_originate_routes(bgp,_af) }} +{{ bgp_config.bgp_default_originate_routes(bgp,_af) }} {% endfor %} {{ bgp_config.bgp_advertise_list('bgp_advertise',bgp.advertise) }} {{ bgp_config.bgp_prefixes_function('bgp_prefixes',bgp,'bgp_advertise',bgp.import|default([]),True) }} From 7368779f819adfa87274e7b78872655d4aea3e57 Mon Sep 17 00:00:00 2001 From: Jeroen van Bemmel Date: Wed, 24 Jun 2026 14:49:00 -0500 Subject: [PATCH 6/6] Cleanup: Iterate BIRD default originate over unicast AFs Co-authored-by: Cursor --- netsim/daemons/bird/bgp.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netsim/daemons/bird/bgp.j2 b/netsim/daemons/bird/bgp.j2 index 6e3175acdd..8578e097f5 100644 --- a/netsim/daemons/bird/bgp.j2 +++ b/netsim/daemons/bird/bgp.j2 @@ -3,7 +3,7 @@ {% if 'router_id' in bgp %} router id {{ bgp.router_id }}; {% endif %} -{% for _af in af if _af in ['ipv4','ipv6'] %} +{% for _af in ['ipv4','ipv6'] if _af in af %} {{ bgp_config.bgp_default_originate_routes(bgp,_af) }} {% endfor %} {{ bgp_config.bgp_advertise_list('bgp_advertise',bgp.advertise) }}