mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-27 20:13:57 +08:00
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>
This commit is contained in:
parent
e3dd762772
commit
da5095d052
@ -30,6 +30,7 @@ struct udp_port_cfg {
|
||||
|
||||
__be16 local_udp_port;
|
||||
__be16 peer_udp_port;
|
||||
int bind_ifindex;
|
||||
unsigned int use_udp_checksums:1,
|
||||
use_udp6_tx_checksums:1,
|
||||
use_udp6_rx_checksums:1,
|
||||
|
@ -20,6 +20,23 @@ int udp_sock_create4(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;
|
||||
}
|
||||
|
||||
udp_addr.sin_family = AF_INET;
|
||||
udp_addr.sin_addr = cfg->local_ip;
|
||||
udp_addr.sin_port = cfg->local_udp_port;
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user