aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/raw.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-10-07 04:27:51 -0700
committerDavid S. Miller <davem@davemloft.net>2015-10-07 04:27:51 -0700
commit390a4bee5c2ade628565dd21fb5d8656a58f7804 (patch)
tree237b14ce30a495aa106b8e4710202f058dcd2834 /net/ipv4/raw.c
parentnet: Fix vti use case with oif in dst lookups for IPv6 (diff)
parentnet: Add l3mdev saddr lookup to raw_sendmsg (diff)
downloadlinux-dev-390a4bee5c2ade628565dd21fb5d8656a58f7804.tar.xz
linux-dev-390a4bee5c2ade628565dd21fb5d8656a58f7804.zip
Merge branch 'l3mdev_saddr_op'
David Ahern says: ==================== net: Add saddr op to l3mdev and vrf First 2 patches are re-sends of patches that got lost in the ethosphere Tuesday; they were part of the first round of l3mdev conversions. Next 3 handle the source address lookup for raw and datagram sockets bound to a VRF device. The conversion to the get_saddr op also fixes locally originated TCP packets showing up at the VRF device. The use of the FLOWI_FLAG_L3MDEV_SRC flag in ip_route_connect_init was causing locally generated packets to skip the VRF device. v2 - rebased to top of net-next per device delete fix and hash based multipath patches ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/raw.c')
-rw-r--r--net/ipv4/raw.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 28ef8a913130..09a07e8b2f35 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -484,6 +484,7 @@ static int raw_getfrag(void *from, char *to, int offset, int len, int odd,
static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
{
struct inet_sock *inet = inet_sk(sk);
+ struct net *net = sock_net(sk);
struct ipcm_cookie ipc;
struct rtable *rt = NULL;
struct flowi4 fl4;
@@ -543,7 +544,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
ipc.oif = sk->sk_bound_dev_if;
if (msg->msg_controllen) {
- err = ip_cmsg_send(sock_net(sk), msg, &ipc, false);
+ err = ip_cmsg_send(net, msg, &ipc, false);
if (err)
goto out;
if (ipc.opt)
@@ -598,6 +599,9 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
(inet->hdrincl ? FLOWI_FLAG_KNOWN_NH : 0),
daddr, saddr, 0, 0);
+ if (!saddr && ipc.oif)
+ l3mdev_get_saddr(net, ipc.oif, &fl4);
+
if (!inet->hdrincl) {
rfv.msg = msg;
rfv.hlen = 0;
@@ -608,7 +612,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
}
security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
- rt = ip_route_output_flow(sock_net(sk), &fl4, sk);
+ rt = ip_route_output_flow(net, &fl4, sk);
if (IS_ERR(rt)) {
err = PTR_ERR(rt);
rt = NULL;