aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/route.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r--net/ipv4/route.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 0c74da8a0473..fb47c8f0cd86 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -138,7 +138,7 @@ static int rt_chain_length_max __read_mostly = 20;
138 138
139static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie); 139static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie);
140static unsigned int ipv4_default_advmss(const struct dst_entry *dst); 140static unsigned int ipv4_default_advmss(const struct dst_entry *dst);
141static unsigned int ipv4_default_mtu(const struct dst_entry *dst); 141static unsigned int ipv4_mtu(const struct dst_entry *dst);
142static void ipv4_dst_destroy(struct dst_entry *dst); 142static void ipv4_dst_destroy(struct dst_entry *dst);
143static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst); 143static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst);
144static void ipv4_link_failure(struct sk_buff *skb); 144static void ipv4_link_failure(struct sk_buff *skb);
@@ -193,7 +193,7 @@ static struct dst_ops ipv4_dst_ops = {
193 .gc = rt_garbage_collect, 193 .gc = rt_garbage_collect,
194 .check = ipv4_dst_check, 194 .check = ipv4_dst_check,
195 .default_advmss = ipv4_default_advmss, 195 .default_advmss = ipv4_default_advmss,
196 .default_mtu = ipv4_default_mtu, 196 .mtu = ipv4_mtu,
197 .cow_metrics = ipv4_cow_metrics, 197 .cow_metrics = ipv4_cow_metrics,
198 .destroy = ipv4_dst_destroy, 198 .destroy = ipv4_dst_destroy,
199 .ifdown = ipv4_dst_ifdown, 199 .ifdown = ipv4_dst_ifdown,
@@ -1814,12 +1814,17 @@ static unsigned int ipv4_default_advmss(const struct dst_entry *dst)
1814 return advmss; 1814 return advmss;
1815} 1815}
1816 1816
1817static unsigned int ipv4_default_mtu(const struct dst_entry *dst) 1817static unsigned int ipv4_mtu(const struct dst_entry *dst)
1818{ 1818{
1819 unsigned int mtu = dst->dev->mtu; 1819 const struct rtable *rt = (const struct rtable *) dst;
1820 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
1821
1822 if (mtu && rt_is_output_route(rt))
1823 return mtu;
1824
1825 mtu = dst->dev->mtu;
1820 1826
1821 if (unlikely(dst_metric_locked(dst, RTAX_MTU))) { 1827 if (unlikely(dst_metric_locked(dst, RTAX_MTU))) {
1822 const struct rtable *rt = (const struct rtable *) dst;
1823 1828
1824 if (rt->rt_gateway != rt->rt_dst && mtu > 576) 1829 if (rt->rt_gateway != rt->rt_dst && mtu > 576)
1825 mtu = 576; 1830 mtu = 576;
@@ -2755,9 +2760,11 @@ static struct dst_entry *ipv4_blackhole_dst_check(struct dst_entry *dst, u32 coo
2755 return NULL; 2760 return NULL;
2756} 2761}
2757 2762
2758static unsigned int ipv4_blackhole_default_mtu(const struct dst_entry *dst) 2763static unsigned int ipv4_blackhole_mtu(const struct dst_entry *dst)
2759{ 2764{
2760 return 0; 2765 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
2766
2767 return mtu ? : dst->dev->mtu;
2761} 2768}
2762 2769
2763static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) 2770static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
@@ -2775,7 +2782,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
2775 .protocol = cpu_to_be16(ETH_P_IP), 2782 .protocol = cpu_to_be16(ETH_P_IP),
2776 .destroy = ipv4_dst_destroy, 2783 .destroy = ipv4_dst_destroy,
2777 .check = ipv4_blackhole_dst_check, 2784 .check = ipv4_blackhole_dst_check,
2778 .default_mtu = ipv4_blackhole_default_mtu, 2785 .mtu = ipv4_blackhole_mtu,
2779 .default_advmss = ipv4_default_advmss, 2786 .default_advmss = ipv4_default_advmss,
2780 .update_pmtu = ipv4_rt_blackhole_update_pmtu, 2787 .update_pmtu = ipv4_rt_blackhole_update_pmtu,
2781 .cow_metrics = ipv4_rt_blackhole_cow_metrics, 2788 .cow_metrics = ipv4_rt_blackhole_cow_metrics,