|
@@ -344,12 +344,16 @@ static unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst)
|
|
|
|
|
|
|
|
static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu)
|
|
static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu)
|
|
|
{
|
|
{
|
|
|
- if (skb->len <= mtu || skb->local_df)
|
|
|
|
|
|
|
+ if (skb->len <= mtu)
|
|
|
return false;
|
|
return false;
|
|
|
|
|
|
|
|
|
|
+ /* ipv6 conntrack defrag sets max_frag_size + local_df */
|
|
|
if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu)
|
|
if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu)
|
|
|
return true;
|
|
return true;
|
|
|
|
|
|
|
|
|
|
+ if (skb->local_df)
|
|
|
|
|
+ return false;
|
|
|
|
|
+
|
|
|
if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu)
|
|
if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu)
|
|
|
return false;
|
|
return false;
|
|
|
|
|
|