ECMP-Manipulating Metric and Distance

ECMP is a capability of the underlying operating system. It can be achieved via equal-cost static routes independently of dynamic routing protocols. Still, the question arises whether the resulting load-sharing behavior is packet-based or flow-based.

NOTE

The only ECMP-capable operating system I have tested is Linux (enable ECMP when compiling), which does per-flow balancing, unless forced to alter its behavior by the equalize flag of the IP utility.


Link-state protocols such as OSPF and IS-IS were designed to support ECMP, depending on the implementation. GateD is capable of ECMP; however, you must alter the MULTIPATH definition in the sources to enable this feature (see Example 9-22). In my GateD lab, ECMP is disabled.

Example 9-22. GateD ECMP Configuration

./gated-public-3_6/src/gated/rt_table.h:



/*

 * The number of multipath routes supported by the forwarding engine.

 */

#ifndef RT_N_MULTIPATH

#define RT_N_MULTIPATH  6

#endif  /* RT_N_MULTIPATH */


Zebra ospfd is capable of ECMP as well; isisd is not yet capable of ECMP. Including ECMP support has to be decided at compile time (configure --enable-multipath=6). It is highly recommended that you read the ECMP RFCs (RFC 2991 and RFC 2992) for a better grasp of this delicate matter.

Keep in mind that load balancing is done only on outbound traffic; be aware of what really resembles a flow when testing your setup, so as not to misjudge the behavior of a correct configuration! Example 9-23 shows an example combination of the ECMP-capable Linux kernel and the Zebra ospfd.

Example 9-23. Linux ECMP in Action

[root@callisto:~#] ip route

192.168.201.2 via 192.168.14.254 dev eth0  proto zebra  metric 11 equalize

192.168.17.0/29 via 192.168.14.254 dev eth0  proto zebra  metric 16 equalize

192.168.13.0/29 via 192.168.14.254 dev eth0  proto zebra  metric 16 equalize

192.168.7.0/24 via 192.168.14.254 dev eth0  proto zebra  metric 20 equalize

111.11.117.0/24 via 192.168.1.254 dev eth1  proto zebra  metric 20 equalize

192.168.2.0/24 via 192.168.1.254 dev eth1  proto zebra  metric 20 equalize

192.168.80.0/24 via 192.168.1.254 dev eth1  proto zebra  metric 20 equalize

192.168.1.0/24 dev eth1  scope link

192.168.201.0/24  proto zebra  metric 20 equalize

        nexthop via 192.168.14.254  dev eth0 weight 1

        nexthop via 192.168.1.254  dev eth1 weight 1

192.168.14.0/24 dev eth0  scope link

192.168.44.0/24 via 192.168.1.254 dev eth1  proto zebra  metric 20 equalize

192.168.45.0/24 via 192.168.1.254 dev eth1  proto zebra  metric 20 equalize

127.0.0.0/8 dev lo  scope link

default via 192.168.1.254 dev eth1