|
@@ -1101,21 +1101,19 @@ static void ip6_append_data_mtu(unsigned int *mtu,
|
|
|
unsigned int fragheaderlen,
|
|
|
struct sk_buff *skb,
|
|
|
struct rt6_info *rt,
|
|
|
- bool pmtuprobe)
|
|
|
+ unsigned int orig_mtu)
|
|
|
{
|
|
|
if (!(rt->dst.flags & DST_XFRM_TUNNEL)) {
|
|
|
if (skb == NULL) {
|
|
|
/* first fragment, reserve header_len */
|
|
|
- *mtu = *mtu - rt->dst.header_len;
|
|
|
+ *mtu = orig_mtu - rt->dst.header_len;
|
|
|
|
|
|
} else {
|
|
|
/*
|
|
|
* this fragment is not first, the headers
|
|
|
* space is regarded as data space.
|
|
|
*/
|
|
|
- *mtu = min(*mtu, pmtuprobe ?
|
|
|
- rt->dst.dev->mtu :
|
|
|
- dst_mtu(rt->dst.path));
|
|
|
+ *mtu = orig_mtu;
|
|
|
}
|
|
|
*maxfraglen = ((*mtu - fragheaderlen) & ~7)
|
|
|
+ fragheaderlen - sizeof(struct frag_hdr);
|
|
@@ -1132,7 +1130,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
|
struct inet_cork *cork;
|
|
|
struct sk_buff *skb, *skb_prev = NULL;
|
|
|
- unsigned int maxfraglen, fragheaderlen, mtu;
|
|
|
+ unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu;
|
|
|
int exthdrlen;
|
|
|
int dst_exthdrlen;
|
|
|
int hh_len;
|
|
@@ -1214,6 +1212,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|
|
dst_exthdrlen = 0;
|
|
|
mtu = cork->fragsize;
|
|
|
}
|
|
|
+ orig_mtu = mtu;
|
|
|
|
|
|
hh_len = LL_RESERVED_SPACE(rt->dst.dev);
|
|
|
|
|
@@ -1311,8 +1310,7 @@ alloc_new_skb:
|
|
|
if (skb == NULL || skb_prev == NULL)
|
|
|
ip6_append_data_mtu(&mtu, &maxfraglen,
|
|
|
fragheaderlen, skb, rt,
|
|
|
- np->pmtudisc >=
|
|
|
- IPV6_PMTUDISC_PROBE);
|
|
|
+ orig_mtu);
|
|
|
|
|
|
skb_prev = skb;
|
|
|
|