}
 
 static int kernel_bindconnect(struct socket *s, struct sockaddr *laddr,
-                             struct sockaddr *raddr)
+                             struct sockaddr *raddr, bool afonly)
 {
        int rv, flags = 0;
        size_t size = laddr->sa_family == AF_INET ?
         */
        sock_set_reuseaddr(s->sk);
 
+       if (afonly) {
+               rv = ip6_sock_set_v6only(s->sk);
+               if (rv)
+                       return rv;
+       }
+
        rv = s->ops->bind(s, laddr, size);
        if (rv < 0)
                return rv;
         * mode. Might be reconsidered for async connection setup at
         * TCP level.
         */
-       rv = kernel_bindconnect(s, laddr, raddr);
+       rv = kernel_bindconnect(s, laddr, raddr, id->afonly);
        if (rv != 0) {
                siw_dbg_qp(qp, "kernel_bindconnect: error %d\n", rv);
                goto error;
        } else {
                struct sockaddr_in6 *laddr = &to_sockaddr_in6(id->local_addr);
 
+               if (id->afonly) {
+                       rv = ip6_sock_set_v6only(s->sk);
+                       if (rv) {
+                               siw_dbg(id->device,
+                                       "ip6_sock_set_v6only erro: %d\n", rv);
+                               goto error;
+                       }
+               }
+
                /* For wildcard addr, limit binding to current device only */
                if (ipv6_addr_any(&laddr->sin6_addr))
                        s->sk->sk_bound_dev_if = sdev->netdev->ifindex;