diff options
Diffstat (limited to 'net/ipv4/ip_gre.c')
-rw-r--r-- | net/ipv4/ip_gre.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 5ef4da780ac1..d0ef0e674ec5 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -735,7 +735,7 @@ drop: | |||
735 | return 0; | 735 | return 0; |
736 | } | 736 | } |
737 | 737 | ||
738 | static struct sk_buff *handle_offloads(struct sk_buff *skb) | 738 | static struct sk_buff *handle_offloads(struct ip_tunnel *tunnel, struct sk_buff *skb) |
739 | { | 739 | { |
740 | int err; | 740 | int err; |
741 | 741 | ||
@@ -745,8 +745,12 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb) | |||
745 | goto error; | 745 | goto error; |
746 | skb_shinfo(skb)->gso_type |= SKB_GSO_GRE; | 746 | skb_shinfo(skb)->gso_type |= SKB_GSO_GRE; |
747 | return skb; | 747 | return skb; |
748 | } | 748 | } else if (skb->ip_summed == CHECKSUM_PARTIAL && |
749 | if (skb->ip_summed != CHECKSUM_PARTIAL) | 749 | tunnel->parms.o_flags&GRE_CSUM) { |
750 | err = skb_checksum_help(skb); | ||
751 | if (unlikely(err)) | ||
752 | goto error; | ||
753 | } else if (skb->ip_summed != CHECKSUM_PARTIAL) | ||
750 | skb->ip_summed = CHECKSUM_NONE; | 754 | skb->ip_summed = CHECKSUM_NONE; |
751 | 755 | ||
752 | return skb; | 756 | return skb; |
@@ -776,7 +780,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
776 | int err; | 780 | int err; |
777 | int pkt_len; | 781 | int pkt_len; |
778 | 782 | ||
779 | skb = handle_offloads(skb); | 783 | skb = handle_offloads(tunnel, skb); |
780 | if (IS_ERR(skb)) { | 784 | if (IS_ERR(skb)) { |
781 | dev->stats.tx_dropped++; | 785 | dev->stats.tx_dropped++; |
782 | return NETDEV_TX_OK; | 786 | return NETDEV_TX_OK; |
@@ -970,7 +974,8 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
970 | iph->daddr = fl4.daddr; | 974 | iph->daddr = fl4.daddr; |
971 | iph->saddr = fl4.saddr; | 975 | iph->saddr = fl4.saddr; |
972 | iph->ttl = ttl; | 976 | iph->ttl = ttl; |
973 | iph->id = 0; | 977 | |
978 | tunnel_ip_select_ident(skb, old_iph, &rt->dst); | ||
974 | 979 | ||
975 | if (ttl == 0) { | 980 | if (ttl == 0) { |
976 | if (skb->protocol == htons(ETH_P_IP)) | 981 | if (skb->protocol == htons(ETH_P_IP)) |
@@ -1101,14 +1106,8 @@ static int ipgre_tunnel_bind_dev(struct net_device *dev) | |||
1101 | tunnel->hlen = addend; | 1106 | tunnel->hlen = addend; |
1102 | /* TCP offload with GRE SEQ is not supported. */ | 1107 | /* TCP offload with GRE SEQ is not supported. */ |
1103 | if (!(tunnel->parms.o_flags & GRE_SEQ)) { | 1108 | if (!(tunnel->parms.o_flags & GRE_SEQ)) { |
1104 | /* device supports enc gso offload*/ | 1109 | dev->features |= NETIF_F_GSO_SOFTWARE; |
1105 | if (tdev->hw_enc_features & NETIF_F_GRE_GSO) { | 1110 | dev->hw_features |= NETIF_F_GSO_SOFTWARE; |
1106 | dev->features |= NETIF_F_TSO; | ||
1107 | dev->hw_features |= NETIF_F_TSO; | ||
1108 | } else { | ||
1109 | dev->features |= NETIF_F_GSO_SOFTWARE; | ||
1110 | dev->hw_features |= NETIF_F_GSO_SOFTWARE; | ||
1111 | } | ||
1112 | } | 1111 | } |
1113 | 1112 | ||
1114 | return mtu; | 1113 | return mtu; |