static bool ip_exceeds_mtu(const struct sk_buff *skb, unsigned int mtu) { if (skb->len <= mtu) return false; if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) return false; return true; }
static bool mpls_pkt_too_big(const struct sk_buff *skb, unsigned int mtu) { if (skb->len <= mtu) return false; if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) return false; return true; }
static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu) { if (skb->len <= mtu || skb->local_df) return false; if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu) return true; if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) return false; return true; }
static bool ip_gso_exceeds_dst_mtu(const struct sk_buff *skb) { unsigned int mtu; if (skb->local_df || !skb_is_gso(skb)) return false; mtu = ip_dst_mtu_maybe_forward(skb_dst(skb), true); /* if seglen > mtu, do software segmentation for IP fragmentation on * output. DF bit cannot be set since ip_forward would have sent * icmp error. */ return skb_gso_network_seglen(skb) > mtu; }
static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu) { if (skb->len <= mtu) return false; /* ipv6 conntrack defrag sets max_frag_size + ignore_df */ if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu) return true; if (skb->ignore_df) return false; if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) return false; return true; }