obj->ops->eval(obj, regs, pkt);
 }
 
+static int nft_objref_validate_obj_type(const struct nft_ctx *ctx, u32 type)
+{
+       unsigned int hooks;
+
+       switch (type) {
+       case NFT_OBJECT_SYNPROXY:
+               if (ctx->family != NFPROTO_IPV4 &&
+                   ctx->family != NFPROTO_IPV6 &&
+                   ctx->family != NFPROTO_INET)
+                       return -EOPNOTSUPP;
+
+               hooks = (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD);
+
+               return nft_chain_validate_hooks(ctx->chain, hooks);
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+static int nft_objref_validate(const struct nft_ctx *ctx,
+                              const struct nft_expr *expr)
+{
+       struct nft_object *obj = nft_objref_priv(expr);
+
+       return nft_objref_validate_obj_type(ctx, obj->ops->type->type);
+}
+
 static int nft_objref_init(const struct nft_ctx *ctx,
                           const struct nft_expr *expr,
                           const struct nlattr * const tb[])
        .activate       = nft_objref_activate,
        .deactivate     = nft_objref_deactivate,
        .dump           = nft_objref_dump,
+       .validate       = nft_objref_validate,
        .reduce         = NFT_REDUCE_READONLY,
 };
 
        nf_tables_destroy_set(ctx, priv->set);
 }
 
+static int nft_objref_map_validate(const struct nft_ctx *ctx,
+                                  const struct nft_expr *expr)
+{
+       const struct nft_objref_map *priv = nft_expr_priv(expr);
+
+       return nft_objref_validate_obj_type(ctx, priv->set->objtype);
+}
+
 static const struct nft_expr_ops nft_objref_map_ops = {
        .type           = &nft_objref_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_objref_map)),
        .deactivate     = nft_objref_map_deactivate,
        .destroy        = nft_objref_map_destroy,
        .dump           = nft_objref_map_dump,
+       .validate       = nft_objref_map_validate,
        .reduce         = NFT_REDUCE_READONLY,
 };