| From f73b6cf4e83f2be42bf545a83c66a761450e0721 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 11 Dec 2018 11:12:55 -0800 |
| Subject: VSOCK: bind to random port for VMADDR_PORT_ANY |
| |
| From: Lepton Wu <ytht.net@gmail.com> |
| |
| [ Upstream commit 8236b08cf50f85bbfaf48910a0b3ee68318b7c4b ] |
| |
| The old code always starts from fixed port for VMADDR_PORT_ANY. Sometimes |
| when VMM crashed, there is still orphaned vsock which is waiting for |
| close timer, then it could cause connection time out for new started VM |
| if they are trying to connect to same port with same guest cid since the |
| new packets could hit that orphaned vsock. We could also fix this by doing |
| more in vhost_vsock_reset_orphans, but any way, it should be better to start |
| from a random local port instead of a fixed one. |
| |
| Signed-off-by: Lepton Wu <ytht.net@gmail.com> |
| Reviewed-by: Jorgen Hansen <jhansen@vmware.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/vmw_vsock/af_vsock.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c |
| index 7566395e526d2..18f377306884b 100644 |
| --- a/net/vmw_vsock/af_vsock.c |
| +++ b/net/vmw_vsock/af_vsock.c |
| @@ -97,6 +97,7 @@ |
| #include <linux/mutex.h> |
| #include <linux/net.h> |
| #include <linux/poll.h> |
| +#include <linux/random.h> |
| #include <linux/skbuff.h> |
| #include <linux/smp.h> |
| #include <linux/socket.h> |
| @@ -501,9 +502,13 @@ out: |
| static int __vsock_bind_stream(struct vsock_sock *vsk, |
| struct sockaddr_vm *addr) |
| { |
| - static u32 port = LAST_RESERVED_PORT + 1; |
| + static u32 port = 0; |
| struct sockaddr_vm new_addr; |
| |
| + if (!port) |
| + port = LAST_RESERVED_PORT + 1 + |
| + prandom_u32_max(U32_MAX - LAST_RESERVED_PORT); |
| + |
| vsock_addr_init(&new_addr, addr->svm_cid, addr->svm_port); |
| |
| if (addr->svm_port == VMADDR_PORT_ANY) { |
| -- |
| 2.20.1 |
| |