aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/ipv6/ip6_output.c14
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