Index: transport_tcp.c =================================================================== --- transport_tcp.c (revision 42089) +++ transport_tcp.c (working copy) @@ -415,18 +415,27 @@ { int ret; struct sockaddr_in6 sin6; + struct sockaddr_in sin; struct socket *ksmbd_socket; - + bool ipv4 = false; + ret = sock_create(PF_INET6, SOCK_STREAM, IPPROTO_TCP, &ksmbd_socket); if (ret) { - ksmbd_err("Can't create socket: %d\n", ret); - goto out_error; + ksmbd_err("Can't create socket for ipv6, try ipv4: %d\n", ret); + ret = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &ksmbd_socket); + if (ret) { + ksmbd_err("Can't create socket for ipv4: %d\n", ret); + goto out_error; + } + sin.sin_family = PF_INET; + sin.sin_addr.s_addr = INADDR_ANY; + sin.sin_port = htons(server_conf.tcp_port); + ipv4 = true; + } else { + sin6.sin6_family = PF_INET6; + sin6.sin6_addr = in6addr_any; + sin6.sin6_port = htons(server_conf.tcp_port); } - - sin6.sin6_family = PF_INET6; - sin6.sin6_addr = in6addr_any; - sin6.sin6_port = htons(server_conf.tcp_port); - ksmbd_tcp_nodelay(ksmbd_socket); ksmbd_tcp_reuseaddr(ksmbd_socket); @@ -439,8 +448,11 @@ ksmbd_err("Failed to set SO_BINDTODEVICE: %d\n", ret); goto out_error; } - - ret = kernel_bind(ksmbd_socket, (struct sockaddr *)&sin6, sizeof(sin6)); + + if (ipv4) + ret = kernel_bind(ksmbd_socket, (struct sockaddr *)&sin, sizeof(sin)); + else + ret = kernel_bind(ksmbd_socket, (struct sockaddr *)&sin6, sizeof(sin6)); if (ret) { ksmbd_err("Failed to bind socket: %d\n", ret); goto out_error;