ISIS L1/L2 redistribution and summarization
1. Intro
We will use the following topology to see the redistribution rules in action.

As a reminder, find next the default L1/L2 redistribution rules:
- Rule 1: L1 Internal to L2 are redistributed
- Rule 2: L2 to L1 are not redistributed
- Rule 3: L1 External are not redistributed to L2
Note: with wide-metrics-only configured, the External L1 routes become Internal L1 routes. So, Rule 3 above essentially becomes Rule 1. This use case is fully covered in the wide-metrics-only post.
Note: Rule numbers 1, 2 and 3 have significance only in this post, it will help us to more easily follow the CLI output.
It is also important to see and understand how the configured ISIS areas dictate the L1 and L2 domains.

Check the configuration of a few selected routers, nothing too complex, and no L1/L2 redistribution or summarization at this stage:
### R1 Config:
set interfaces lo0 unit 0 family inet address 17.0.0.1/32
set interfaces lo0 unit 0 family iso address 49.0001.0001.1100.0001.00
set protocols isis interface ge-0/0/1.0
set protocols isis interface ge-0/0/2.0
set protocols isis interface ge-0/0/4.0 passive
set protocols isis interface lo0.0 passive
set protocols isis level 2 disable
set protocols isis export TO-ISIS
set policy-options policy-statement TO-ISIS term 1 from route-filter 1.1.0.0/16 orlonger
set policy-options policy-statement TO-ISIS term 1 then accept
### R3 Config:
set interfaces lo0 unit 0 family inet address 17.0.0.3/32
set interfaces lo0 unit 0 family iso address 49.0001.0001.1100.0003.00
set protocols isis interface ge-0/0/1.0 level 2 disable
set protocols isis interface ge-0/0/4.0 level 1 disable
set protocols isis interface lo0.0 passive
set protocols isis export TO-ISIS
set policy-options policy-statement TO-ISIS term 1 from route-filter 4.4.0.0/16 orlonger
set policy-options policy-statement TO-ISIS term 1 then accept
### R5 Config:
set interfaces lo0 unit 0 family inet address 17.0.0.5/32
set interfaces lo0 unit 0 family iso address 49.0100.0001.1100.0005.00
set protocols isis interface ge-0/0/1.0 level 1 disable
set protocols isis interface ge-0/0/4.0 level 1 disable
set protocols isis interface lo0.0 passive
set protocols isis export TO-ISIS
set policy-options policy-statement TO-ISIS term 1 from route-filter 3.3.0.0/16 orlonger
set policy-options policy-statement TO-ISIS term 1 then accept
### R7 Config:
set interfaces lo0 unit 0 family inet address 17.0.0.7/32
set interfaces lo0 unit 0 family iso address 49.0002.0001.1100.0007.00
set protocols isis interface ge-0/0/2.0
set protocols isis interface ge-0/0/3.0
set protocols isis interface ge-0/0/4.0 passive
set protocols isis interface lo0.0 passive
set protocols isis level 2 disable
set protocols isis export TO-ISIS
set policy-options policy-statement TO-ISIS from route-filter 2.2.0.0/16 orlonger
set policy-options policy-statement TO-ISIS then accept
2. Default Rules
Let us check the CLI output and observe the default redistribution rules in action.
First, let’s check Area 49.0001 internal routes:
### On R4 of course we can see the routes, R4 is part of the same L1 area:
root@R4# run show route 10.1/16
inet.0: 59 destinations, 59 routes (59 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
10.1.1.0/24 *[IS-IS/15] 01:26:01, metric 30
> to 17.8.9.1 via ge-0/0/3.0
10.1.2.0/24 *[IS-IS/15] 01:25:15, metric 20
> to 17.8.9.1 via ge-0/0/3.0
10.1.3.0/24 *[IS-IS/15] 01:25:15, metric 20
> to 17.8.9.1 via ge-0/0/3.0
### Rule 1 is applied, routes can be see in backbone area:
root@R5# run show route 10.1/16
inet.0: 56 destinations, 56 routes (56 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
10.1.1.0/24 *[IS-IS/18] 00:15:21, metric 40
> to 17.8.3.1 via ge-0/0/1.0
10.1.2.0/24 *[IS-IS/18] 01:14:08, metric 30
> to 17.8.3.1 via ge-0/0/1.0
10.1.3.0/24 *[IS-IS/18] 01:14:08, metric 30
> to 17.8.3.1 via ge-0/0/1.0
### Same on R6, because R6 has the L2 database:
root@R6# run show route 10.1/16
inet.0: 62 destinations, 63 routes (62 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
10.1.1.0/24 *[IS-IS/18] 00:20:28, metric 50
> to 17.8.13.1 via ge-0/0/2.0
10.1.2.0/24 *[IS-IS/18] 00:20:28, metric 40
> to 17.8.13.1 via ge-0/0/2.0
10.1.3.0/24 *[IS-IS/18] 00:20:28, metric 40
> to 17.8.13.1 via ge-0/0/2.0
### Rule 2 applied, L2 is not passed to L1
root@R7# run show route 10.1/16
[edit]
root@R7#
If we check the Area 49.0002 internal routes (10.2.x.x/24), the same rules apply, I will not even post the CLI output here.
Next, let’s check Area 49.0001 external routes:
### On R4 of course we can see the routes, R4 is part of the same L1 area:
root@R4# run show route 1.1/16
inet.0: 59 destinations, 59 routes (59 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
1.1.1.0/24 *[IS-IS/160] 01:34:25, metric 20
> to 17.8.9.1 via ge-0/0/3.0
1.1.2.0/24 *[IS-IS/160] 01:34:25, metric 20
> to 17.8.9.1 via ge-0/0/3.0
1.1.3.0/24 *[IS-IS/160] 01:34:25, metric 20
> to 17.8.9.1 via ge-0/0/3.0
### Rule 3 applied, L1 External will not pass to L2:
root@R5# run show route 1.1/16
[edit]
root@R5#
Let’s also check Area 49.0100 external routes (3.3.x.0/24):
### R6 has the routes, R6 has the L2 database:
root@R6# run show route 3.3/16
inet.0: 61 destinations, 61 routes (61 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
3.3.1.0/24 *[IS-IS/165] 00:40:19, metric 10
> to 17.8.13.1 via ge-0/0/2.0
3.3.2.0/24 *[IS-IS/165] 00:40:19, metric 10
> to 17.8.13.1 via ge-0/0/2.0
3.3.3.0/24 *[IS-IS/165] 00:40:19, metric 10
> to 17.8.13.1 via ge-0/0/2.0
### Rule 2 applied, no L2 to L1:
root@R7# run show route 3.3/16
[edit]
root@R7#
On R4, the 10.0.x.x/24 prefixes are L2 routes:
### We can see this on R3, preference 18 indicates this:
root@R3# run show route 10.0/16
inet.0: 61 destinations, 62 routes (61 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
10.0.1.0/24 *[IS-IS/18] 01:33:46, metric 20
> to 17.8.11.2 via ge-0/0/4.0
10.0.2.0/24 *[IS-IS/18] 01:33:46, metric 20
> to 17.8.11.2 via ge-0/0/4.0
### Why? because this is how the interfaces was defined in the config:
set interfaces ge-0/0/1 unit 0 family inet address 10.0.1.1/24
set interfaces ge-0/0/1 unit 0 family inet address 10.0.2.1/24
set protocols isis interface ge-0/0/1.0 level 1 disable
set protocols isis interface ge-0/0/1.0 passive
### Of course it will not pass from L2 to L1, Rule 2:
root@R1# run show route 10.0/16
[edit]
root@R1#
Finally, 4.4.x.0/24 routes on R3, are they L1 or L2? We can see that by default they are redistributed to L1:
### Preference 160 indicates they are L1 routes:
root@R4# run show route 4.4/16
inet.0: 59 destinations, 59 routes (59 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
4.4.1.0/24 *[IS-IS/160] 01:31:13, metric 30
> to 17.8.9.1 via ge-0/0/3.0
4.4.2.0/24 *[IS-IS/160] 01:31:13, metric 30
> to 17.8.9.1 via ge-0/0/3.0
4.4.3.0/24 *[IS-IS/160] 01:31:13, metric 30
> to 17.8.9.1 via ge-0/0/3.0
### They can be seen on R1:
root@R1# run show route 4.4/16
inet.0: 38 destinations, 38 routes (38 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
4.4.1.0/24 *[IS-IS/160] 01:31:23, metric 10
> to 17.8.1.2 via ge-0/0/2.0
4.4.2.0/24 *[IS-IS/160] 01:31:23, metric 10
> to 17.8.1.2 via ge-0/0/2.0
4.4.3.0/24 *[IS-IS/160] 01:31:23, metric 10
> to 17.8.1.2 via ge-0/0/2.0
### Rule 1, they pass to L2:
root@R5# run show route 4.4/16
inet.0: 56 destinations, 56 routes (56 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
4.4.1.0/24 *[IS-IS/165] 00:53:13, metric 20
> to 17.8.3.1 via ge-0/0/1.0
4.4.2.0/24 *[IS-IS/165] 00:53:13, metric 20
> to 17.8.3.1 via ge-0/0/1.0
4.4.3.0/24 *[IS-IS/165] 00:53:13, metric 20
> to 17.8.3.1 via ge-0/0/1.0
### They do not pass to L1 in Area 49.0001, Rule 2:
root@R7# run show route 4.4/16
[edit]
root@R7#
3. Change the defaults
Let’s start by changing 4.4.x.0/24 routes on R3,
root@R3# set policy-options policy-statement TO-ISIS term 1 to level 2
[edit]
root@R3# show | compare
[edit policy-options policy-statement TO-ISIS term 1]
+ to level 2;
[edit]
root@R3# commit
commit complete
### They are now L2 prefixes and do not pass to R1:
root@R1# run show route 4.4/16
[edit]
root@R1#
### They are now L2 prefixes:
root@R4# run show route 4.4/16
inet.0: 59 destinations, 59 routes (59 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
4.4.1.0/24 *[IS-IS/165] 00:01:57, metric 10
> to 17.8.11.1 via ge-0/0/4.0
4.4.2.0/24 *[IS-IS/165] 00:01:57, metric 10
> to 17.8.11.1 via ge-0/0/4.0
4.4.3.0/24 *[IS-IS/165] 00:01:57, metric 10
> to 17.8.11.1 via ge-0/0/4.0
Ok, external 4.4.x.0/24 routes are now L2, but they do not pass to L1, let’s change that:
### We must create a policy for this redistribution.
### Notice that we are also doing route summarization in the same time:
root@R6# show | compare
[edit policy-options]
+ policy-statement EXTERNAL-TO-L1 {
+ term 44 {
+ from {
+ route-filter 4.4.0.0/16 exact;
+ }
+ then accept;
+ }
+ }
[edit routing-options]
+ aggregate {
+ route 4.4.0.0/16;
+ }
[edit protocols isis]
+ export EXTERNAL-TO-L1;
[edit]
root@R6# commit
commit complete
### Now the 4.4 pass to Area 49.0002 L1:
root@R7# run show route 4.4/16
inet.0: 34 destinations, 34 routes (34 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
4.4.0.0/16 *[IS-IS/160] 00:00:02, metric 20
> to 17.8.14.1 via ge-0/0/2.0
### We need to do the same on R3 (and R4) to redistribute to Area 49.0001
### On R3, this only works because we have 2 different steps:
### R3 is redistributing specific routes to L2 database
### R3 is redistributing aggregate route to L1 database
root@R3# show | compare
[edit policy-options]
+ policy-statement EXTERNAL-TO-L1 {
+ term 44 {
+ from {
+ route-filter 4.4.0.0/16 exact;
+ }
+ then accept;
+ }
+ }
[edit routing-options]
+ aggregate {
+ route 4.4.0.0/16;
+ }
[edit protocols isis]
- export TO-ISIS;
+ export [ TO-ISIS EXTERNAL-TO-L1 ];
[edit]
root@R3# commit
commit complete
root@R1# run show route 4.4/16
inet.0: 36 destinations, 36 routes (36 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
4.4.0.0/16 *[IS-IS/160] 00:00:21, metric 20
> to 17.8.1.2 via ge-0/0/2.0
Last, but not least, let’s also do some Internal route redistribution on R6.
### Create and apply the policy on R6:
root@R6# show | compare
[edit policy-options]
+ policy-statement INTERNAL-TO-L1 {
+ term 1 {
+ from {
+ route-filter 10.0.0.0/8 orlonger;
+ }
+ to level 1;
+ then accept;
+ }
+ }
[edit protocols isis]
- export EXTERNAL-TO-L1;
+ export [ EXTERNAL-TO-L1 INTERNAL-TO-L1 ];
root@R6# commit
commit complete
### Now we have the remote Internal routes redistributed to 49.0002:
root@R7# run show route 10.0/16
inet.0: 39 destinations, 40 routes (39 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
10.0.1.0/24 *[IS-IS/18] 00:00:45, metric 40
> to 17.8.14.1 via ge-0/0/2.0
10.0.2.0/24 *[IS-IS/18] 00:00:45, metric 40
> to 17.8.14.1 via ge-0/0/2.0
root@R7# run show route 10.1/16
inet.0: 39 destinations, 40 routes (39 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
10.1.1.0/24 *[IS-IS/18] 00:00:48, metric 60
> to 17.8.14.1 via ge-0/0/2.0
10.1.2.0/24 *[IS-IS/18] 00:00:48, metric 50
> to 17.8.14.1 via ge-0/0/2.0
10.1.3.0/24 *[IS-IS/18] 00:00:48, metric 50
> to 17.8.14.1 via ge-0/0/2.0
External Resources: