> > 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....@gmail.com> > --- > 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 > ab27a2872935..43a1dec08825 100644 > --- a/net/vmw_vsock/af_vsock.c > +++ b/net/vmw_vsock/af_vsock.c > @@ -107,6 +107,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> > @@ -504,9 +505,13 @@ static void vsock_pending_work(struct work_struct > *work) 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.0.405.gbc1bbc6f85-goog
Thanks for the update - looks good to me. Reviewed-by: Jorgen Hansen <jhan...@vmware.com> /jsh