X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=datapath%2Fvport-gre.c;h=d4a5c5ec66fc3f4f5efb69bd0d88c67db6a1863c;hb=4e312e694f1e9e34ed0aad7d5778b73d7add270d;hp=cd0f3e8dce46c1936cd0dd8a87f19deb7b2fcadc;hpb=5953c70e61897996e8b05fadea988b3289e133de;p=openvswitch diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index cd0f3e8d..d4a5c5ec 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -557,9 +557,8 @@ send_frag_needed(struct vport *vport, const struct mutable_config *mutable, static struct sk_buff * check_headroom(struct sk_buff *skb, int headroom) { - if (skb_headroom(skb) < headroom || - (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { - struct sk_buff *nskb = skb_realloc_headroom(skb, headroom); + if (skb_headroom(skb) < headroom || skb_header_cloned(skb)) { + struct sk_buff *nskb = skb_realloc_headroom(skb, max(headroom, 64)); if (!nskb) { kfree_skb(skb); return ERR_PTR(-ENOMEM); @@ -734,7 +733,7 @@ static struct sk_buff * handle_gso(struct sk_buff *skb) { if (skb_is_gso(skb)) { - struct sk_buff *nskb = skb_gso_segment(skb, NETIF_F_SG); + struct sk_buff *nskb = skb_gso_segment(skb, 0); dev_kfree_skb(skb); return nskb; @@ -1132,7 +1131,9 @@ gre_send(struct vport *vport, struct sk_buff *skb) } forward_ip_summed(skb); - vswitch_skb_checksum_setup(skb); + + if (unlikely(vswitch_skb_checksum_setup(skb))) + goto error_free; skb = handle_gso(skb); if (unlikely(IS_ERR(skb))) {