One FAQ I see on CCIE lab lists is How do I load balance two paths in EIGRP without using the variance command?

It’s an interesting problem, because the solution illustrates how EIGRP works.

First of all, the variance command assigns a multiplier that says when two routes are “close enough” to load balance. Normally, when presented with a route of metric 100 and one of metric 200, routing protocols will choose the former and ignore the latter. With “variance 2″, both routes will be considered equal and make it to the routing table. Depending on the setting of “traffic-share”, the routes will be used proportionally to their metrics. How Does Unequal Cost Path Load Balancing (Variance) Work in IGRP and EIGRP? describes it in detail.

Without using a variance, the only way to get multiple routes to be promoted to the routing table is to make their metrics the same. I know of two ways to do this:

  1. Manipulate the components of the composite metric to make the route look the same
  2. Add a static offset with the offset-list command

Consider two routers, r0 and r3, connected with both an Ethernet and a frame-relay connection out their serial interfaces.

r0#show ip eigrp neighbors
IP-EIGRP neighbors for process 42
H   Address                 Interface       Hold Uptime   SRTT   RTO  Q  Seq
                                            (sec)         (ms)       Cnt Num
1   192.168.1.2             Se0              166 00:00:13    1  5000  2  0
0   10.50.0.2               Et0               14 00:00:13   12   200  0  2

The 10.3.3.0/24 network is a loopback on R3, and is the one we’ll try to load balance. We can see that it uses Ethernet0 because the metric is better:

r0#show ip route 10.3.3.1
Routing entry for 10.3.3.0/24
  Known via "eigrp 42", distance 90, metric 409600, type internal
  Redistributing via eigrp 42
  Last update from 10.50.0.2 on Ethernet0, 00:00:39 ago
  Routing Descriptor Blocks:
  * 10.50.0.2, from 10.50.0.2, 00:00:39 ago, via Ethernet0
      Route metric is 409600, traffic share count is 1
      Total delay is 6000 microseconds, minimum bandwidth is 10000 Kbit
      Reliability 255/255, minimum MTU 1500 bytes
      Loading 1/255, Hops 1

r0#show ip eigrp topology 10.3.3.0/24
IP-EIGRP (AS 42): Topology entry for 10.3.3.0/24
  State is Passive, Query origin flag is 1, 1 Successor(s), FD is 409600
  Routing Descriptor Blocks:
  10.50.0.2 (Ethernet0), from 10.50.0.2, Send flag is 0x0
      Composite metric is (409600/128256), Route is Internal
      Vector metric:
        Minimum bandwidth is 10000 Kbit
        Total delay is 6000 microseconds
        Reliability is 255/255
        Load is 1/255
        Minimum MTU is 1500
        Hop count is 1

Since the feasibility condition is not met, we only see the one route.

Method 1: Manipulate metric with bandwidth/delay

r0(config)#int s0
r0(config-if)#bandwidth 10000
r0(config-if)#delay 100

That makes the serial interface on R0 look like the ethernet interface. How do I know this?

r0#show int e0 | include DLY
  MTU 1500 bytes, BW 10000 Kbit, DLY 1000 usec,

(Don’t forget that the bandwidth command is in Kbits/sec, and Delay is in tens of usec)

The link properties are added on the receiving router (this is the difference between the feasible distance and the advertised distance), so if R3 is generating the route and we want to affect R0, the change goes on R0:

r0#show ip route 10.3.3.0
Routing entry for 10.3.3.0/24
  Known via "eigrp 42", distance 90, metric 409600, type internal
  Redistributing via eigrp 42
  Last update from 192.168.1.2 on Serial0, 00:01:10 ago
  Routing Descriptor Blocks:
  * 10.50.0.2, from 10.50.0.2, 00:01:10 ago, via Ethernet0
      Route metric is 409600, traffic share count is 1
      Total delay is 6000 microseconds, minimum bandwidth is 10000 Kbit
      Reliability 255/255, minimum MTU 1500 bytes
      Loading 1/255, Hops 1
    192.168.1.2, from 192.168.1.2, 00:01:10 ago, via Serial0
      Route metric is 409600, traffic share count is 1
      Total delay is 6000 microseconds, minimum bandwidth is 10000 Kbit
      Reliability 255/255, minimum MTU 1500 bytes
      Loading 1/255, Hops 1

Method 2: Use an offset-list

An offset-list adds a value to the metric of a given route from a given interface. The question is “how much is required?”. The easiest way is to write down the current metric (409600), artificially inflate the route so that the second route takes hold, then figure out the delta. Note that here we’re making the ethernet look worse by adding to the metric, where in the previous example the technique was to make the serial interface look better:

r0(config-router)#access-list 5 permit host 10.3.3.0
r0(config)#router eigrp 42
r0(config-router)#offset-list 5 in  2147483647 e0
r0#show ip route 10.3.3.0
Routing entry for 10.3.3.0/24
  Known via "eigrp 42", distance 90, metric 2297856, type internal
  Redistributing via eigrp 42
  Last update from 192.168.1.2 on Serial0, 00:02:00 ago
  Routing Descriptor Blocks:
  * 192.168.1.2, from 192.168.1.2, 00:02:00 ago, via Serial0
      Route metric is 2297856, traffic share count is 1
      Total delay is 25000 microseconds, minimum bandwidth is 1544 Kbit
      Reliability 255/255, minimum MTU 1500 bytes
      Loading 1/255, Hops 1

Now, 2297856-409600=1888256, so adjusting the offset-list gives

r0#show ip route 10.3.3.0
Routing entry for 10.3.3.0/24
  Known via "eigrp 42", distance 90, metric 2297856, type internal
  Redistributing via eigrp 42
  Last update from 10.50.0.2 on Ethernet0, 00:00:08 ago
  Routing Descriptor Blocks:
  * 192.168.1.2, from 192.168.1.2, 00:00:08 ago, via Serial0
      Route metric is 2297856, traffic share count is 1
      Total delay is 25000 microseconds, minimum bandwidth is 1544 Kbit
      Reliability 255/255, minimum MTU 1500 bytes
      Loading 1/255, Hops 1
    10.50.0.2, from 10.50.0.2, 00:00:08 ago, via Ethernet0
      Route metric is 2297856, traffic share count is 1
      Total delay is 79760 microseconds, minimum bandwidth is 10000 Kbit
      Reliability 255/255, minimum MTU 1500 bytes
      Loading 1/255, Hops 1

Apply Offsets to Routing Metrics describes the use of offset-list . They can be done on all interfaces, some interfaces, and incoming or outgoing. Here we chose incoming on one interface.

Which one should I use?

Method #1 is the easiest, but is really only practical when the two routers are direct neighbours. That’s not to say it can’t be done (or you couldn’t manipulate k values to do the same thing).

Method #2 is more difficult, but is very precise. If the routers weren’t dually connected as they were in this example (say the ethernet link transited R1), this would be a good choice.

References

  1. How Does Unequal Cost Path Load Balancing (Variance) Work in IGRP and EIGRP?
  2. Apply Offsets to Routing Metrics