1010vrf_{{ vname }}_{{ af }}
1111{% - endmacro %}
1212
13- {#
14- # rt_value: Return a BIRD extended community route-target tuple from a netlab RT string.
15- #}
16- {% macro rt_value (rt ) -%}
17- (rt, {{ rt.split(':')[0] }}, {{ rt.split(':')[1] }})
18- {% - endmacro %}
19-
2013{#
2114 # tag_vrf_route: Tag an imported VRF route with all export route targets configured on the VRF.
2215 #}
2316{% macro tag_vrf_route (vdata ) %}
2417 netlab_vrf_rt.empty;
25- {% for rt in vdata .export |default ([]) %}
26- netlab_vrf_rt.add({{ rt_value(rt) }});
18+ {% for rt in vdata ._bird_export |default ([]) %}
19+ netlab_vrf_rt.add({{ rt }});
2720{% endfor %}
2821 accept;
2922{% endmacro -%}
3023
3124attribute eclist netlab_vrf_rt;
25+ attribute string netlab_vrf_name;
26+
3227{% for vname ,vdata in vrfs |default ({})|dictsort %}
3328
3429#
@@ -38,14 +33,21 @@ attribute eclist netlab_vrf_rt;
3833{{ _af }} table {{ vrf_table(vname,_af) }};
3934{% endfor %}
4035
36+ filter vrf_{{ vname }}_tag {
37+ netlab_vrf_name = "{{ vname }}";
38+ netlab_vrf_rt.empty;
39+ {% for rt in vdata ._bird_export |default ([]) %}
40+ netlab_vrf_rt.add({{ rt }});
41+ {% endfor %}
42+ accept;
43+ }
44+
4145{% for _af in ['ipv4' ,'ipv6' ] if _af in vdata .af %}
4246protocol direct direct_vrf_{{ vname }}_{{ _af }} {
4347 vrf "{{ vname }}";
4448 {{ _af }} {
4549 table {{ vrf_table(vname,_af) }};
46- import filter {
47- {{ tag_vrf_route(vdata) }}
48- };
50+ import filter vrf_{{ vname }}_tag;
4951 };
5052}
5153
@@ -56,9 +58,7 @@ protocol kernel kernel_vrf_{{ vname }}_{{ _af }} {
5658 {{ _af }} {
5759 table {{ vrf_table(vname,_af) }};
5860 export all;
59- import filter {
60- {{ tag_vrf_route(vdata) }}
61- };
61+ import filter vrf_{{ vname }}_tag;
6262 };
6363}
6464{% endfor %}
@@ -69,9 +69,7 @@ protocol kernel kernel_vrf_{{ vname }}_{{ _af }} {
6969protocol static static_vrf_{{ vname }}_{{ sr_af }} {
7070 {{ sr_af }} {
7171 table {{ vrf_table(vname,sr_af) }};
72- import filter {
73- {{ tag_vrf_route(vdata) }}
74- };
72+ import filter vrf_{{ vname }}_tag;
7573 };
7674 check link;
7775{% endif %}
@@ -122,16 +120,15 @@ protocol static static_vrf_leak_{{ vname }}_{{ dst_name }}_{{ sr_af }} {
122120{# Route leaking between VRF tables based on transformed import/export route targets #}
123121{% for src_name ,src_data in vrfs |default ({})|dictsort %}
124122{% for dst_name ,dst_data in vrfs |default ({})|dictsort if dst_name != src_name %}
125- {% set import_rt = dst_data .import |default ([])|select ('in' ,src_data .export |default ([]))|list %}
123+ {% set import_rt = dst_data ._bird_import |default ([])|select ('in' ,src_data ._bird_export |default ([]))|list %}
126124{% if import_rt %}
127- {% set bird_import_rt = import_rt |map ('replace' ,':' ,', ' )|join ('), (rt, ' ) %}
128125{% for _af in src_data .af if _af in dst_data .af %}
129126
130127protocol pipe pipe_vrf_{{ src_name }}_{{ dst_name }}_{{ _af }} {
131128 table {{ vrf_table(dst_name,_af) }};
132129 peer table {{ vrf_table(src_name,_af) }};
133130 import filter {
134- if netlab_vrf_rt ~ [ (rt, {{ bird_import_rt }}) ] then accept;
131+ if netlab_vrf_rt ~ [ {{ import_rt|join(',') }} ] then accept;
135132 reject;
136133 };
137134 export none;
0 commit comments