return psock;
 }
 
-static bool sock_map_redirect_allowed(const struct sock *sk);
-
 static int sock_map_link(struct bpf_map *map, struct sock *sk)
 {
        struct sk_psock_progs *progs = sock_map_progs(map);
        struct sk_psock *psock;
        int ret;
 
-       /* Only sockets we can redirect into/from in BPF need to hold
-        * refs to parser/verdict progs and have their sk_data_ready
-        * and sk_write_space callbacks overridden.
-        */
-       if (!sock_map_redirect_allowed(sk))
-               goto no_progs;
-
        stream_verdict = READ_ONCE(progs->stream_verdict);
        if (stream_verdict) {
                stream_verdict = bpf_prog_inc_not_zero(stream_verdict);
                }
        }
 
-no_progs:
        psock = sock_map_psock_get_checked(sk);
        if (IS_ERR(psock)) {
                ret = PTR_ERR(psock);
               sk->sk_protocol == IPPROTO_TCP;
 }
 
-static bool sk_is_udp(const struct sock *sk)
-{
-       return sk->sk_type == SOCK_DGRAM &&
-              sk->sk_protocol == IPPROTO_UDP;
-}
-
 static bool sock_map_redirect_allowed(const struct sock *sk)
 {
        if (sk_is_tcp(sk))
 {
        if (sk_is_tcp(sk))
                return (1 << sk->sk_state) & (TCPF_ESTABLISHED | TCPF_LISTEN);
-       else if (sk_is_udp(sk))
-               return sk_hashed(sk);
-
-       return false;
+       return true;
 }
 
 static int sock_hash_update_common(struct bpf_map *map, void *key,
 
 static void udp_bpf_rebuild_protos(struct proto *prot, const struct proto *base)
 {
        *prot        = *base;
-       prot->unhash = sock_map_unhash;
        prot->close  = sock_map_close;
        prot->recvmsg = udp_bpf_recvmsg;
 }
 
        errno = 0;
        value = s;
        err = bpf_map_update_elem(mapfd, &key, &value, BPF_NOEXIST);
-       if (!err || errno != EOPNOTSUPP)
-               FAIL_ERRNO("map_update: expected EOPNOTSUPP");
-
+       if (sotype == SOCK_STREAM) {
+               if (!err || errno != EOPNOTSUPP)
+                       FAIL_ERRNO("map_update: expected EOPNOTSUPP");
+       } else if (err)
+               FAIL_ERRNO("map_update: expected success");
        xclose(s);
 }