Message ID | 20181001084023.32310-1-mmanning@vyatta.att-mail.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | [net-next] ipv4: Allow sending multicast packets on specific i/f using VRF socket | expand |
On 10/1/18 2:40 AM, Mike Manning wrote: > From: Robert Shearman <rshearma@vyatta.att-mail.com> > > It is useful to be able to use the same socket for listening in a > specific VRF, as for sending multicast packets out of a specific > interface. However, the bound device on the socket currently takes > precedence and results in the packets not being sent. > > Relax the condition on overriding the output interface to use for > sending packets out of UDP, raw and ping sockets to allow multicast > packets to be sent using the specified multicast interface. > > Signed-off-by: Robert Shearman <rshearma@vyatta.att-mail.com> > Signed-off-by: Mike Manning <mmanning@vyatta.att-mail.com> > --- > net/ipv4/datagram.c | 2 +- > net/ipv4/ping.c | 2 +- > net/ipv4/raw.c | 2 +- > net/ipv4/udp.c | 2 +- > 4 files changed, 4 insertions(+), 4 deletions(-) > Reviewed-by: David Ahern <dsahern@gmail.com>
From: Mike Manning <mmanning@vyatta.att-mail.com> Date: Mon, 1 Oct 2018 09:40:23 +0100 > From: Robert Shearman <rshearma@vyatta.att-mail.com> > > It is useful to be able to use the same socket for listening in a > specific VRF, as for sending multicast packets out of a specific > interface. However, the bound device on the socket currently takes > precedence and results in the packets not being sent. > > Relax the condition on overriding the output interface to use for > sending packets out of UDP, raw and ping sockets to allow multicast > packets to be sent using the specified multicast interface. > > Signed-off-by: Robert Shearman <rshearma@vyatta.att-mail.com> > Signed-off-by: Mike Manning <mmanning@vyatta.att-mail.com> Applied.
diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c index f915abff1350..300921417f89 100644 --- a/net/ipv4/datagram.c +++ b/net/ipv4/datagram.c @@ -42,7 +42,7 @@ int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len oif = sk->sk_bound_dev_if; saddr = inet->inet_saddr; if (ipv4_is_multicast(usin->sin_addr.s_addr)) { - if (!oif) + if (!oif || netif_index_is_l3_master(sock_net(sk), oif)) oif = inet->mc_index; if (!saddr) saddr = inet->mc_addr; diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index 8d7aaf118a30..7ccb5f87f70b 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c @@ -779,7 +779,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) } if (ipv4_is_multicast(daddr)) { - if (!ipc.oif) + if (!ipc.oif || netif_index_is_l3_master(sock_net(sk), ipc.oif)) ipc.oif = inet->mc_index; if (!saddr) saddr = inet->mc_addr; diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 33df4d76db2d..8ca3eb06ba04 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -608,7 +608,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) tos |= RTO_ONLINK; if (ipv4_is_multicast(daddr)) { - if (!ipc.oif) + if (!ipc.oif || netif_index_is_l3_master(sock_net(sk), ipc.oif)) ipc.oif = inet->mc_index; if (!saddr) saddr = inet->mc_addr; diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index f4e35b2ff8b8..3386b3b0218c 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1042,7 +1042,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) } if (ipv4_is_multicast(daddr)) { - if (!ipc.oif) + if (!ipc.oif || netif_index_is_l3_master(sock_net(sk), ipc.oif)) ipc.oif = inet->mc_index; if (!saddr) saddr = inet->mc_addr;