diff options
Diffstat (limited to 'net/ipv6/ip6_output.c')
-rw-r--r-- | net/ipv6/ip6_output.c | 17 |
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 | ||