]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
raw: Stop using RTO_ONLINK.
authorGuillaume Nault <gnault@redhat.com>
Mon, 22 May 2023 14:38:02 +0000 (16:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 May 2023 07:22:06 +0000 (08:22 +0100)
Use ip_sendmsg_scope() to properly initialise the scope in
flowi4_init_output(), instead of overriding tos with the RTO_ONLINK
flag. The objective is to eventually remove RTO_ONLINK, which will
allow converting .flowi4_tos to dscp_t.

The MSG_DONTROUTE and SOCK_LOCALROUTE cases were already handled by
raw_sendmsg() (SOCK_LOCALROUTE was handled by the RT_CONN_FLAGS*()
macros called by get_rtconn_flags()). However, opt.is_strictroute
wasn't taken into account. Therefore, a side effect of this patch is to
now honour opt.is_strictroute, and thus align raw_sendmsg() with
ping_v4_sendmsg() and udp_sendmsg().

Since raw_sendmsg() was the only user of get_rtconn_flags(), we can now
remove this function.

Signed-off-by: Guillaume Nault <gnault@redhat.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip.h
net/ipv4/raw.c

index f1cb28d649e4b3e9a502ebf5dad31dff1c75c437..8a3860a916dc361d7a68a60d00135b38297b0614 100644 (file)
@@ -258,11 +258,6 @@ static inline __u8 get_rttos(struct ipcm_cookie* ipc, struct inet_sock *inet)
        return (ipc->tos != -1) ? RT_TOS(ipc->tos) : RT_TOS(inet->tos);
 }
 
-static inline __u8 get_rtconn_flags(struct ipcm_cookie* ipc, struct sock* sk)
-{
-       return (ipc->tos != -1) ? RT_CONN_FLAGS_TOS(sk, ipc->tos) : RT_CONN_FLAGS(sk);
-}
-
 /* datagram.c */
 int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
 int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
index ff712bf2a98d18289ec6b10482c2767d0ee19fbd..8b7b5c842bdd59af08b4968e9825f5683c0337ae 100644 (file)
@@ -476,10 +476,10 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        struct ipcm_cookie ipc;
        struct rtable *rt = NULL;
        struct flowi4 fl4;
+       u8 tos, scope;
        int free = 0;
        __be32 daddr;
        __be32 saddr;
-       u8  tos;
        int err;
        struct ip_options_data opt_copy;
        struct raw_frag_vec rfv;
@@ -572,9 +572,8 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                        daddr = ipc.opt->opt.faddr;
                }
        }
-       tos = get_rtconn_flags(&ipc, sk);
-       if (msg->msg_flags & MSG_DONTROUTE)
-               tos |= RTO_ONLINK;
+       tos = get_rttos(&ipc, inet);
+       scope = ip_sendmsg_scope(inet, &ipc, msg);
 
        if (ipv4_is_multicast(daddr)) {
                if (!ipc.oif || netif_index_is_l3_master(sock_net(sk), ipc.oif))
@@ -597,8 +596,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                }
        }
 
-       flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark, tos,
-                          RT_SCOPE_UNIVERSE,
+       flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark, tos, scope,
                           hdrincl ? IPPROTO_RAW : sk->sk_protocol,
                           inet_sk_flowi_flags(sk) |
                            (hdrincl ? FLOWI_FLAG_KNOWN_NH : 0),