aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/ip6_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/ip6_output.c')
-rw-r--r--net/ipv6/ip6_output.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 070a2fae2375..64d6073731d3 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -530,9 +530,6 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from)
530 to->tc_index = from->tc_index; 530 to->tc_index = from->tc_index;
531#endif 531#endif
532 nf_copy(to, from); 532 nf_copy(to, from);
533#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE)
534 to->nf_trace = from->nf_trace;
535#endif
536 skb_copy_secmark(to, from); 533 skb_copy_secmark(to, from);
537} 534}
538 535
@@ -1104,21 +1101,19 @@ static void ip6_append_data_mtu(unsigned int *mtu,
1104 unsigned int fragheaderlen, 1101 unsigned int fragheaderlen,
1105 struct sk_buff *skb, 1102 struct sk_buff *skb,
1106 struct rt6_info *rt, 1103 struct rt6_info *rt,
1107 bool pmtuprobe) 1104 unsigned int orig_mtu)
1108{ 1105{
1109 if (!(rt->dst.flags & DST_XFRM_TUNNEL)) { 1106 if (!(rt->dst.flags & DST_XFRM_TUNNEL)) {
1110 if (skb == NULL) { 1107 if (skb == NULL) {
1111 /* first fragment, reserve header_len */ 1108 /* first fragment, reserve header_len */
1112 *mtu = *mtu - rt->dst.header_len; 1109 *mtu = orig_mtu - rt->dst.header_len;
1113 1110
1114 } else { 1111 } else {
1115 /* 1112 /*
1116 * this fragment is not first, the headers 1113 * this fragment is not first, the headers
1117 * space is regarded as data space. 1114 * space is regarded as data space.
1118 */ 1115 */
1119 *mtu = min(*mtu, pmtuprobe ? 1116 *mtu = orig_mtu;
1120 rt->dst.dev->mtu :
1121 dst_mtu(rt->dst.path));
1122 } 1117 }
1123 *maxfraglen = ((*mtu - fragheaderlen) & ~7) 1118 *maxfraglen = ((*mtu - fragheaderlen) & ~7)
1124 + fragheaderlen - sizeof(struct frag_hdr); 1119 + fragheaderlen - sizeof(struct frag_hdr);
@@ -1135,7 +1130,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
1135 struct ipv6_pinfo *np = inet6_sk(sk); 1130 struct ipv6_pinfo *np = inet6_sk(sk);
1136 struct inet_cork *cork; 1131 struct inet_cork *cork;
1137 struct sk_buff *skb, *skb_prev = NULL; 1132 struct sk_buff *skb, *skb_prev = NULL;
1138 unsigned int maxfraglen, fragheaderlen, mtu; 1133 unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu;
1139 int exthdrlen; 1134 int exthdrlen;
1140 int dst_exthdrlen; 1135 int dst_exthdrlen;
1141 int hh_len; 1136 int hh_len;
@@ -1217,6 +1212,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
1217 dst_exthdrlen = 0; 1212 dst_exthdrlen = 0;
1218 mtu = cork->fragsize; 1213 mtu = cork->fragsize;
1219 } 1214 }
1215 orig_mtu = mtu;
1220 1216
1221 hh_len = LL_RESERVED_SPACE(rt->dst.dev); 1217 hh_len = LL_RESERVED_SPACE(rt->dst.dev);
1222 1218
@@ -1314,8 +1310,7 @@ alloc_new_skb:
1314 if (skb == NULL || skb_prev == NULL) 1310 if (skb == NULL || skb_prev == NULL)
1315 ip6_append_data_mtu(&mtu, &maxfraglen, 1311 ip6_append_data_mtu(&mtu, &maxfraglen,
1316 fragheaderlen, skb, rt, 1312 fragheaderlen, skb, rt,
1317 np->pmtudisc >= 1313 orig_mtu);
1318 IPV6_PMTUDISC_PROBE);
1319 1314
1320 skb_prev = skb; 1315 skb_prev = skb;
1321 1316