struct sockaddr;
 
 int inet6_csk_bind_conflict(const struct sock *sk,
-                           const struct inet_bind_bucket *tb, bool relax);
+                           const struct inet_bind_bucket *tb, bool relax,
+                           bool soreuseport_ok);
 
 struct dst_entry *inet6_csk_route_req(const struct sock *sk, struct flowi6 *fl6,
                                      const struct request_sock *req, u8 proto);
 
 #endif
        void        (*addr2sockaddr)(struct sock *sk, struct sockaddr *);
        int         (*bind_conflict)(const struct sock *sk,
-                                    const struct inet_bind_bucket *tb, bool relax);
+                                    const struct inet_bind_bucket *tb,
+                                    bool relax, bool soreuseport_ok);
        void        (*mtu_reduced)(struct sock *sk);
 };
 
 struct sock *inet_csk_accept(struct sock *sk, int flags, int *err);
 
 int inet_csk_bind_conflict(const struct sock *sk,
-                          const struct inet_bind_bucket *tb, bool relax);
+                          const struct inet_bind_bucket *tb, bool relax,
+                          bool soreuseport_ok);
 int inet_csk_get_port(struct sock *sk, unsigned short snum);
 
 struct dst_entry *inet_csk_route_req(const struct sock *sk, struct flowi4 *fl4,
 
 EXPORT_SYMBOL(inet_get_local_port_range);
 
 int inet_csk_bind_conflict(const struct sock *sk,
-                          const struct inet_bind_bucket *tb, bool relax)
+                          const struct inet_bind_bucket *tb, bool relax,
+                          bool reuseport_ok)
 {
        struct sock *sk2;
-       int reuse = sk->sk_reuse;
-       int reuseport = sk->sk_reuseport;
+       bool reuse = sk->sk_reuse;
+       bool reuseport = !!sk->sk_reuseport && reuseport_ok;
        kuid_t uid = sock_i_uid((struct sock *)sk);
 
        /*
        struct inet_bind_bucket *tb;
        kuid_t uid = sock_i_uid(sk);
        u32 remaining, offset;
+       bool reuseport_ok = !!snum;
 
        if (port) {
 have_port:
                                        smallest_size = tb->num_owners;
                                        smallest_port = port;
                                }
-                               if (!inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb, false))
+                               if (!inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb, false,
+                                                                             reuseport_ok))
                                        goto tb_found;
                                goto next_port;
                        }
                      sk->sk_reuseport && uid_eq(tb->fastuid, uid))) &&
                    smallest_size == -1)
                        goto success;
-               if (inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb, true)) {
+               if (inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb, true,
+                                                            reuseport_ok)) {
                        if ((reuse ||
                             (tb->fastreuseport > 0 &&
                              sk->sk_reuseport &&
 
 #include <net/sock_reuseport.h>
 
 int inet6_csk_bind_conflict(const struct sock *sk,
-                           const struct inet_bind_bucket *tb, bool relax)
+                           const struct inet_bind_bucket *tb, bool relax,
+                           bool reuseport_ok)
 {
        const struct sock *sk2;
-       int reuse = sk->sk_reuse;
-       int reuseport = sk->sk_reuseport;
+       bool reuse = !!sk->sk_reuse;
+       bool reuseport = !!sk->sk_reuseport && reuseport_ok;
        kuid_t uid = sock_i_uid((struct sock *)sk);
 
        /* We must walk the whole port owner list in this case. -DaveM */