|
@@ -3082,22 +3082,32 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
|
|
|
if (sg && csum && (mss != GSO_BY_FRAGS)) {
|
|
|
if (!(features & NETIF_F_GSO_PARTIAL)) {
|
|
|
struct sk_buff *iter;
|
|
|
+ unsigned int frag_len;
|
|
|
|
|
|
if (!list_skb ||
|
|
|
!net_gso_ok(features, skb_shinfo(head_skb)->gso_type))
|
|
|
goto normal;
|
|
|
|
|
|
- /* Split the buffer at the frag_list pointer.
|
|
|
- * This is based on the assumption that all
|
|
|
- * buffers in the chain excluding the last
|
|
|
- * containing the same amount of data.
|
|
|
+ /* If we get here then all the required
|
|
|
+ * GSO features except frag_list are supported.
|
|
|
+ * Try to split the SKB to multiple GSO SKBs
|
|
|
+ * with no frag_list.
|
|
|
+ * Currently we can do that only when the buffers don't
|
|
|
+ * have a linear part and all the buffers except
|
|
|
+ * the last are of the same length.
|
|
|
*/
|
|
|
+ frag_len = list_skb->len;
|
|
|
skb_walk_frags(head_skb, iter) {
|
|
|
+ if (frag_len != iter->len && iter->next)
|
|
|
+ goto normal;
|
|
|
if (skb_headlen(iter) && !iter->head_frag)
|
|
|
goto normal;
|
|
|
|
|
|
len -= iter->len;
|
|
|
}
|
|
|
+
|
|
|
+ if (len != frag_len)
|
|
|
+ goto normal;
|
|
|
}
|
|
|
|
|
|
/* GSO partial only requires that we trim off any excess that
|