return sk->sk_family == AF_UNIX && sk->sk_type == SOCK_STREAM;
 }
 
+static inline bool sk_is_vsock(const struct sock *sk)
+{
+       return sk->sk_family == AF_VSOCK;
+}
+
 /**
  * sk_eat_skb - Release a skb if it is no longer needed
  * @sk: socket to eat this skb from
 
        sk = __sock_map_lookup_elem(map, key);
        if (unlikely(!sk || !sock_map_redirect_allowed(sk)))
                return SK_DROP;
+       if ((flags & BPF_F_INGRESS) && sk_is_vsock(sk))
+               return SK_DROP;
 
        skb_bpf_set_redir(skb, sk, flags & BPF_F_INGRESS);
        return SK_PASS;
                return SK_DROP;
        if (!(flags & BPF_F_INGRESS) && !sk_is_tcp(sk))
                return SK_DROP;
+       if (sk_is_vsock(sk))
+               return SK_DROP;
 
        msg->flags = flags;
        msg->sk_redir = sk;
        sk = __sock_hash_lookup_elem(map, key);
        if (unlikely(!sk || !sock_map_redirect_allowed(sk)))
                return SK_DROP;
+       if ((flags & BPF_F_INGRESS) && sk_is_vsock(sk))
+               return SK_DROP;
 
        skb_bpf_set_redir(skb, sk, flags & BPF_F_INGRESS);
        return SK_PASS;
                return SK_DROP;
        if (!(flags & BPF_F_INGRESS) && !sk_is_tcp(sk))
                return SK_DROP;
+       if (sk_is_vsock(sk))
+               return SK_DROP;
 
        msg->flags = flags;
        msg->sk_redir = sk;