On 1/22/25 11:42 AM, Felix Huettner via dev wrote:
> On Tue, Jan 21, 2025 at 04:47:40PM +0100, Felix Huettner via dev wrote:
>> This allows the ovn-controller to later find all ports that
>> participate in dynamic routing.
>>
>> Signed-off-by: Felix Huettner <[email protected]>
>> ---
>> v2->v3:
>> * A lot of minor review comments.
>> * Added more documentation and news
>>
>> NEWS | 8 ++++++++
>> northd/northd.c | 21 +++++++++++++++++++++
>> ovn-nb.xml | 42 ++++++++++++++++++++++++++++++++++++++++++
>> tests/ovn-northd.at | 32 ++++++++++++++++++++++++++++++++
>> 4 files changed, 103 insertions(+)
>>
>> diff --git a/NEWS b/NEWS
>> index 289cdd7f7..14390a564 100644
>> --- a/NEWS
>> +++ b/NEWS
>> @@ -43,6 +43,14 @@ Post v24.09.0
>> * Add the option "dynamic-routing-connected-as-host-routes" to LRPs. If
>> set to true then connected routes are announced as individual host
>> routes.
>> + * Add the option "dynamic-routing-maintain-vrf" to LRPs. If set the
>> + ovn-controller will create a vrf named "ovnvrf" + datapath id that
>> + includes all advertised and learned routes.
>> + The vrf name can be overwritten with the "dynamic-routing-vrf-name"
>> + setting.
>> + * Add the option "dynamic-routing-ifname" to LRPs. If set only routes
>> + learned from a linux iterfaces with that name are treated as relevant
>> + routes for this LRP.
>>
>> OVN v24.09.0 - 13 Sep 2024
>> --------------------------
>> diff --git a/northd/northd.c b/northd/northd.c
>> index c80049bfd..4d08cf850 100644
>> --- a/northd/northd.c
>> +++ b/northd/northd.c
>> @@ -4065,6 +4065,27 @@ sync_pb_for_lrp(struct ovn_port *op,
>> }
>> }
>>
>> + if (is_cr_port(op) || chassis_name) {
>> + if (op->od->dynamic_routing) {
>> + smap_add(&new, "dynamic-routing", "true");
>> + if (smap_get_bool(&op->nbrp->options,
>> + "dynamic-routing-maintain-vrf", false)) {
>> + smap_add(&new, "dynamic-routing-maintain-vrf", "true");
>> + }
>> + const char *vrfname = smap_get(&op->nbrp->options,
>> + "dynamic-routing-vrf-name");
>> + if (vrfname) {
>> + smap_add(&new, "dynamic-routing-vrf-name", vrfname);
>> + }
>> + const char *ifname = smap_get(&op->nbrp->options,
>> + "dynamic-routing-ifname");
>> + if (ifname) {
>> + smap_add(&new, "dynamic-routing-ifname", ifname);
>> + }
>> + }
>> + }
>> +
>> +
>> const char *ipv6_pd_list = smap_get(&op->sb->options,
>> "ipv6_ra_pd_list");
>> if (ipv6_pd_list) {
>> smap_add(&new, "ipv6_ra_pd_list", ipv6_pd_list);
>> diff --git a/ovn-nb.xml b/ovn-nb.xml
>> index 4d4105a21..793a4f6bc 100644
>> --- a/ovn-nb.xml
>> +++ b/ovn-nb.xml
>> @@ -3777,6 +3777,48 @@ or
>> </li>
>> </ul>
>> </column>
>> +
>> + <column name="options" key="dynamic-routing-maintain-vrf"
>> + type='{"type": "boolean"}'>
>> + Only relevant if <ref column="options" key="dynamic-routing"
>> + table="Logical_Router"/> on the respective Logical_Router is set
>> + to <code>true</code>.
>> +
>> + If this LRP is bound to a specific chassis then the ovn-controller
>> of
>> + this chassis will maintain a vrf.
>> + This vrf will contain all the routes that should be announced from
>> + this LRP.
>> + Unless <ref column="options" key="dynamic-routing-vrf-name"/> is set
>> + the vrf will be named "ovnvrf" with the datapath id of the Logical
>> + Router appended to it.
>> + </column>
>> +
>> + <column name="options" key="dynamic-routing-vrf-name"
>> + type='{"type": "string"}'>
>> + Only relevant if <ref column="options" key="dynamic-routing"
>> + table="Logical_Router"/> on the respective Logical_Router is set
>> + to <code>true</code>.
>> +
>> + This defines the name of the vrf the ovn-controller will use to
>> + advertise and learn routes. If not set the vrf will be named
>> "ovnvrf"
>> + with the datapath id of the Logical Router appended to it.
>> + </column>
>
> Hi everyone,
>
Hi Felix,
> Just wanted to share that i am currently thinking about if this should
> rather be a setting on the Logical_Router. Otherwise a chassis with
> multiple LRPs bound locally might have different vrfs for the same
> datapath.
>
> What are your opinions?
>
If I understand correctly, with the current implementation, if
dynamic-routing-vrf-name is _not_ set then we anyway program routes in a
single VRF for all LRPs (vrf name will be "ovnvrf-<datapath-id>").
In my opinion it makes sense that the dynamic-routing-vrf-name is
configured for the whole router.
Regards,
Dumitru
> Thanks a lot
> Felix
>
>> +
>> + <column name="options" key="dynamic-routing-ifname"
>> + type='{"type": "string"}'>
>> + Only relevant if <ref column="options" key="dynamic-routing"
>> + table="Logical_Router"/> on the respective Logical_Router is set
>> + to <code>true</code>.
>> +
>> + Only learn routes associated with the interface specified here.
>> + This allows a single chassis to learn different routes on separate
>> + LRPs bound to this chassis.
>> +
>> + This is usefully e.g. in the case of a chassis with multiple links
>> + towards the network fabric where all of them run BGP individually.
>> + This option allows to have a 1:1 mapping between a single LRP and an
>> + individual link.
>> + </column>
>> </group>
>>
>> <group title="Attachment">
>> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
>> index fa664599a..e949eef6e 100644
>> --- a/tests/ovn-northd.at
>> +++ b/tests/ovn-northd.at
>> @@ -14741,6 +14741,38 @@ check_row_count Advertised_Route 1
>> datapath=$datapath logical_port=$sw0 ip_prefi
>> AT_CLEANUP
>> ])
>>
>> +OVN_FOR_EACH_NORTHD_NO_HV([
>> +AT_SETUP([dynamic-routing - lrp options])
>> +AT_KEYWORDS([dynamic-routing])
>> +ovn_start
>> +
>> +check ovn-nbctl lr-add lr0
>> +check ovn-nbctl set Logical_Router lr0 option:dynamic-routing=true \
>> + option:dynamic-routing-connected=true \
>> + option:dynamic-routing-static=true
>> +check ovn-nbctl lrp-add lr0 lr0-sw0 00:00:00:00:ff:01 10.0.0.1/24
>> +check ovn-nbctl set Logical_Router lr0 options:chassis=hv1
>> +check ovn-nbctl ls-add sw0
>> +check ovn-nbctl lsp-add sw0 sw0-lr0
>> +check ovn-nbctl --wait=sb set Logical_Switch_Port sw0-lr0 type=router
>> options:router-port=lr0-sw0
>> +
>> +AT_CHECK([fetch_column sb:Port_Binding options logical_port=lr0-sw0 |grep
>> -q 'dynamic-routing=true'])
>> +AT_CHECK([fetch_column sb:Port_Binding options logical_port=lr0-sw0 |grep
>> -qv 'dynamic-routing-maintain-vrf'])
>> +AT_CHECK([fetch_column sb:Port_Binding options logical_port=lr0-sw0 |grep
>> -qv 'dynamic-routing-vrf-name'])
>> +AT_CHECK([fetch_column sb:Port_Binding options logical_port=lr0-sw0 |grep
>> -qv 'dynamic-routing-ifname'])
>> +
>> +check ovn-nbctl --wait=sb set Logical_Router_Port lr0-sw0
>> options:dynamic-routing-maintain-vrf=true \
>> +
>> options:dynamic-routing-vrf-name=myvrf \
>> +
>> options:dynamic-routing-ifname=myif
>> +
>> +AT_CHECK([fetch_column sb:Port_Binding options logical_port=lr0-sw0 |grep
>> -q 'dynamic-routing=true'])
>> +AT_CHECK([fetch_column sb:Port_Binding options logical_port=lr0-sw0 |grep
>> -q 'dynamic-routing-maintain-vrf=true'])
>> +AT_CHECK([fetch_column sb:Port_Binding options logical_port=lr0-sw0 |grep
>> -q 'dynamic-routing-vrf-name=myvrf'])
>> +AT_CHECK([fetch_column sb:Port_Binding options logical_port=lr0-sw0 |grep
>> -q 'dynamic-routing-ifname=myif'])
>> +
>> +AT_CLEANUP
>> +])
>> +
>>
>> OVN_FOR_EACH_NORTHD_NO_HV([
>> AT_SETUP([dynamic-routing incremental processing])
>> --
>> 2.47.1
>>
>>
>> _______________________________________________
>> dev mailing list
>> [email protected]
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev