Suboptimal IS-IS Intra-area Routing

In previous exercises, we saw that every time you use level-1 areas with multiple exit points towards the level-2 IS-IS backbone, you have the potential to create suboptimal routing.

In this exercise, you will see how the design of a level-1 area can impact routing. You will be introduced to IS-IS in-area routing preferences and learn how to solve suboptimal routing induced by incorrect area design. Finally, you will explore what happens when a level-1 area partitions.

Lab topology

Device Requirements

Use any device supported by the Netlab IS-IS configuration module that correctly implements the distribution of intra-area (level-1) routes into inter-area (level-2) backbone.

Unfortunately, this leaves FRRouting off the table. As of February 2026, FRRouting’s IS-IS implementation is incomplete and does not propagate level-1 IP prefixes into the level-2 LSP database as required by RFC 1195. Nevertheless, the implemented parts are solid, and FRR can be used without problems in single-level IS-IS deployments.

Starting the Lab

You can start the lab on your own lab infrastructure or in GitHub Codespaces (more details):

  • Change directory to advanced/4-suboptimal
  • Execute netlab up
  • Log into lab devices with netlab connect

Existing Device Configuration

After starting the lab, netlab configures IPv4 addresses and the IS-IS routing protocol on the lab routers. IS-IS parameters of individual lab devices are summarized in the following table:

Node IS-IS Area System ID IS type
x1 49.0001 0000.0000.0005 level-2
x2 49.0002 0000.0000.0006 level-2
r1 49.0100 0000.0000.0001 level-1
r2 49.0100 0000.0000.0002 level-1
c1 49.0100 0000.0000.0003 level-1-2
c2 49.0100 0000.0000.0004 level-1-2
  • The links between X1, C1, C2, and X2 are level-2-only high-speed links (low metric).
  • The links between C1, R1, R2, and C2 and level-1 low-speed links (high metric).

The Problem

Once you have examined the running configuration of your routers and are familiar with them, examine the path from C1 to R2:

Traceroute from C1 to R2

$ netlab connect c1 traceroute 10.0.0.2
Connecting to 192.168.121.103 using SSH port 22, executing traceroute 10.0.0.2
traceroute to 10.0.0.2 (10.0.0.2), 30 hops max, 60 byte packets
1  r1 (10.1.0.2)  0.050 ms  0.009 ms  0.007 ms
2  r2 (10.0.0.2)  1.103 ms  1.115 ms  1.325 ms

This is interesting. C1 forwards traffic toward R2 over high-cost links, even though it has a cheaper route via C2.

How about the traffic from C1 to C2?

Traceroute from C1 to C2

$ netlab connect c1 traceroute 10.0.0.4
Connecting to 192.168.121.103 using SSH port 22, executing traceroute 10.0.0.4
traceroute to 10.0.0.4 (10.0.0.4), 30 hops max, 60 byte packets
1  r1 (10.1.0.2)  0.052 ms  0.009 ms  0.007 ms
2  r2 (10.1.0.6)  0.955 ms  0.966 ms  1.103 ms
3  c2 (10.0.0.4)  1.473 ms  1.856 ms  2.228 ms

If the previous trace was interesting, this one is downright bizarre. Although C1 is directly connected to C2, the traffic from C1 to C2 uses low-speed links via R1 and R2.

Let’s confirm that the link between C1 and C2 is up and that we have IS-IS running on it:

IS-IS neighbors on C1 running Arista cEOS:

$ netlab connect c1 show isis neighbors
Connecting to 192.168.121.103 using SSH port 22, executing show isis neighbors

Instance  VRF      System Id        Type Interface          SNPA              State Hold time   Circuit Id
Gandalf   default  r1               L1   Ethernet1          P2P               UP    21          12
Gandalf   default  c2               L2   Ethernet2          P2P               UP    27          17
Gandalf   default  x1               L2   Ethernet3          P2P               UP    28          00

That seems OK. Next, let’s examine the routing table on C1:

Routing table of C1 running Arista cEOS

c1#show ip route | begin Gateway
Gateway of last resort is not set

I L1     10.0.0.1/32 [115/30]
via 10.1.0.2, Ethernet1
I L1     10.0.0.2/32 [115/50]
via 10.1.0.2, Ethernet1
C        10.0.0.3/32
directly connected, Loopback0
I L1     10.0.0.4/32 [115/70]
via 10.1.0.2, Ethernet1
I L2     10.0.0.5/32 [115/15]
via 10.1.0.18, Ethernet3
I L2     10.0.0.6/32 [115/20]
via 10.1.0.14, Ethernet2
C        10.1.0.0/30
directly connected, Ethernet1
I L1     10.1.0.4/30 [115/40]
via 10.1.0.2, Ethernet1
I L1     10.1.0.8/30 [115/60]
via 10.1.0.2, Ethernet1
C        10.1.0.12/30
directly connected, Ethernet2
C        10.1.0.16/30
directly connected, Ethernet3
I L2     10.1.0.20/30 [115/10]
via 10.1.0.14, Ethernet2

We can see that IS-IS installed a level-1 route to C2 (metric 70) in C1’s routing table.

At this point, it’s worth examining the internal IS-IS structures, particularly its interpretation of the routing table (Routing Information Base – RIB). A show isis rib command is not available on Arista cEOS (the device commonly used in IS-IS lab exercises), but works on Cisco IOL. Let’s take advantage of Netlab’s device abstraction power and quickly change the devices:

IS-IS Rib entry for C2, as viewed on C1 running Cisco IOL

c1#show isis rib 10.0.0.4 255.255.255.255

IPv4 local RIB for IS-IS process Gandalf

IPV4 unicast topology base (TID 0, TOPOID 0x0) =================

10.0.0.4/32  prefix attr X:0 R:0 N:1
[115/L1/70] via 10.1.0.2(Ethernet0/1), from 10.0.0.4, tag 0
prefix attr: X:0 R:0 N:1
(installed)
[115/L2/15] via 10.1.0.14(Ethernet0/2), from 10.0.0.4, tag 0
prefix attr: X:0 R:0 N:1

The IS-IS RIB printout from Cisco IOL clearly shows that the IS-IS process knows about both routes to 10.0.0.4/32 – an L1 route with a metric of 70 and an L2 route with a metric of 15. Regardless of the metrics, the IS-IS process installs the L1 route into the main routing table.

Tip

You can reproduce the same information from the IS-IS database, but it’s much nicer to have a direct view of the routing process RIB.

This IS-IS behavior is documented in RFC 1195 - chapter 3.10 - Order of Preference of Routes/Dijkstra Computation:

The Integrated IS-IS prefers routes within the area (via level 1 routing) whenever possible. If level 2 routes must be used, then routes within the routing domain (specifically, those routes using internal metrics) are preferred to routes outside of the routing domain (using external metrics).

Aside: Impact of Area Partitioning

Let’s try out something: turn off the R1-R2 link (for example, shut down the R2->R1 interface on R2) to split the area 49.0100, and examine the changes in C1’s routing table:

C1’s routing table after L1 split, Arista cEOS:

I L1     10.0.0.1/32 [115/30]
via 10.1.0.2, Ethernet1
I L2     10.0.0.2/32 [115/35]
via 10.1.0.14, Ethernet2
C        10.0.0.3/32
directly connected, Loopback0
I L2     10.0.0.4/32 [115/15]
via 10.1.0.14, Ethernet2
I L2     10.0.0.5/32 [115/15]
via 10.1.0.18, Ethernet3
I L2     10.0.0.6/32 [115/20]
via 10.1.0.14, Ethernet2
C        10.1.0.0/30
directly connected, Ethernet1
I L2     10.1.0.8/30 [115/25]
via 10.1.0.14, Ethernet2
C        10.1.0.12/30
directly connected, Ethernet2
C        10.1.0.16/30
directly connected, Ethernet3
I L2     10.1.0.20/30 [115/10]
via 10.1.0.14, Ethernet2

Most L1 IS-IS routes we observed earlier are no longer present in the routing table. C2 and R2 are now directly accessible over low-cost L2 routes. Furthermore, we have complete reachability between all our routers.

Since we want the R1-R2 link, this is not a solution, but it suggests we might need better connectivity within the L1 area. Let’s reenable the R1-R2 link and figure out which link we could add to the L1 area to solve the suboptimal routing problem.

Configuration Task

Using the commands you mastered in the Multilevel IS-IS Deployments lab exercise, change the ISIS circuit type on the C1-C2 link to the level-1-2 circuit.

This change improves connectivity within the level-1 area. The C1-C2 link is now not only a backbone link but also an intra-area link.

Validation

Check the IS-IS neighbors on C1. C2 should be a level-1-2 neighbor:

IS-IS neighbors on C1 running Arista cEOS

c1#show isis neighbors

Instance  VRF      System Id        Type Interface          SNPA              State Hold time   Circuit Id
Gandalf   default  r1               L1   Ethernet1          P2P               UP    26          12
Gandalf   default  c2               L1L2 Ethernet2          P2P               UP    27          17
Gandalf   default  x1               L2   Ethernet3          P2P               UP    27          00

Examine the routing table on C1. It should contain an entry for C2 (10.0.0.4) with a low metric (15 on most platforms):

C1’s routing table, Arista cEOS

c1#show ip route 10.0.0.4
...
 I L1     10.0.0.4/32 [115/15]
           via 10.1.0.14, Ethernet2

The routing table on C1 should also contain a route to R2 via C2:

c1#show ip route 10.0.0.2 detail
...
 I L1     10.0.0.2/32 [115/35] PM
           via 10.1.0.14, Ethernet2 c1 -> c2

Just to be on the safe side, let’s redo the traceroutes:

Traceroute from C1 to R2

c1#traceroute r2
traceroute to r2 (10.0.0.2), 30 hops max, 60 byte packets
 1  c2 (10.1.0.14)  0.085 ms  0.006 ms  0.006 ms
 2  r2 (10.0.0.2)  2.048 ms  2.112 ms  2.623 ms

Next: Build an SR-MPLS Network with IS-IS

Reference Information

Lab Wiring

Origin Device Origin Port Destination Device Destination Port
r1 Ethernet1 c1 Ethernet1
r1 Ethernet2 r2 Ethernet1
r2 Ethernet2 c2 Ethernet1
c1 Ethernet2 c2 Ethernet2
c1 Ethernet3 x1 eth1
c2 Ethernet3 x2 eth1

Note

The interface names depend on the lab devices you use. The printout was generated with user routers running Arista EOS and X1/X2 running FRRouting.

Lab Addressing

Node/Interface IPv4 Address IPv6 Address Description
r1 10.0.0.1/32 Loopback
Ethernet1 10.1.0.2/30 r1 -> c1
Ethernet2 10.1.0.5/30 r1 -> r2
r2 10.0.0.2/32 Loopback
Ethernet1 10.1.0.6/30 r2 -> r1
Ethernet2 10.1.0.10/30 r2 -> c2
c1 10.0.0.3/32 Loopback
Ethernet1 10.1.0.1/30 c1 -> r1
Ethernet2 10.1.0.13/30 c1 -> c2
Ethernet3 10.1.0.17/30 c1 -> x1
c2 10.0.0.4/32 Loopback
Ethernet1 10.1.0.9/30 c2 -> r2
Ethernet2 10.1.0.14/30 c2 -> c1
Ethernet3 10.1.0.21/30 c2 -> x2
x1 10.0.0.5/32 Loopback
eth1 10.1.0.18/30 x1 -> c1
x2 10.0.0.6/32 Loopback
eth1 10.1.0.22/30 x2 -> c2