From: Kouya Shimura <ko...@jp.fujitsu.com>
Date: Tue, 23 Feb 2016 14:27:32 +0900

> After v3.6, output routes are cached, however, the 'rt_iif' field of
> struct rtable can not be shared by various traffics using SO_BINDTODEVICE.
> It causes that traffic can not reach the local receiver which also uses 
> SO_BINDTODEVICE after another traffic creates a local route cache. 
> 
>   /* sender and receiver are running on same host. */
>   sender:
>     - socket(SOCK_DGRAM)
>     - setsockopt(SO_BINDTODEVICE, "eth0")
>     - connect(INADDR_ANY)
>     - send("message") ------>[loopback]------+
>                                              |
>   receiver:                                  |
>     - socket(SOCK_DGRAM)                     |
>     - setsockopt(SO_BINDTODEVICE, "eth0")    |
>     - bind(INADDR_ANY)                       |
>     - recv()  <------------------------------+
>       /* sometimes reach, sometimes not reach!!! */
> 
> Before v3.6, above traffics always reached. It seems to be a
> regression. Actually the 'dhcp_release' command relies on it.
> 
> Commit 7bd86cc282a458b66c41e3f6 ("ipv4: Cache local output routes")
> originated this issue. Revert it conditionally.
> 
> Signed-off-by: Kouya Shimura <ko...@jp.fujitsu.com>

I strongly fear that this will cause a performance regression for some important
cases.  If you elide the cache, it means that every route lookup has to 
allocate,
create, and destroy the cache object.  This is really expensive.

There has to be a better way to do so, so I'm not applying this patch, sorry.

Reply via email to