return ret;
 }
 
+static int ip6_finish_output_gso(struct net *net, struct sock *sk,
+                                struct sk_buff *skb, unsigned int mtu)
+{
+       if (!(IP6CB(skb)->flags & IP6SKB_FAKEJUMBO) &&
+           !skb_gso_validate_network_len(skb, mtu))
+               return ip6_finish_output_gso_slowpath_drop(net, sk, skb, mtu);
+
+       return ip6_finish_output2(net, sk, skb);
+}
+
 static int __ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
        unsigned int mtu;
 #endif
 
        mtu = ip6_skb_dst_mtu(skb);
-       if (skb_is_gso(skb) &&
-           !(IP6CB(skb)->flags & IP6SKB_FAKEJUMBO) &&
-           !skb_gso_validate_network_len(skb, mtu))
-               return ip6_finish_output_gso_slowpath_drop(net, sk, skb, mtu);
+       if (skb_is_gso(skb))
+               return ip6_finish_output_gso(net, sk, skb, mtu);
 
-       if ((skb->len > mtu && !skb_is_gso(skb)) ||
+       if (skb->len > mtu ||
            (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size))
                return ip6_fragment(net, sk, skb, ip6_finish_output2);
-       else
-               return ip6_finish_output2(net, sk, skb);
+
+       return ip6_finish_output2(net, sk, skb);
 }
 
 static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb)