> 
> 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

Reply via email to