return ret;
 }
 
-static int vrf_finish_direct(struct net *net, struct sock *sk,
-                            struct sk_buff *skb)
+static void vrf_finish_direct(struct sk_buff *skb)
 {
        struct net_device *vrf_dev = skb->dev;
 
                skb_pull(skb, ETH_HLEN);
        }
 
-       return 1;
+       /* reset skb device */
+       nf_reset(skb);
 }
 
 #if IS_ENABLED(CONFIG_IPV6)
        return skb;
 }
 
+static int vrf_output6_direct_finish(struct net *net, struct sock *sk,
+                                    struct sk_buff *skb)
+{
+       vrf_finish_direct(skb);
+
+       return vrf_ip6_local_out(net, sk, skb);
+}
+
 static int vrf_output6_direct(struct net *net, struct sock *sk,
                              struct sk_buff *skb)
 {
+       int err = 1;
+
        skb->protocol = htons(ETH_P_IPV6);
 
-       return NF_HOOK_COND(NFPROTO_IPV6, NF_INET_POST_ROUTING,
-                           net, sk, skb, NULL, skb->dev,
-                           vrf_finish_direct,
-                           !(IPCB(skb)->flags & IPSKB_REROUTED));
+       if (!(IPCB(skb)->flags & IPSKB_REROUTED))
+               err = nf_hook(NFPROTO_IPV6, NF_INET_POST_ROUTING, net, sk, skb,
+                             NULL, skb->dev, vrf_output6_direct_finish);
+
+       if (likely(err == 1))
+               vrf_finish_direct(skb);
+
+       return err;
+}
+
+static int vrf_ip6_out_direct_finish(struct net *net, struct sock *sk,
+                                    struct sk_buff *skb)
+{
+       int err;
+
+       err = vrf_output6_direct(net, sk, skb);
+       if (likely(err == 1))
+               err = vrf_ip6_local_out(net, sk, skb);
+
+       return err;
 }
 
 static struct sk_buff *vrf_ip6_out_direct(struct net_device *vrf_dev,
        skb->dev = vrf_dev;
 
        err = nf_hook(NFPROTO_IPV6, NF_INET_LOCAL_OUT, net, sk,
-                     skb, NULL, vrf_dev, vrf_output6_direct);
+                     skb, NULL, vrf_dev, vrf_ip6_out_direct_finish);
 
        if (likely(err == 1))
                err = vrf_output6_direct(net, sk, skb);
 
-       /* reset skb device */
        if (likely(err == 1))
-               nf_reset(skb);
-       else
-               skb = NULL;
+               return skb;
 
-       return skb;
+       return NULL;
 }
 
 static struct sk_buff *vrf_ip6_out(struct net_device *vrf_dev,
        return skb;
 }
 
+static int vrf_output_direct_finish(struct net *net, struct sock *sk,
+                                   struct sk_buff *skb)
+{
+       vrf_finish_direct(skb);
+
+       return vrf_ip_local_out(net, sk, skb);
+}
+
 static int vrf_output_direct(struct net *net, struct sock *sk,
                             struct sk_buff *skb)
 {
+       int err = 1;
+
        skb->protocol = htons(ETH_P_IP);
 
-       return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING,
-                           net, sk, skb, NULL, skb->dev,
-                           vrf_finish_direct,
-                           !(IPCB(skb)->flags & IPSKB_REROUTED));
+       if (!(IPCB(skb)->flags & IPSKB_REROUTED))
+               err = nf_hook(NFPROTO_IPV4, NF_INET_POST_ROUTING, net, sk, skb,
+                             NULL, skb->dev, vrf_output_direct_finish);
+
+       if (likely(err == 1))
+               vrf_finish_direct(skb);
+
+       return err;
+}
+
+static int vrf_ip_out_direct_finish(struct net *net, struct sock *sk,
+                                   struct sk_buff *skb)
+{
+       int err;
+
+       err = vrf_output_direct(net, sk, skb);
+       if (likely(err == 1))
+               err = vrf_ip_local_out(net, sk, skb);
+
+       return err;
 }
 
 static struct sk_buff *vrf_ip_out_direct(struct net_device *vrf_dev,
        skb->dev = vrf_dev;
 
        err = nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, net, sk,
-                     skb, NULL, vrf_dev, vrf_output_direct);
+                     skb, NULL, vrf_dev, vrf_ip_out_direct_finish);
 
        if (likely(err == 1))
                err = vrf_output_direct(net, sk, skb);
 
-       /* reset skb device */
        if (likely(err == 1))
-               nf_reset(skb);
-       else
-               skb = NULL;
+               return skb;
 
-       return skb;
+       return NULL;
 }
 
 static struct sk_buff *vrf_ip_out(struct net_device *vrf_dev,