=== modified file 'include/linux/mroute.h' --- old/include/linux/mroute.h 2009-08-10 11:17:32 +0000 +++ new/include/linux/mroute.h 2009-08-11 20:39:14 +0000 @@ -61,11 +61,13 @@ unsigned int vifc_rate_limit; /* Rate limiter values (NI) */ struct in_addr vifc_lcl_addr; /* Our address */ struct in_addr vifc_rmt_addr; /* IPIP tunnel addr */ + int ifindex; /* Local interface index */ }; #define VIFF_TUNNEL 0x1 /* IPIP tunnel */ #define VIFF_SRCRT 0x2 /* NI */ #define VIFF_REGISTER 0x4 /* register vif */ +#define VIFF_USE_IFINDEX 0x8 /* use ifindex to find an interface */ /* * Cache manipulation structures for mrouted and PIMd === modified file 'net/ipv4/ipmr.c' --- old/net/ipv4/ipmr.c 2009-08-10 11:17:32 +0000 +++ new/net/ipv4/ipmr.c 2009-08-11 22:15:24 +0000 @@ -470,6 +470,18 @@ return err; } break; + case VIFF_USE_IFINDEX: + dev = dev_get_by_index(net, vifc->ifindex); + if (!dev) + return -ENODEV; + if (dev->ip_ptr == NULL) + return -EADDRNOTAVAIL; + err = dev_set_allmulti(dev, 1); + if (err) { + dev_put(dev); + return err; + } + break; case 0: dev = ip_dev_find(net, vifc->vifc_lcl_addr.s_addr); if (!dev)