gso: Only allow GSO_PARTIAL if we can checksum the inner protocol
This patch addresses a possible issue that can occur if we get into any odd corner cases where we support TSO for a given protocol but not the checksum or scatter-gather offload. There are few drivers floating around that setup their tunnels this way and by enforcing the checksum piece we can avoid mangling any frames. Signed-off-by: Alexander Duyck <aduyck@mirantis.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d7fb5a8049
commit
36c983824b
|
@ -3080,8 +3080,7 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
|
||||||
unsigned int headroom;
|
unsigned int headroom;
|
||||||
unsigned int len = head_skb->len;
|
unsigned int len = head_skb->len;
|
||||||
__be16 proto;
|
__be16 proto;
|
||||||
bool csum;
|
bool csum, sg;
|
||||||
int sg = !!(features & NETIF_F_SG);
|
|
||||||
int nfrags = skb_shinfo(head_skb)->nr_frags;
|
int nfrags = skb_shinfo(head_skb)->nr_frags;
|
||||||
int err = -ENOMEM;
|
int err = -ENOMEM;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -3093,13 +3092,14 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,
|
||||||
if (unlikely(!proto))
|
if (unlikely(!proto))
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
|
sg = !!(features & NETIF_F_SG);
|
||||||
csum = !!can_checksum_protocol(features, proto);
|
csum = !!can_checksum_protocol(features, proto);
|
||||||
|
|
||||||
/* GSO partial only requires that we trim off any excess that
|
/* GSO partial only requires that we trim off any excess that
|
||||||
* doesn't fit into an MSS sized block, so take care of that
|
* doesn't fit into an MSS sized block, so take care of that
|
||||||
* now.
|
* now.
|
||||||
*/
|
*/
|
||||||
if (features & NETIF_F_GSO_PARTIAL) {
|
if (sg && csum && (features & NETIF_F_GSO_PARTIAL)) {
|
||||||
partial_segs = len / mss;
|
partial_segs = len / mss;
|
||||||
if (partial_segs > 1)
|
if (partial_segs > 1)
|
||||||
mss *= partial_segs;
|
mss *= partial_segs;
|
||||||
|
|
Loading…
Reference in New Issue