ipv4: Set the routing scope properly in ip_route_output_ports().
Set scope automatically in ip_route_output_ports() (using the socket SOCK_LOCALROUTE flag). This way, callers don't have to overload the tos with the RTO_ONLINK flag, like RT_CONN_FLAGS() does. For callers that don't pass a struct sock, this doesn't change anything as the scope is still set to RT_SCOPE_UNIVERSE when sk is NULL. Callers that passed a struct sock and used RT_CONN_FLAGS(sk) or RT_CONN_FLAGS_TOS(sk, tos) for the tos are modified to use ip_sock_tos(sk) and RT_TOS(tos) respectively, as overloading tos with the RTO_ONLINK flag now becomes unnecessary. In drivers/net/amt.c, all ip_route_output_ports() calls use a 0 tos parameter, ignoring the SOCK_LOCALROUTE flag of the socket. But the sk parameter is a kernel socket, which doesn't have any configuration path for setting SOCK_LOCALROUTE anyway. Therefore, ip_route_output_ports() will continue to initialise scope with RT_SCOPE_UNIVERSE and amt.c doesn't need to be modified. Also, remove RT_CONN_FLAGS() and RT_CONN_FLAGS_TOS() from route.h as these macros are now unused. The objective is to eventually remove RTO_ONLINK entirely to allow converting ->flowi4_tos to dscp_t. This will ensure proper isolation between the DSCP and ECN bits, thus minimising the risk of introducing bugs where TOS values interfere with ECN. Signed-off-by: Guillaume Nault <gnault@redhat.com> Reviewed-by: David Ahern <dsahern@kernel.org> Link: https://lore.kernel.org/r/dacfd2ab40685e20959ab7b53c427595ba229e7d.1707496938.git.gnault@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
f25e7b8263
commit
a3522a2edb
@ -37,9 +37,6 @@
|
||||
|
||||
#define RTO_ONLINK 0x01
|
||||
|
||||
#define RT_CONN_FLAGS(sk) (RT_TOS(READ_ONCE(inet_sk(sk)->tos)) | sock_flag(sk, SOCK_LOCALROUTE))
|
||||
#define RT_CONN_FLAGS_TOS(sk,tos) (RT_TOS(tos) | sock_flag(sk, SOCK_LOCALROUTE))
|
||||
|
||||
static inline __u8 ip_sock_rt_scope(const struct sock *sk)
|
||||
{
|
||||
if (sock_flag(sk, SOCK_LOCALROUTE))
|
||||
@ -163,8 +160,8 @@ static inline struct rtable *ip_route_output_ports(struct net *net, struct flowi
|
||||
__u8 proto, __u8 tos, int oif)
|
||||
{
|
||||
flowi4_init_output(fl4, oif, sk ? READ_ONCE(sk->sk_mark) : 0, tos,
|
||||
RT_SCOPE_UNIVERSE, proto,
|
||||
sk ? inet_sk_flowi_flags(sk) : 0,
|
||||
sk ? ip_sock_rt_scope(sk) : RT_SCOPE_UNIVERSE,
|
||||
proto, sk ? inet_sk_flowi_flags(sk) : 0,
|
||||
daddr, saddr, dport, sport, sock_net_uid(net, sk));
|
||||
if (sk)
|
||||
security_sk_classify_flow(sk, flowi4_to_flowi_common(fl4));
|
||||
|
@ -1326,7 +1326,7 @@ int inet_sk_rebuild_header(struct sock *sk)
|
||||
fl4 = &inet->cork.fl.u.ip4;
|
||||
rt = ip_route_output_ports(sock_net(sk), fl4, sk, daddr, inet->inet_saddr,
|
||||
inet->inet_dport, inet->inet_sport,
|
||||
sk->sk_protocol, RT_CONN_FLAGS(sk),
|
||||
sk->sk_protocol, ip_sock_rt_tos(sk),
|
||||
sk->sk_bound_dev_if);
|
||||
if (!IS_ERR(rt)) {
|
||||
err = 0;
|
||||
|
@ -119,7 +119,7 @@ void ip4_datagram_release_cb(struct sock *sk)
|
||||
rt = ip_route_output_ports(sock_net(sk), &fl4, sk, daddr,
|
||||
inet->inet_saddr, inet->inet_dport,
|
||||
inet->inet_sport, sk->sk_protocol,
|
||||
RT_CONN_FLAGS(sk), sk->sk_bound_dev_if);
|
||||
ip_sock_rt_tos(sk), sk->sk_bound_dev_if);
|
||||
|
||||
dst = !IS_ERR(rt) ? &rt->dst : NULL;
|
||||
sk_dst_set(sk, dst);
|
||||
|
@ -1467,7 +1467,7 @@ static struct dst_entry *inet_csk_rebuild_route(struct sock *sk, struct flowi *f
|
||||
rt = ip_route_output_ports(sock_net(sk), fl4, sk, daddr,
|
||||
inet->inet_saddr, inet->inet_dport,
|
||||
inet->inet_sport, sk->sk_protocol,
|
||||
RT_CONN_FLAGS(sk), sk->sk_bound_dev_if);
|
||||
ip_sock_rt_tos(sk), sk->sk_bound_dev_if);
|
||||
if (IS_ERR(rt))
|
||||
rt = NULL;
|
||||
if (rt)
|
||||
|
@ -493,7 +493,7 @@ int __ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
|
||||
inet->inet_dport,
|
||||
inet->inet_sport,
|
||||
sk->sk_protocol,
|
||||
RT_CONN_FLAGS_TOS(sk, tos),
|
||||
RT_TOS(tos),
|
||||
sk->sk_bound_dev_if);
|
||||
if (IS_ERR(rt))
|
||||
goto no_route;
|
||||
|
@ -478,7 +478,7 @@ static int l2tp_ip_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
||||
rt = ip_route_output_ports(sock_net(sk), fl4, sk,
|
||||
daddr, inet->inet_saddr,
|
||||
inet->inet_dport, inet->inet_sport,
|
||||
sk->sk_protocol, RT_CONN_FLAGS(sk),
|
||||
sk->sk_protocol, ip_sock_rt_tos(sk),
|
||||
sk->sk_bound_dev_if);
|
||||
if (IS_ERR(rt))
|
||||
goto no_route;
|
||||
|
Loading…
Reference in New Issue
Block a user