Package: iproute Version: 20061002-3 Severity: minor Tags: patch The 'wrandom' multipath algo is recognised when adding the route, but not resolved when it is printed (prints 'unknown'):
ianus:~# ip ro add 1.2.3.4 mpath wrandom nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 2 ianus:~# ip ro get to 1.2.3.4 1.2.3.4 mpath unknown dev ppp0 src 62.77.192.67 cache mtu 1492 advmss 1452 hoplimit 64 ianus:~# ip ro del 1.2.3.4 mpath wrandom nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 2 It works with all the other multipath algos: ianus:~# ip ro add 1.2.3.4 mpath random nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 2 ianus:~# ip ro get to 1.2.3.4 1.2.3.4 mpath random dev ppp1 src 62.77.192.67 cache mtu 1492 advmss 1452 hoplimit 64 ianus:~# ip ro del 1.2.3.4 mpath random nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 2 The cause is that 'wrandom' is the last element in the ip_mp_alg enum, so IP_MP_ALG_MAX == IP_MP_ALG_WRANDOM. All the other code (including kernel code) treats IP_MP_ALG_MAX as the last valid value of the enum, except iproute-20061002/ip/iproute.c: It assumes that IP_MP_ALG_MAX is the last valid value plus 1. The same bug exists in upstream (http://developer.osdl.org/dev/iproute2/download/iproute2-2.6.20-070313.tar.gz). Best regards, norbi -- System Information: Debian Release: 4.0 APT prefers oldstable APT policy: (500, 'oldstable'), (500, 'stable') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.18 Locale: LANG=C, LC_CTYPE=hu_HU (charmap=ISO-8859-2) Versions of packages iproute depends on: ii libatm1 2.4.1-17 shared library for ATM (Asynchrono ii libc6 2.3.6.ds1-13 GNU C Library: Shared libraries ii libdb4.3 4.3.29-8 Berkeley v4.3 Database Libraries [ Versions of packages iproute recommends: pn iproute-doc <none> (no description available) -- no debconf information
diff -Naur iproute-20061002/ip/iproute.c iproute-20061002.fixed/ip/iproute.c --- iproute-20061002/ip/iproute.c 2007-06-11 19:26:52.000000000 +0200 +++ iproute-20061002.fixed/ip/iproute.c 2007-06-11 19:27:29.000000000 +0200 @@ -358,7 +358,7 @@ __u32 mp_alg = *(__u32*) RTA_DATA(tb[RTA_MP_ALGO]); if (mp_alg > IP_MP_ALG_NONE) { fprintf(fp, "mpath %s ", - mp_alg < IP_MP_ALG_MAX ? mp_alg_names[mp_alg] : "unknown"); + mp_alg <= IP_MP_ALG_MAX ? mp_alg_names[mp_alg] : "unknown"); } }