sock: Reset dst when changing sk_mark via setsockopt
Subsystems (3)
PATCH v3 1/1 sock: Reset dst when changing sk_mark via setsockopt
When setting the SO_MARK socket option, if the mark changes, the dst needs to be reset so that a new route lookup is performed.
This fixes the case where an application wants to change routing by setting a new sk_mark. If this is done after some packets have already been sent, the dst is cached and has no effect.
--- net/core/sock.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/core/sock.c +4 -2
@@ -952,10 +952,12 @@ int sock_setsockopt(struct socket *sock, int level, int optname,clear_bit (SOCK_PASSSEC , &sock->flags);break ;case SO_MARK : -if (!ns_capable (sock_net (sk)->user_ns,CAP_NET_ADMIN )) +if (!ns_capable (sock_net (sk)->user_ns,CAP_NET_ADMIN )) { ret = -EPERM ; -else + }else if (val != sk->sk_mark) { sk->sk_mark = val; +sk_dst_reset (sk); + }break ;case SO_RXQ_OVFL :
Signature · 1 line
2.14.5
Quoted 9 lines · David Barmann
When setting the
SO_MARKsocket option, if the mark changes, the dst needs to be reset so that a new route lookup is performed.This fixes the case where an application wants to change routing by setting a new
sk_mark. If this is done after some packets have already been sent, the dst is cached and has no effect.Signed-off-by David Barmann <[email protected]>---
Thanks David !
From: David Barmann <[email protected]>
Date: Thu, 8 Nov 2018 08:13:35 -0600
Quoted 8 lines
When setting the
SO_MARKsocket option, if the mark changes, the dst needs to be reset so that a new route lookup is performed.This fixes the case where an application wants to change routing by setting a new
sk_mark. If this is done after some packets have already been sent, the dst is cached and has no effect.Signed-off-by David Barmann <[email protected]>
Applied.