Merge pull request #14635 from opensourcerouting/fix/ospf6d_loopback_cost

ospf6d: Set loopback interface cost to 0
This commit is contained in:
mobash-rasool 2023-10-30 09:49:58 +05:30 committed by GitHub
commit ed0cfbecc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 182 additions and 51 deletions

View File

@ -128,9 +128,19 @@ static uint8_t ospf6_default_iftype(struct interface *ifp)
static uint32_t ospf6_interface_get_cost(struct ospf6_interface *oi)
{
/* If all else fails, use default OSPF cost */
uint32_t cost;
uint32_t cost = 0;
uint32_t bw, refbw;
struct ospf6 *ospf6;
/* If the interface type is point-to-multipoint or the interface
* is in the state Loopback, the global scope IPv6 addresses
* associated with the interface (if any) are copied into the
* intra-area-prefix-LSA with the PrefixOptions LA-bit set, the
* PrefixLength set to 128, and the metric set to 0.
*/
if (if_is_loopback(oi->interface))
return cost;
/* interface speed and bw can be 0 in some platforms,
* use ospf default bw. If bw is configured then it would
* be used.

View File

@ -144,7 +144,7 @@ def test_bgp_vpn_5549():
"2001:db8:1::1": {
"valid": True,
"complete": True,
"igpMetric": 20,
"igpMetric": 10,
"pathCount": 2,
"peer": "2001:db8:1::1",
"nexthops": [{"interfaceName": "pe2-eth0"}],

View File

@ -6,7 +6,7 @@
"vrfId":0,
"vrfName":"default",
"distance":110,
"metric":10,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
@ -25,7 +25,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -45,7 +45,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -65,7 +65,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -85,7 +85,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":50,
"metric":40,
"installed":true,
"nexthops":[
{
@ -105,7 +105,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -125,7 +125,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":50,
"metric":40,
"installed":true,
"nexthops":[
{

View File

@ -8,7 +8,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -26,7 +26,7 @@
"vrfId":0,
"vrfName":"default",
"distance":110,
"metric":10,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
@ -45,7 +45,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -65,7 +65,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -85,7 +85,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -105,7 +105,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -125,7 +125,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{

View File

@ -8,7 +8,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -28,7 +28,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -46,7 +46,7 @@
"vrfId":0,
"vrfName":"default",
"distance":110,
"metric":10,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
@ -65,7 +65,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -85,7 +85,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -105,7 +105,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -125,7 +125,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{

View File

@ -8,7 +8,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -28,7 +28,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -48,7 +48,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -66,7 +66,7 @@
"vrfId":0,
"vrfName":"default",
"distance":110,
"metric":10,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
@ -85,7 +85,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -105,7 +105,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -125,7 +125,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{

View File

@ -8,7 +8,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":50,
"metric":40,
"installed":true,
"nexthops":[
{
@ -28,7 +28,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -48,7 +48,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -68,7 +68,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -86,7 +86,7 @@
"vrfId":0,
"vrfName":"default",
"distance":110,
"metric":10,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
@ -105,7 +105,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -125,7 +125,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":50,
"metric":40,
"installed":true,
"nexthops":[
{

View File

@ -8,7 +8,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -28,7 +28,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -48,7 +48,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -68,7 +68,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -88,7 +88,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -106,7 +106,7 @@
"vrfId":0,
"vrfName":"default",
"distance":110,
"metric":10,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
@ -125,7 +125,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{

View File

@ -8,7 +8,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":50,
"metric":40,
"installed":true,
"nexthops":[
{
@ -28,7 +28,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -48,7 +48,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"metric":20,
"installed":true,
"nexthops":[
{
@ -68,7 +68,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":40,
"metric":30,
"installed":true,
"nexthops":[
{
@ -88,7 +88,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":50,
"metric":40,
"installed":true,
"nexthops":[
{
@ -108,7 +108,7 @@
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"metric":10,
"installed":true,
"nexthops":[
{
@ -126,7 +126,7 @@
"vrfId":0,
"vrfName":"default",
"distance":110,
"metric":10,
"metric":0,
"nexthops":[
{
"directlyConnected":true,

View File

@ -0,0 +1,16 @@
!
int lo
ipv6 address 2001:db8::1/128
ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 passive
!
int r1-eth0
ipv6 address 2001:db8:1::1/64
ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 1
ipv6 ospf6 dead-interval 4
!
router ospf6
ospf6 router-id 0.0.0.1
exit
!

View File

@ -0,0 +1,16 @@
!
int lo
ipv6 address 2001:db8::2/128
ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 passive
!
int r2-eth0
ipv6 address 2001:db8:1::2/64
ipv6 ospf6 area 0.0.0.0
ipv6 ospf6 hello-interval 1
ipv6 ospf6 dead-interval 4
!
router ospf6
ospf6 router-id 0.0.0.2
exit
!

View File

@ -0,0 +1,89 @@
#!/usr/bin/env python
# SPDX-License-Identifier: ISC
# Copyright (c) 2023 by
# Donatas Abraitis <donatas@opensourcerouting.org>
#
"""
Test if OSPFv3 loopback interfaces get a cost of 0.
https://www.rfc-editor.org/rfc/rfc5340.html#page-37:
If the interface type is point-to-multipoint or the interface is
in the state Loopback, the global scope IPv6 addresses associated
with the interface (if any) are copied into the intra-area-prefix-LSA
with the PrefixOptions LA-bit set, the PrefixLength set to 128, and
the metric set to 0.
"""
import os
import sys
import json
import pytest
import functools
pytestmark = pytest.mark.ospf6d
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, "../"))
# pylint: disable=C0413
from lib import topotest
from lib.topogen import Topogen, TopoRouter, get_topogen
def setup_module(mod):
topodef = {"s1": ("r1", "r2")}
tgen = Topogen(topodef, mod.__name__)
tgen.start_topology()
router_list = tgen.routers()
for _, (rname, router) in enumerate(router_list.items(), 1):
router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
tgen.start_router()
def teardown_module(mod):
tgen = get_topogen()
tgen.stop_topology()
def test_ospf6_loopback_cost():
tgen = get_topogen()
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
r1 = tgen.gears["r1"]
def _show_ipv6_route():
output = json.loads(r1.vtysh_cmd("show ipv6 route json"))
expected = {
"2001:db8::1/128": [
{
"metric": 0,
"distance": 110,
}
],
"2001:db8::2/128": [
{
"metric": 10,
"distance": 110,
}
],
}
return topotest.json_cmp(output, expected)
test_func = functools.partial(
_show_ipv6_route,
)
_, result = topotest.run_and_expect(test_func, None, count=60, wait=1)
assert result is None, "Loopback cost isn't 0"
if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))