diff options
| -rw-r--r-- | include/net/ipip.h | 16 | ||||
| -rw-r--r-- | net/ipv4/af_inet.c | 3 |
2 files changed, 7 insertions, 12 deletions
diff --git a/include/net/ipip.h b/include/net/ipip.h index fd19625ff99d..982141c15200 100644 --- a/include/net/ipip.h +++ b/include/net/ipip.h | |||
| @@ -77,15 +77,11 @@ static inline void tunnel_ip_select_ident(struct sk_buff *skb, | |||
| 77 | { | 77 | { |
| 78 | struct iphdr *iph = ip_hdr(skb); | 78 | struct iphdr *iph = ip_hdr(skb); |
| 79 | 79 | ||
| 80 | if (iph->frag_off & htons(IP_DF)) | 80 | /* Use inner packet iph-id if possible. */ |
| 81 | iph->id = 0; | 81 | if (skb->protocol == htons(ETH_P_IP) && old_iph->id) |
| 82 | else { | 82 | iph->id = old_iph->id; |
| 83 | /* Use inner packet iph-id if possible. */ | 83 | else |
| 84 | if (skb->protocol == htons(ETH_P_IP) && old_iph->id) | 84 | __ip_select_ident(iph, dst, |
| 85 | iph->id = old_iph->id; | 85 | (skb_shinfo(skb)->gso_segs ?: 1) - 1); |
| 86 | else | ||
| 87 | __ip_select_ident(iph, dst, | ||
| 88 | (skb_shinfo(skb)->gso_segs ?: 1) - 1); | ||
| 89 | } | ||
| 90 | } | 86 | } |
| 91 | #endif | 87 | #endif |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 68f6a94f7661..c929d9c1c4b6 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
| @@ -1333,8 +1333,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, | |||
| 1333 | iph->frag_off |= htons(IP_MF); | 1333 | iph->frag_off |= htons(IP_MF); |
| 1334 | offset += (skb->len - skb->mac_len - iph->ihl * 4); | 1334 | offset += (skb->len - skb->mac_len - iph->ihl * 4); |
| 1335 | } else { | 1335 | } else { |
| 1336 | if (!(iph->frag_off & htons(IP_DF))) | 1336 | iph->id = htons(id++); |
| 1337 | iph->id = htons(id++); | ||
| 1338 | } | 1337 | } |
| 1339 | iph->tot_len = htons(skb->len - skb->mac_len); | 1338 | iph->tot_len = htons(skb->len - skb->mac_len); |
| 1340 | iph->check = 0; | 1339 | iph->check = 0; |
