lkml.org 
[lkml]   [2019]   [Jan]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.20 057/117] net: call sk_dst_reset when set SO_DONTROUTE
    Date
    From: yupeng <yupeng0921@gmail.com>

    [ Upstream commit 0fbe82e628c817e292ff588cd5847fc935e025f2 ]

    after set SO_DONTROUTE to 1, the IP layer should not route packets if
    the dest IP address is not in link scope. But if the socket has cached
    the dst_entry, such packets would be routed until the sk_dst_cache
    expires. So we should clean the sk_dst_cache when a user set
    SO_DONTROUTE option. Below are server/client python scripts which
    could reprodue this issue:

    server side code:

    ==========================================================================
    import socket
    import struct
    import time

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('0.0.0.0', 9000))
    s.listen(1)
    sock, addr = s.accept()
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_DONTROUTE, struct.pack('i', 1))
    while True:
    sock.send(b'foo')
    time.sleep(1)
    ==========================================================================

    client side code:
    ==========================================================================
    import socket
    import time

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('server_address', 9000))
    while True:
    data = s.recv(1024)
    print(data)
    ==========================================================================

    Signed-off-by: yupeng <yupeng0921@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/core/sock.c | 1 +
    1 file changed, 1 insertion(+)

    diff --git a/net/core/sock.c b/net/core/sock.c
    index 080a880a1761..1d0e5ba366a9 100644
    --- a/net/core/sock.c
    +++ b/net/core/sock.c
    @@ -698,6 +698,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
    break;
    case SO_DONTROUTE:
    sock_valbool_flag(sk, SOCK_LOCALROUTE, valbool);
    + sk_dst_reset(sk);
    break;
    case SO_BROADCAST:
    sock_valbool_flag(sk, SOCK_BROADCAST, valbool);
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-01-08 21:07    [W:2.135 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site