Merge pull request #15028 from FRRouting/mergify/bp/stable/9.1/pr-15026

ospfd: Correct LSA parser which fulfill the TED (backport #15026)
This commit is contained in:
Donald Sharp 2023-12-14 20:23:12 -05:00 committed by GitHub
commit 34c584225d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 48 additions and 69 deletions

View File

@ -980,8 +980,8 @@ static void ospf_mpls_te_nsm_change(struct ospf_neighbor *nbr, int old_state)
struct ospf_interface *oi = nbr->oi; struct ospf_interface *oi = nbr->oi;
struct mpls_te_link *lp; struct mpls_te_link *lp;
/* Process Neighbor only when its state is NSM Full */ /* Process Link only when neighbor old or new state is NSM Full */
if (nbr->state != NSM_Full) if (nbr->state != NSM_Full && old_state != NSM_Full)
return; return;
/* Get interface information for Traffic Engineering */ /* Get interface information for Traffic Engineering */
@ -1839,6 +1839,7 @@ static void ospf_te_delete_subnet(struct ls_ted *ted, struct in_addr addr)
p.family = AF_INET; p.family = AF_INET;
p.prefixlen = IPV4_MAX_BITLEN; p.prefixlen = IPV4_MAX_BITLEN;
p.u.prefix4 = addr; p.u.prefix4 = addr;
ote_debug(" |- Delete Subnet info. for Prefix %pFX", &p);
subnet = ls_find_subnet(ted, &p); subnet = ls_find_subnet(ted, &p);
/* Remove subnet if found */ /* Remove subnet if found */
@ -1851,8 +1852,7 @@ static void ospf_te_delete_subnet(struct ls_ted *ted, struct in_addr addr)
/** /**
* Parse Router LSA. This function will create or update corresponding Vertex, * Parse Router LSA. This function will create or update corresponding Vertex,
* Edge and Subnet. It also remove Edge and Subnet if they are marked as Orphan * Edge and Subnet.
* once Router LSA is parsed.
* *
* @param ted Link State Traffic Engineering Database * @param ted Link State Traffic Engineering Database
* @param lsa OSPF Link State Advertisement * @param lsa OSPF Link State Advertisement
@ -1864,9 +1864,6 @@ static int ospf_te_parse_router_lsa(struct ls_ted *ted, struct ospf_lsa *lsa)
struct router_lsa *rl; struct router_lsa *rl;
enum ls_node_type type; enum ls_node_type type;
struct ls_vertex *vertex; struct ls_vertex *vertex;
struct ls_edge *edge;
struct ls_subnet *subnet;
struct listnode *node;
int len, links; int len, links;
/* Sanity Check */ /* Sanity Check */
@ -1909,13 +1906,6 @@ static int ospf_te_parse_router_lsa(struct ls_ted *ted, struct ospf_lsa *lsa)
vertex->status = SYNC; vertex->status = SYNC;
} }
/* Mark outgoing Edge and Subnet as ORPHAN to detect deletion */
for (ALL_LIST_ELEMENTS_RO(vertex->outgoing_edges, node, edge))
edge->status = ORPHAN;
for (ALL_LIST_ELEMENTS_RO(vertex->prefixes, node, subnet))
subnet->status = ORPHAN;
/* Then, process Link Information */ /* Then, process Link Information */
len = lsa->size - OSPF_LSA_HEADER_SIZE - OSPF_ROUTER_LSA_MIN_SIZE; len = lsa->size - OSPF_LSA_HEADER_SIZE - OSPF_ROUTER_LSA_MIN_SIZE;
links = ntohs(rl->links); links = ntohs(rl->links);
@ -1948,11 +1938,6 @@ static int ospf_te_parse_router_lsa(struct ls_ted *ted, struct ospf_lsa *lsa)
break; break;
} }
} }
/* Clean remaining Orphan Edges or Subnets */
if (OspfMplsTE.export)
ls_vertex_clean(ted, vertex, zclient);
else
ls_vertex_clean(ted, vertex, NULL);
return 0; return 0;
} }
@ -2405,7 +2390,10 @@ static int ospf_te_delete_te(struct ls_ted *ted, struct ospf_lsa *lsa)
ote_debug(" |- Delete TE info. for Edge %pI4", ote_debug(" |- Delete TE info. for Edge %pI4",
&edge->attributes->standard.local); &edge->attributes->standard.local);
/* Remove Link State Attributes TE information */ /* First remove the associated Subnet */
ospf_te_delete_subnet(ted, attr->standard.local);
/* Then ,remove Link State Attributes TE information */
memset(&attr->standard, 0, sizeof(struct ls_standard)); memset(&attr->standard, 0, sizeof(struct ls_standard));
attr->flags &= 0x0FFFF; attr->flags &= 0x0FFFF;
memset(&attr->extended, 0, sizeof(struct ls_extended)); memset(&attr->extended, 0, sizeof(struct ls_extended));
@ -2420,7 +2408,6 @@ static int ospf_te_delete_te(struct ls_ted *ted, struct ospf_lsa *lsa)
edge->status = SYNC; edge->status = SYNC;
} else { } else {
/* Remove completely the Edge if Segment Routing is not set */ /* Remove completely the Edge if Segment Routing is not set */
ospf_te_delete_subnet(ted, attr->standard.local);
edge->status = DELETE; edge->status = DELETE;
ospf_te_export(LS_MSG_TYPE_ATTRIBUTES, edge); ospf_te_export(LS_MSG_TYPE_ATTRIBUTES, edge);
ls_edge_del_all(ted, edge); ls_edge_del_all(ted, edge);

View File

@ -2,13 +2,13 @@
interface lo interface lo
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
! !
interface r1-eth0 interface eth0
ip ospf network point-to-point ip ospf network point-to-point
ip ospf hello-interval 2 ip ospf hello-interval 2
ip ospf dead-interval 10 ip ospf dead-interval 10
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
! !
interface r1-eth1 interface eth1
ip ospf network point-to-point ip ospf network point-to-point
ip ospf hello-interval 2 ip ospf hello-interval 2
ip ospf dead-interval 10 ip ospf dead-interval 10

View File

@ -2,7 +2,7 @@
interface lo interface lo
ip address 10.0.255.1/32 ip address 10.0.255.1/32
! !
interface r1-eth0 interface eth0
ip address 10.0.0.1/24 ip address 10.0.0.1/24
link-params link-params
metric 20 metric 20
@ -12,7 +12,7 @@ interface r1-eth0
enable enable
exit-link-params exit-link-params
! !
interface r1-eth1 interface eth1
ip address 10.0.1.1/24 ip address 10.0.1.1/24
link-params link-params
enable enable

View File

@ -2,25 +2,25 @@
interface lo interface lo
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
! !
interface r2-eth0 interface eth0
ip ospf network point-to-point ip ospf network point-to-point
ip ospf hello-interval 2 ip ospf hello-interval 2
ip ospf dead-interval 10 ip ospf dead-interval 10
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
! !
interface r2-eth1 interface eth1
ip ospf network point-to-point ip ospf network point-to-point
ip ospf hello-interval 2 ip ospf hello-interval 2
ip ospf dead-interval 10 ip ospf dead-interval 10
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
! !
interface r2-eth2 interface eth2
ip ospf network point-to-point ip ospf network point-to-point
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
ip ospf hello-interval 2 ip ospf hello-interval 2
ip ospf dead-interval 10 ip ospf dead-interval 10
! !
interface r2-eth3 interface eth3
ip ospf network point-to-point ip ospf network point-to-point
ip ospf hello-interval 2 ip ospf hello-interval 2
ip ospf dead-interval 10 ip ospf dead-interval 10

View File

@ -2,25 +2,25 @@
interface lo interface lo
ip address 10.0.255.2/32 ip address 10.0.255.2/32
! !
interface r2-eth0 interface eth0
ip address 10.0.0.2/24 ip address 10.0.0.2/24
link-params link-params
enable enable
exit-link-params exit-link-params
! !
interface r2-eth1 interface eth1
ip address 10.0.1.2/24 ip address 10.0.1.2/24
link-params link-params
enable enable
exit-link-params exit-link-params
! !
interface r2-eth2 interface eth2
ip address 10.0.3.2/24 ip address 10.0.3.2/24
link-params link-params
enable enable
exit-link-params exit-link-params
! !
interface r2-eth3 interface eth3
ip address 10.0.4.2/24 ip address 10.0.4.2/24
link-params link-params
metric 30 metric 30

View File

@ -2,13 +2,13 @@
interface lo interface lo
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
! !
interface r3-eth0 interface eth0
ip ospf network point-to-point ip ospf network point-to-point
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
ip ospf hello-interval 2 ip ospf hello-interval 2
ip ospf dead-interval 10 ip ospf dead-interval 10
! !
interface r3-eth1 interface eth1
ip ospf network point-to-point ip ospf network point-to-point
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
ip ospf hello-interval 2 ip ospf hello-interval 2

View File

@ -2,14 +2,14 @@
interface lo interface lo
ip address 10.0.255.3/32 ip address 10.0.255.3/32
! !
interface r3-eth0 interface eth0
ip address 10.0.3.1/24 ip address 10.0.3.1/24
link-params link-params
enable enable
admin-grp 0x20 admin-grp 0x20
exit-link-params exit-link-params
! !
interface r3-eth1 interface eth1
ip address 10.0.5.1/24 ip address 10.0.5.1/24
link-params link-params
enable enable

View File

@ -2,7 +2,7 @@
interface lo interface lo
ip ospf area 0.0.0.0 ip ospf area 0.0.0.0
! !
interface r4-eth0 interface eth0
ip ospf network point-to-point ip ospf network point-to-point
ip ospf hello-interval 2 ip ospf hello-interval 2
ip ospf dead-interval 10 ip ospf dead-interval 10

View File

@ -2,7 +2,7 @@
interface lo interface lo
ip address 10.0.255.4/32 ip address 10.0.255.4/32
! !
interface r4-eth0 interface eth0
ip address 10.0.4.1/24 ip address 10.0.4.1/24
link-params link-params
enable enable

View File

@ -18,22 +18,22 @@ test_ospf_te_topo1.py: Test the FRR OSPF with Traffic Engineering.
| 10.0.225.1 | | 10.0.225.1 |
| | | |
+------------+ +------------+
r1-eth0| |r1-eth1 eth0| |eth1
| | | |
10.0.0.0/24| |10.0.1.0/24 10.0.0.0/24| |10.0.1.0/24
| | | |
r2-eth0| |r2-eth1 eth0| |eth1
+------------+ +------------+ +------------+ +------------+
| | | | | | | |
| R2 |r2-eth2 r3-eth0| R3 | | R2 |eth2 eth0| R3 |
| 10.0.255.2 +------------------+ 10.0.255.3 | | 10.0.255.2 +------------------+ 10.0.255.3 |
| | 10.0.3.0/24 | | | | 10.0.3.0/24 | |
+------------+ +------+-----+ +------------+ +------+-----+
r2-eth3| r3-eth1| eth3| eth1|
| | | |
10.0.4.0/24| 10.0.5.0/24| 10.0.4.0/24| 10.0.5.0/24|
| | | |
r4-eth0| V eth0| V
+------------+ ASBR 10.0.255.5 +------------+ ASBR 10.0.255.5
| | | |
| R4 | | R4 |
@ -70,30 +70,24 @@ def build_topo(tgen):
"Build function" "Build function"
# Create 4 routers # Create 4 routers
for routern in range(1, 5): r1 = tgen.add_router("r1")
tgen.add_router("r{}".format(routern)) r2 = tgen.add_router("r2")
r3 = tgen.add_router("r3")
r4 = tgen.add_router("r4")
# Interconect router 1 and 2 with 2 links # Interconect router 1 and 2 with 2 links
switch = tgen.add_switch("s1") tgen.add_link(r1, r2, ifname1="eth0", ifname2="eth0")
switch.add_link(tgen.gears["r1"]) tgen.add_link(r1, r2, ifname1="eth1", ifname2="eth1")
switch.add_link(tgen.gears["r2"])
switch = tgen.add_switch("s2")
switch.add_link(tgen.gears["r1"])
switch.add_link(tgen.gears["r2"])
# Interconect router 3 and 2 # Interconect router 3 and 2
switch = tgen.add_switch("s3") tgen.add_link(r2, r3, ifname1="eth2", ifname2="eth0")
switch.add_link(tgen.gears["r3"])
switch.add_link(tgen.gears["r2"])
# Interconect router 4 and 2 # Interconect router 4 and 2
switch = tgen.add_switch("s4") tgen.add_link(r2, r4, ifname1="eth3", ifname2="eth0")
switch.add_link(tgen.gears["r4"])
switch.add_link(tgen.gears["r2"])
# Interconnect router 3 with next AS # Interconnect router 3 with next AS
switch = tgen.add_switch("s5") s1 = tgen.add_switch("s1")
switch.add_link(tgen.gears["r3"]) tgen.add_link(r3, s1, ifname1="eth1", ifname2="eth0")
def setup_module(mod): def setup_module(mod):
@ -174,8 +168,7 @@ def test_step2():
tgen = setup_testcase("Step2: Shutdown interface between r1 & r2") tgen = setup_testcase("Step2: Shutdown interface between r1 & r2")
tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth1" -c "shutdown"') tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface eth1" -c "shutdown"')
tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth1" -c "shutdown"')
for rname in ["r1", "r2", "r3", "r4"]: for rname in ["r1", "r2", "r3", "r4"]:
compare_ted_json_output(tgen, rname, "ted_step2.json") compare_ted_json_output(tgen, rname, "ted_step2.json")
@ -227,28 +220,27 @@ def test_step5():
tgen = setup_testcase("Step5: Re-enable interface between r1 & r2") tgen = setup_testcase("Step5: Re-enable interface between r1 & r2")
tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth1" -c "no shutdown"') tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface eth1" -c "no shutdown"')
tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth1" -c "no shutdown"')
for rname in ["r1", "r2", "r3", "r4"]: for rname in ["r1", "r2", "r3", "r4"]:
compare_ted_json_output(tgen, rname, "ted_step5.json") compare_ted_json_output(tgen, rname, "ted_step5.json")
def test_step6(): def test_step6():
"Step6: Set delay and jitter for interface r4-eth0 on r4, remove use-bw \ "Step6: Set delay and jitter for interface eth0 on r4, remove use-bw \
for interface r2-eth3 on r2 and verify that corresponding Edges are \ for interface eth3 on r2 and verify that corresponding Edges are \
updated in the TED on all routers" updated in the TED on all routers"
tgen = setup_testcase("Step6: Modify link parameters on r2 & r4") tgen = setup_testcase("Step6: Modify link parameters on r2 & r4")
tgen.net["r2"].cmd( tgen.net["r2"].cmd(
'vtysh -c "conf t" -c "interface r2-eth3" -c "link-params" -c "no use-bw"' 'vtysh -c "conf t" -c "interface eth3" -c "link-params" -c "no use-bw"'
) )
tgen.net["r4"].cmd( tgen.net["r4"].cmd(
'vtysh -c "conf t" -c "interface r4-eth0" -c "link-params" -c "delay 20000"' 'vtysh -c "conf t" -c "interface eth0" -c "link-params" -c "delay 20000"'
) )
tgen.net["r4"].cmd( tgen.net["r4"].cmd(
'vtysh -c "conf t" -c "interface r4-eth0" -c "link-params" -c "delay-variation 10000"' 'vtysh -c "conf t" -c "interface eth0" -c "link-params" -c "delay-variation 10000"'
) )
for rname in ["r1", "r2", "r3", "r4"]: for rname in ["r1", "r2", "r3", "r4"]: