summaryrefslogtreecommitdiff
path: root/net/ipv6/ip6_udp_tunnel.c
diff options
context:
space:
mode:
authorAlexis Bauvin <abauvin@scaleway.com>2018-12-03 10:54:38 +0100
committerDavid S. Miller <davem@davemloft.net>2018-12-03 14:15:26 -0800
commitda5095d052860baa7fe2932fb1209628dd3e3813 (patch)
tree1a06b12df1f9c1e536477a1bf2b7ff9f8b6e0755 /net/ipv6/ip6_udp_tunnel.c
parente3dd7627721fce191fd696d8654aa55cc20c1d6f (diff)
udp_tunnel: add config option to bind to a device
UDP tunnel sockets are always opened unbound to a specific device. This patch allow the socket to be bound on a custom device, which incidentally makes UDP tunnels VRF-aware if binding to an l3mdev. Signed-off-by: Alexis Bauvin <abauvin@scaleway.com> Reviewed-by: Amine Kherbouche <akherbouche@scaleway.com> Tested-by: Amine Kherbouche <akherbouche@scaleway.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ip6_udp_tunnel.c')
-rw-r--r--net/ipv6/ip6_udp_tunnel.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/net/ipv6/ip6_udp_tunnel.c b/net/ipv6/ip6_udp_tunnel.c
index b283f293ee4a..3965d5396b0a 100644
--- a/net/ipv6/ip6_udp_tunnel.c
+++ b/net/ipv6/ip6_udp_tunnel.c
@@ -31,6 +31,22 @@ int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
if (err < 0)
goto error;
}
+ if (cfg->bind_ifindex) {
+ struct net_device *dev;
+
+ dev = dev_get_by_index(net, cfg->bind_ifindex);
+ if (!dev) {
+ err = -ENODEV;
+ goto error;
+ }
+
+ err = kernel_setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE,
+ dev->name, strlen(dev->name) + 1);
+ dev_put(dev);
+
+ if (err < 0)
+ goto error;
+ }
udp6_addr.sin6_family = AF_INET6;
memcpy(&udp6_addr.sin6_addr, &cfg->local_ip6,