diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv6/ip6_output.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 98a262b759ae..390b05d488b8 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1108,21 +1108,19 @@ static void ip6_append_data_mtu(unsigned int *mtu, | |||
1108 | unsigned int fragheaderlen, | 1108 | unsigned int fragheaderlen, |
1109 | struct sk_buff *skb, | 1109 | struct sk_buff *skb, |
1110 | struct rt6_info *rt, | 1110 | struct rt6_info *rt, |
1111 | bool pmtuprobe) | 1111 | unsigned int orig_mtu) |
1112 | { | 1112 | { |
1113 | if (!(rt->dst.flags & DST_XFRM_TUNNEL)) { | 1113 | if (!(rt->dst.flags & DST_XFRM_TUNNEL)) { |
1114 | if (skb == NULL) { | 1114 | if (skb == NULL) { |
1115 | /* first fragment, reserve header_len */ | 1115 | /* first fragment, reserve header_len */ |
1116 | *mtu = *mtu - rt->dst.header_len; | 1116 | *mtu = orig_mtu - rt->dst.header_len; |
1117 | 1117 | ||
1118 | } else { | 1118 | } else { |
1119 | /* | 1119 | /* |
1120 | * this fragment is not first, the headers | 1120 | * this fragment is not first, the headers |
1121 | * space is regarded as data space. | 1121 | * space is regarded as data space. |
1122 | */ | 1122 | */ |
1123 | *mtu = min(*mtu, pmtuprobe ? | 1123 | *mtu = orig_mtu; |
1124 | rt->dst.dev->mtu : | ||
1125 | dst_mtu(rt->dst.path)); | ||
1126 | } | 1124 | } |
1127 | *maxfraglen = ((*mtu - fragheaderlen) & ~7) | 1125 | *maxfraglen = ((*mtu - fragheaderlen) & ~7) |
1128 | + fragheaderlen - sizeof(struct frag_hdr); | 1126 | + fragheaderlen - sizeof(struct frag_hdr); |
@@ -1139,7 +1137,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
1139 | struct ipv6_pinfo *np = inet6_sk(sk); | 1137 | struct ipv6_pinfo *np = inet6_sk(sk); |
1140 | struct inet_cork *cork; | 1138 | struct inet_cork *cork; |
1141 | struct sk_buff *skb, *skb_prev = NULL; | 1139 | struct sk_buff *skb, *skb_prev = NULL; |
1142 | unsigned int maxfraglen, fragheaderlen, mtu; | 1140 | unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu; |
1143 | int exthdrlen; | 1141 | int exthdrlen; |
1144 | int dst_exthdrlen; | 1142 | int dst_exthdrlen; |
1145 | int hh_len; | 1143 | int hh_len; |
@@ -1221,6 +1219,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
1221 | dst_exthdrlen = 0; | 1219 | dst_exthdrlen = 0; |
1222 | mtu = cork->fragsize; | 1220 | mtu = cork->fragsize; |
1223 | } | 1221 | } |
1222 | orig_mtu = mtu; | ||
1224 | 1223 | ||
1225 | hh_len = LL_RESERVED_SPACE(rt->dst.dev); | 1224 | hh_len = LL_RESERVED_SPACE(rt->dst.dev); |
1226 | 1225 | ||
@@ -1300,8 +1299,7 @@ alloc_new_skb: | |||
1300 | if (skb == NULL || skb_prev == NULL) | 1299 | if (skb == NULL || skb_prev == NULL) |
1301 | ip6_append_data_mtu(&mtu, &maxfraglen, | 1300 | ip6_append_data_mtu(&mtu, &maxfraglen, |
1302 | fragheaderlen, skb, rt, | 1301 | fragheaderlen, skb, rt, |
1303 | np->pmtudisc == | 1302 | orig_mtu); |
1304 | IPV6_PMTUDISC_PROBE); | ||
1305 | 1303 | ||
1306 | skb_prev = skb; | 1304 | skb_prev = skb; |
1307 | 1305 | ||