Thread (3 messages) flat view 3 messages, 2 authors, 2016-02-26

Re: [PATCH] ipv4: do not cache local route when using SO_BINDTODEVICE

From: David Miller <davem@davemloft.net>
Date: 2016-02-25 19:31:09

From: Kouya Shimura <redacted>
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 <redacted>
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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help