fl6.flowi6_oif = np->ucast_oif;
        security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
 
+       if (inet->hdrincl)
+               fl6.flowi6_flags |= FLOWI_FLAG_KNOWN_NH;
+
        dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
        if (IS_ERR(dst)) {
                err = PTR_ERR(dst);
 
 #ifdef CONFIG_IP_VS_IPV6
 static struct dst_entry *
 __ip_vs_route_output_v6(struct net *net, struct in6_addr *daddr,
-                       struct in6_addr *ret_saddr, int do_xfrm)
+                       struct in6_addr *ret_saddr, int do_xfrm, int rt_mode)
 {
        struct dst_entry *dst;
        struct flowi6 fl6 = {
                .daddr = *daddr,
        };
 
+       if (rt_mode & IP_VS_RT_MODE_KNOWN_NH)
+               fl6.flowi6_flags = FLOWI_FLAG_KNOWN_NH;
+
        dst = ip6_route_output(net, NULL, &fl6);
        if (dst->error)
                goto out_err;
                        }
                        dst = __ip_vs_route_output_v6(net, &dest->addr.in6,
                                                      &dest_dst->dst_saddr.in6,
-                                                     do_xfrm);
+                                                     do_xfrm, rt_mode);
                        if (!dst) {
                                __ip_vs_dst_set(dest, NULL, NULL, 0);
                                spin_unlock_bh(&dest->dst_lock);
                        *ret_saddr = dest_dst->dst_saddr.in6;
        } else {
                noref = 0;
-               dst = __ip_vs_route_output_v6(net, daddr, ret_saddr, do_xfrm);
+               dst = __ip_vs_route_output_v6(net, daddr, ret_saddr, do_xfrm,
+                                             rt_mode);
                if (!dst)
                        goto err_unreach;
                rt = (struct rt6_info *) dst;
        local = __ip_vs_get_out_rt_v6(cp->af, skb, cp->dest, &cp->daddr.in6,
                                      NULL, ipvsh, 0,
                                      IP_VS_RT_MODE_LOCAL |
-                                     IP_VS_RT_MODE_NON_LOCAL);
+                                     IP_VS_RT_MODE_NON_LOCAL |
+                                     IP_VS_RT_MODE_KNOWN_NH);
        if (local < 0)
                goto tx_error;
        if (local) {
 
        fl6.daddr = info->gw.in6;
        fl6.flowlabel = ((iph->flow_lbl[0] & 0xF) << 16) |
                           (iph->flow_lbl[1] << 8) | iph->flow_lbl[2];
+       fl6.flowi6_flags = FLOWI_FLAG_KNOWN_NH;
        dst = ip6_route_output(net, NULL, &fl6);
        if (dst->error) {
                dst_release(dst);