diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2011-06-14 02:15:49 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2011-06-14 02:15:49 -0400 |
| commit | 9aa7719e0c6a1580451900e672744752804f8f75 (patch) | |
| tree | ba36c5536342db2759d0a1843dffd0c193e26ff0 /net/ipv4 | |
| parent | 583af252ab07cd1e8721878463da5b7016c18fdc (diff) | |
| parent | 2c53b436a30867eb6b47dd7bab23ba638d1fb0d2 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into sh-fixes-for-linus
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/ip_output.c | 6 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_queue.c | 3 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_CLUSTERIP.c | 6 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_MASQUERADE.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_nat_core.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_nat_helper.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_nat_rule.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_nat_standalone.c | 4 | ||||
| -rw-r--r-- | net/ipv4/route.c | 78 |
11 files changed, 60 insertions, 49 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 98af3697c718..a8024eaa0e87 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -799,7 +799,9 @@ static int __ip_append_data(struct sock *sk, | |||
| 799 | int csummode = CHECKSUM_NONE; | 799 | int csummode = CHECKSUM_NONE; |
| 800 | struct rtable *rt = (struct rtable *)cork->dst; | 800 | struct rtable *rt = (struct rtable *)cork->dst; |
| 801 | 801 | ||
| 802 | exthdrlen = transhdrlen ? rt->dst.header_len : 0; | 802 | skb = skb_peek_tail(queue); |
| 803 | |||
| 804 | exthdrlen = !skb ? rt->dst.header_len : 0; | ||
| 803 | length += exthdrlen; | 805 | length += exthdrlen; |
| 804 | transhdrlen += exthdrlen; | 806 | transhdrlen += exthdrlen; |
| 805 | mtu = cork->fragsize; | 807 | mtu = cork->fragsize; |
| @@ -825,8 +827,6 @@ static int __ip_append_data(struct sock *sk, | |||
| 825 | !exthdrlen) | 827 | !exthdrlen) |
| 826 | csummode = CHECKSUM_PARTIAL; | 828 | csummode = CHECKSUM_PARTIAL; |
| 827 | 829 | ||
| 828 | skb = skb_peek_tail(queue); | ||
| 829 | |||
| 830 | cork->length += length; | 830 | cork->length += length; |
| 831 | if (((length > mtu) || (skb && skb_is_gso(skb))) && | 831 | if (((length > mtu) || (skb && skb_is_gso(skb))) && |
| 832 | (sk->sk_protocol == IPPROTO_UDP) && | 832 | (sk->sk_protocol == IPPROTO_UDP) && |
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index d2c1311cb28d..f7f9bd7ba12d 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
| @@ -402,7 +402,8 @@ ipq_dev_drop(int ifindex) | |||
| 402 | static inline void | 402 | static inline void |
| 403 | __ipq_rcv_skb(struct sk_buff *skb) | 403 | __ipq_rcv_skb(struct sk_buff *skb) |
| 404 | { | 404 | { |
| 405 | int status, type, pid, flags, nlmsglen, skblen; | 405 | int status, type, pid, flags; |
| 406 | unsigned int nlmsglen, skblen; | ||
| 406 | struct nlmsghdr *nlh; | 407 | struct nlmsghdr *nlh; |
| 407 | 408 | ||
| 408 | skblen = skb->len; | 409 | skblen = skb->len; |
diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c index d609ac3cb9a4..5c9e97c79017 100644 --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c | |||
| @@ -307,7 +307,7 @@ clusterip_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 307 | * error messages (RELATED) and information requests (see below) */ | 307 | * error messages (RELATED) and information requests (see below) */ |
| 308 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP && | 308 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP && |
| 309 | (ctinfo == IP_CT_RELATED || | 309 | (ctinfo == IP_CT_RELATED || |
| 310 | ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY)) | 310 | ctinfo == IP_CT_RELATED_REPLY)) |
| 311 | return XT_CONTINUE; | 311 | return XT_CONTINUE; |
| 312 | 312 | ||
| 313 | /* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO, | 313 | /* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO, |
| @@ -321,12 +321,12 @@ clusterip_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 321 | ct->mark = hash; | 321 | ct->mark = hash; |
| 322 | break; | 322 | break; |
| 323 | case IP_CT_RELATED: | 323 | case IP_CT_RELATED: |
| 324 | case IP_CT_RELATED+IP_CT_IS_REPLY: | 324 | case IP_CT_RELATED_REPLY: |
| 325 | /* FIXME: we don't handle expectations at the | 325 | /* FIXME: we don't handle expectations at the |
| 326 | * moment. they can arrive on a different node than | 326 | * moment. they can arrive on a different node than |
| 327 | * the master connection (e.g. FTP passive mode) */ | 327 | * the master connection (e.g. FTP passive mode) */ |
| 328 | case IP_CT_ESTABLISHED: | 328 | case IP_CT_ESTABLISHED: |
| 329 | case IP_CT_ESTABLISHED+IP_CT_IS_REPLY: | 329 | case IP_CT_ESTABLISHED_REPLY: |
| 330 | break; | 330 | break; |
| 331 | default: | 331 | default: |
| 332 | break; | 332 | break; |
diff --git a/net/ipv4/netfilter/ipt_MASQUERADE.c b/net/ipv4/netfilter/ipt_MASQUERADE.c index d2ed9dc74ebc..9931152a78b5 100644 --- a/net/ipv4/netfilter/ipt_MASQUERADE.c +++ b/net/ipv4/netfilter/ipt_MASQUERADE.c | |||
| @@ -60,7 +60,7 @@ masquerade_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 60 | nat = nfct_nat(ct); | 60 | nat = nfct_nat(ct); |
| 61 | 61 | ||
| 62 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED || | 62 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED || |
| 63 | ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY)); | 63 | ctinfo == IP_CT_RELATED_REPLY)); |
| 64 | 64 | ||
| 65 | /* Source address is 0.0.0.0 - locally generated packet that is | 65 | /* Source address is 0.0.0.0 - locally generated packet that is |
| 66 | * probably not supposed to be masqueraded. | 66 | * probably not supposed to be masqueraded. |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index 5a03c02af999..db10075dd88e 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
| @@ -101,7 +101,7 @@ static unsigned int ipv4_confirm(unsigned int hooknum, | |||
| 101 | 101 | ||
| 102 | /* This is where we call the helper: as the packet goes out. */ | 102 | /* This is where we call the helper: as the packet goes out. */ |
| 103 | ct = nf_ct_get(skb, &ctinfo); | 103 | ct = nf_ct_get(skb, &ctinfo); |
| 104 | if (!ct || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY) | 104 | if (!ct || ctinfo == IP_CT_RELATED_REPLY) |
| 105 | goto out; | 105 | goto out; |
| 106 | 106 | ||
| 107 | help = nfct_help(ct); | 107 | help = nfct_help(ct); |
diff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c index 7404bde95994..ab5b27a2916f 100644 --- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c +++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c | |||
| @@ -160,7 +160,7 @@ icmp_error_message(struct net *net, struct nf_conn *tmpl, struct sk_buff *skb, | |||
| 160 | /* Update skb to refer to this connection */ | 160 | /* Update skb to refer to this connection */ |
| 161 | skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general; | 161 | skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general; |
| 162 | skb->nfctinfo = *ctinfo; | 162 | skb->nfctinfo = *ctinfo; |
| 163 | return -NF_ACCEPT; | 163 | return NF_ACCEPT; |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | /* Small and modified version of icmp_rcv */ | 166 | /* Small and modified version of icmp_rcv */ |
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c index 9c71b2755ce3..3346de5d94d0 100644 --- a/net/ipv4/netfilter/nf_nat_core.c +++ b/net/ipv4/netfilter/nf_nat_core.c | |||
| @@ -433,7 +433,7 @@ int nf_nat_icmp_reply_translation(struct nf_conn *ct, | |||
| 433 | 433 | ||
| 434 | /* Must be RELATED */ | 434 | /* Must be RELATED */ |
| 435 | NF_CT_ASSERT(skb->nfctinfo == IP_CT_RELATED || | 435 | NF_CT_ASSERT(skb->nfctinfo == IP_CT_RELATED || |
| 436 | skb->nfctinfo == IP_CT_RELATED+IP_CT_IS_REPLY); | 436 | skb->nfctinfo == IP_CT_RELATED_REPLY); |
| 437 | 437 | ||
| 438 | /* Redirects on non-null nats must be dropped, else they'll | 438 | /* Redirects on non-null nats must be dropped, else they'll |
| 439 | start talking to each other without our translation, and be | 439 | start talking to each other without our translation, and be |
diff --git a/net/ipv4/netfilter/nf_nat_helper.c b/net/ipv4/netfilter/nf_nat_helper.c index 99cfa28b6d38..ebc5f8894f99 100644 --- a/net/ipv4/netfilter/nf_nat_helper.c +++ b/net/ipv4/netfilter/nf_nat_helper.c | |||
| @@ -160,7 +160,7 @@ static void nf_nat_csum(struct sk_buff *skb, const struct iphdr *iph, void *data | |||
| 160 | 160 | ||
| 161 | if (skb->ip_summed != CHECKSUM_PARTIAL) { | 161 | if (skb->ip_summed != CHECKSUM_PARTIAL) { |
| 162 | if (!(rt->rt_flags & RTCF_LOCAL) && | 162 | if (!(rt->rt_flags & RTCF_LOCAL) && |
| 163 | skb->dev->features & NETIF_F_V4_CSUM) { | 163 | (!skb->dev || skb->dev->features & NETIF_F_V4_CSUM)) { |
| 164 | skb->ip_summed = CHECKSUM_PARTIAL; | 164 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 165 | skb->csum_start = skb_headroom(skb) + | 165 | skb->csum_start = skb_headroom(skb) + |
| 166 | skb_network_offset(skb) + | 166 | skb_network_offset(skb) + |
diff --git a/net/ipv4/netfilter/nf_nat_rule.c b/net/ipv4/netfilter/nf_nat_rule.c index 21c30426480b..733c9abc1cbd 100644 --- a/net/ipv4/netfilter/nf_nat_rule.c +++ b/net/ipv4/netfilter/nf_nat_rule.c | |||
| @@ -53,7 +53,7 @@ ipt_snat_target(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 53 | 53 | ||
| 54 | /* Connection must be valid and new. */ | 54 | /* Connection must be valid and new. */ |
| 55 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED || | 55 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED || |
| 56 | ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY)); | 56 | ctinfo == IP_CT_RELATED_REPLY)); |
| 57 | NF_CT_ASSERT(par->out != NULL); | 57 | NF_CT_ASSERT(par->out != NULL); |
| 58 | 58 | ||
| 59 | return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_SRC); | 59 | return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_SRC); |
diff --git a/net/ipv4/netfilter/nf_nat_standalone.c b/net/ipv4/netfilter/nf_nat_standalone.c index 7317bdf1d457..483b76d042da 100644 --- a/net/ipv4/netfilter/nf_nat_standalone.c +++ b/net/ipv4/netfilter/nf_nat_standalone.c | |||
| @@ -116,7 +116,7 @@ nf_nat_fn(unsigned int hooknum, | |||
| 116 | 116 | ||
| 117 | switch (ctinfo) { | 117 | switch (ctinfo) { |
| 118 | case IP_CT_RELATED: | 118 | case IP_CT_RELATED: |
| 119 | case IP_CT_RELATED+IP_CT_IS_REPLY: | 119 | case IP_CT_RELATED_REPLY: |
| 120 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP) { | 120 | if (ip_hdr(skb)->protocol == IPPROTO_ICMP) { |
| 121 | if (!nf_nat_icmp_reply_translation(ct, ctinfo, | 121 | if (!nf_nat_icmp_reply_translation(ct, ctinfo, |
| 122 | hooknum, skb)) | 122 | hooknum, skb)) |
| @@ -144,7 +144,7 @@ nf_nat_fn(unsigned int hooknum, | |||
| 144 | default: | 144 | default: |
| 145 | /* ESTABLISHED */ | 145 | /* ESTABLISHED */ |
| 146 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || | 146 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || |
| 147 | ctinfo == (IP_CT_ESTABLISHED+IP_CT_IS_REPLY)); | 147 | ctinfo == IP_CT_ESTABLISHED_REPLY); |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | return nf_nat_packet(ct, ctinfo, hooknum, skb); | 150 | return nf_nat_packet(ct, ctinfo, hooknum, skb); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 52b0b956508b..045f0ec6a4a0 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1316,6 +1316,23 @@ reject_redirect: | |||
| 1316 | ; | 1316 | ; |
| 1317 | } | 1317 | } |
| 1318 | 1318 | ||
| 1319 | static bool peer_pmtu_expired(struct inet_peer *peer) | ||
| 1320 | { | ||
| 1321 | unsigned long orig = ACCESS_ONCE(peer->pmtu_expires); | ||
| 1322 | |||
| 1323 | return orig && | ||
| 1324 | time_after_eq(jiffies, orig) && | ||
| 1325 | cmpxchg(&peer->pmtu_expires, orig, 0) == orig; | ||
| 1326 | } | ||
| 1327 | |||
| 1328 | static bool peer_pmtu_cleaned(struct inet_peer *peer) | ||
| 1329 | { | ||
| 1330 | unsigned long orig = ACCESS_ONCE(peer->pmtu_expires); | ||
| 1331 | |||
| 1332 | return orig && | ||
| 1333 | cmpxchg(&peer->pmtu_expires, orig, 0) == orig; | ||
| 1334 | } | ||
| 1335 | |||
| 1319 | static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) | 1336 | static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) |
| 1320 | { | 1337 | { |
| 1321 | struct rtable *rt = (struct rtable *)dst; | 1338 | struct rtable *rt = (struct rtable *)dst; |
| @@ -1331,14 +1348,8 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) | |||
| 1331 | rt_genid(dev_net(dst->dev))); | 1348 | rt_genid(dev_net(dst->dev))); |
| 1332 | rt_del(hash, rt); | 1349 | rt_del(hash, rt); |
| 1333 | ret = NULL; | 1350 | ret = NULL; |
| 1334 | } else if (rt->peer && | 1351 | } else if (rt->peer && peer_pmtu_expired(rt->peer)) { |
| 1335 | rt->peer->pmtu_expires && | 1352 | dst_metric_set(dst, RTAX_MTU, rt->peer->pmtu_orig); |
| 1336 | time_after_eq(jiffies, rt->peer->pmtu_expires)) { | ||
| 1337 | unsigned long orig = rt->peer->pmtu_expires; | ||
| 1338 | |||
| 1339 | if (cmpxchg(&rt->peer->pmtu_expires, orig, 0) == orig) | ||
| 1340 | dst_metric_set(dst, RTAX_MTU, | ||
| 1341 | rt->peer->pmtu_orig); | ||
| 1342 | } | 1353 | } |
| 1343 | } | 1354 | } |
| 1344 | return ret; | 1355 | return ret; |
| @@ -1531,8 +1542,10 @@ unsigned short ip_rt_frag_needed(struct net *net, const struct iphdr *iph, | |||
| 1531 | 1542 | ||
| 1532 | static void check_peer_pmtu(struct dst_entry *dst, struct inet_peer *peer) | 1543 | static void check_peer_pmtu(struct dst_entry *dst, struct inet_peer *peer) |
| 1533 | { | 1544 | { |
| 1534 | unsigned long expires = peer->pmtu_expires; | 1545 | unsigned long expires = ACCESS_ONCE(peer->pmtu_expires); |
| 1535 | 1546 | ||
| 1547 | if (!expires) | ||
| 1548 | return; | ||
| 1536 | if (time_before(jiffies, expires)) { | 1549 | if (time_before(jiffies, expires)) { |
| 1537 | u32 orig_dst_mtu = dst_mtu(dst); | 1550 | u32 orig_dst_mtu = dst_mtu(dst); |
| 1538 | if (peer->pmtu_learned < orig_dst_mtu) { | 1551 | if (peer->pmtu_learned < orig_dst_mtu) { |
| @@ -1555,10 +1568,11 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
| 1555 | rt_bind_peer(rt, rt->rt_dst, 1); | 1568 | rt_bind_peer(rt, rt->rt_dst, 1); |
| 1556 | peer = rt->peer; | 1569 | peer = rt->peer; |
| 1557 | if (peer) { | 1570 | if (peer) { |
| 1571 | unsigned long pmtu_expires = ACCESS_ONCE(peer->pmtu_expires); | ||
| 1572 | |||
| 1558 | if (mtu < ip_rt_min_pmtu) | 1573 | if (mtu < ip_rt_min_pmtu) |
| 1559 | mtu = ip_rt_min_pmtu; | 1574 | mtu = ip_rt_min_pmtu; |
| 1560 | if (!peer->pmtu_expires || mtu < peer->pmtu_learned) { | 1575 | if (!pmtu_expires || mtu < peer->pmtu_learned) { |
| 1561 | unsigned long pmtu_expires; | ||
| 1562 | 1576 | ||
| 1563 | pmtu_expires = jiffies + ip_rt_mtu_expires; | 1577 | pmtu_expires = jiffies + ip_rt_mtu_expires; |
| 1564 | if (!pmtu_expires) | 1578 | if (!pmtu_expires) |
| @@ -1612,13 +1626,14 @@ static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) | |||
| 1612 | rt_bind_peer(rt, rt->rt_dst, 0); | 1626 | rt_bind_peer(rt, rt->rt_dst, 0); |
| 1613 | 1627 | ||
| 1614 | peer = rt->peer; | 1628 | peer = rt->peer; |
| 1615 | if (peer && peer->pmtu_expires) | 1629 | if (peer) { |
| 1616 | check_peer_pmtu(dst, peer); | 1630 | check_peer_pmtu(dst, peer); |
| 1617 | 1631 | ||
| 1618 | if (peer && peer->redirect_learned.a4 && | 1632 | if (peer->redirect_learned.a4 && |
| 1619 | peer->redirect_learned.a4 != rt->rt_gateway) { | 1633 | peer->redirect_learned.a4 != rt->rt_gateway) { |
| 1620 | if (check_peer_redir(dst, peer)) | 1634 | if (check_peer_redir(dst, peer)) |
| 1621 | return NULL; | 1635 | return NULL; |
| 1636 | } | ||
| 1622 | } | 1637 | } |
| 1623 | 1638 | ||
| 1624 | rt->rt_peer_genid = rt_peer_genid(); | 1639 | rt->rt_peer_genid = rt_peer_genid(); |
| @@ -1649,14 +1664,8 @@ static void ipv4_link_failure(struct sk_buff *skb) | |||
| 1649 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0); | 1664 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0); |
| 1650 | 1665 | ||
| 1651 | rt = skb_rtable(skb); | 1666 | rt = skb_rtable(skb); |
| 1652 | if (rt && | 1667 | if (rt && rt->peer && peer_pmtu_cleaned(rt->peer)) |
| 1653 | rt->peer && | 1668 | dst_metric_set(&rt->dst, RTAX_MTU, rt->peer->pmtu_orig); |
| 1654 | rt->peer->pmtu_expires) { | ||
| 1655 | unsigned long orig = rt->peer->pmtu_expires; | ||
| 1656 | |||
| 1657 | if (cmpxchg(&rt->peer->pmtu_expires, orig, 0) == orig) | ||
| 1658 | dst_metric_set(&rt->dst, RTAX_MTU, rt->peer->pmtu_orig); | ||
| 1659 | } | ||
| 1660 | } | 1669 | } |
| 1661 | 1670 | ||
| 1662 | static int ip_rt_bug(struct sk_buff *skb) | 1671 | static int ip_rt_bug(struct sk_buff *skb) |
| @@ -1770,8 +1779,7 @@ static void rt_init_metrics(struct rtable *rt, const struct flowi4 *fl4, | |||
| 1770 | sizeof(u32) * RTAX_MAX); | 1779 | sizeof(u32) * RTAX_MAX); |
| 1771 | dst_init_metrics(&rt->dst, peer->metrics, false); | 1780 | dst_init_metrics(&rt->dst, peer->metrics, false); |
| 1772 | 1781 | ||
| 1773 | if (peer->pmtu_expires) | 1782 | check_peer_pmtu(&rt->dst, peer); |
| 1774 | check_peer_pmtu(&rt->dst, peer); | ||
| 1775 | if (peer->redirect_learned.a4 && | 1783 | if (peer->redirect_learned.a4 && |
| 1776 | peer->redirect_learned.a4 != rt->rt_gateway) { | 1784 | peer->redirect_learned.a4 != rt->rt_gateway) { |
| 1777 | rt->rt_gateway = peer->redirect_learned.a4; | 1785 | rt->rt_gateway = peer->redirect_learned.a4; |
| @@ -2775,7 +2783,8 @@ static int rt_fill_info(struct net *net, | |||
| 2775 | struct rtable *rt = skb_rtable(skb); | 2783 | struct rtable *rt = skb_rtable(skb); |
| 2776 | struct rtmsg *r; | 2784 | struct rtmsg *r; |
| 2777 | struct nlmsghdr *nlh; | 2785 | struct nlmsghdr *nlh; |
| 2778 | long expires; | 2786 | long expires = 0; |
| 2787 | const struct inet_peer *peer = rt->peer; | ||
| 2779 | u32 id = 0, ts = 0, tsage = 0, error; | 2788 | u32 id = 0, ts = 0, tsage = 0, error; |
| 2780 | 2789 | ||
| 2781 | nlh = nlmsg_put(skb, pid, seq, event, sizeof(*r), flags); | 2790 | nlh = nlmsg_put(skb, pid, seq, event, sizeof(*r), flags); |
| @@ -2823,15 +2832,16 @@ static int rt_fill_info(struct net *net, | |||
| 2823 | NLA_PUT_BE32(skb, RTA_MARK, rt->rt_mark); | 2832 | NLA_PUT_BE32(skb, RTA_MARK, rt->rt_mark); |
| 2824 | 2833 | ||
| 2825 | error = rt->dst.error; | 2834 | error = rt->dst.error; |
| 2826 | expires = (rt->peer && rt->peer->pmtu_expires) ? | 2835 | if (peer) { |
| 2827 | rt->peer->pmtu_expires - jiffies : 0; | ||
| 2828 | if (rt->peer) { | ||
| 2829 | inet_peer_refcheck(rt->peer); | 2836 | inet_peer_refcheck(rt->peer); |
| 2830 | id = atomic_read(&rt->peer->ip_id_count) & 0xffff; | 2837 | id = atomic_read(&peer->ip_id_count) & 0xffff; |
| 2831 | if (rt->peer->tcp_ts_stamp) { | 2838 | if (peer->tcp_ts_stamp) { |
| 2832 | ts = rt->peer->tcp_ts; | 2839 | ts = peer->tcp_ts; |
| 2833 | tsage = get_seconds() - rt->peer->tcp_ts_stamp; | 2840 | tsage = get_seconds() - peer->tcp_ts_stamp; |
| 2834 | } | 2841 | } |
| 2842 | expires = ACCESS_ONCE(peer->pmtu_expires); | ||
| 2843 | if (expires) | ||
| 2844 | expires -= jiffies; | ||
| 2835 | } | 2845 | } |
| 2836 | 2846 | ||
| 2837 | if (rt_is_input_route(rt)) { | 2847 | if (rt_is_input_route(rt)) { |
