raw: Stop using RTO_ONLINK.
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>
This commit is contained in:
parent
726de790f6
commit
c85be08fc4
|
@ -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);
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue