diff options
author | Cong Wang <amwang@redhat.com> | 2013-03-22 00:31:31 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-03-22 10:23:34 -0400 |
commit | 10c0d7ed32b7c273970a20e211c08ab46fea3c26 (patch) | |
tree | 68af70bd7995292f43fe68c541d4ba776b009442 /net/ipv4/gre.c | |
parent | e287a75c6806892c0180005c462cd3be5cf93611 (diff) | |
download | linux-10c0d7ed32b7c273970a20e211c08ab46fea3c26.tar.gz linux-10c0d7ed32b7c273970a20e211c08ab46fea3c26.tar.bz2 linux-10c0d7ed32b7c273970a20e211c08ab46fea3c26.zip |
ip_gre: increase inner ip header ID during segmentation
According to the previous discussion [1] on netdev list, DaveM insists
we should increase the IP header ID for each segmented packets.
This patch fixes it.
Cc: Pravin B Shelar <pshelar@nicira.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
1. http://marc.info/?t=136384172700001&r=1&w=2
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/gre.c')
-rw-r--r-- | net/ipv4/gre.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv4/gre.c b/net/ipv4/gre.c index 7a4c710c4cdd..e20631cb4185 100644 --- a/net/ipv4/gre.c +++ b/net/ipv4/gre.c @@ -125,8 +125,9 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, netdev_features_t enc_features; int ghl = GRE_HEADER_SECTION; struct gre_base_hdr *greh; + struct iphdr *iph; int mac_len = skb->mac_len; - int tnl_hlen; + int tnl_hlen, id; bool csum; if (unlikely(skb_shinfo(skb)->gso_type & @@ -170,6 +171,8 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, skb_set_network_header(skb, skb_inner_network_offset(skb)); skb->mac_len = skb_inner_network_offset(skb); + iph = ip_hdr(skb); + id = ntohs(iph->id); /* segment inner packet. */ enc_features = skb->dev->hw_enc_features & netif_skb_features(skb); segs = skb_mac_gso_segment(skb, enc_features); @@ -179,6 +182,8 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb, skb = segs; tnl_hlen = skb_tnl_header_len(skb); do { + iph = (struct iphdr *)skb->data; + iph->id = htons(id++); __skb_push(skb, ghl); if (csum) { __be32 *pcsum; |