|
@@ -138,7 +138,7 @@ static int rt_chain_length_max __read_mostly = 20;
|
|
|
|
|
|
static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie);
|
|
|
static unsigned int ipv4_default_advmss(const struct dst_entry *dst);
|
|
|
-static unsigned int ipv4_default_mtu(const struct dst_entry *dst);
|
|
|
+static unsigned int ipv4_mtu(const struct dst_entry *dst);
|
|
|
static void ipv4_dst_destroy(struct dst_entry *dst);
|
|
|
static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst);
|
|
|
static void ipv4_link_failure(struct sk_buff *skb);
|
|
@@ -193,7 +193,7 @@ static struct dst_ops ipv4_dst_ops = {
|
|
|
.gc = rt_garbage_collect,
|
|
|
.check = ipv4_dst_check,
|
|
|
.default_advmss = ipv4_default_advmss,
|
|
|
- .default_mtu = ipv4_default_mtu,
|
|
|
+ .mtu = ipv4_mtu,
|
|
|
.cow_metrics = ipv4_cow_metrics,
|
|
|
.destroy = ipv4_dst_destroy,
|
|
|
.ifdown = ipv4_dst_ifdown,
|
|
@@ -1814,12 +1814,17 @@ static unsigned int ipv4_default_advmss(const struct dst_entry *dst)
|
|
|
return advmss;
|
|
|
}
|
|
|
|
|
|
-static unsigned int ipv4_default_mtu(const struct dst_entry *dst)
|
|
|
+static unsigned int ipv4_mtu(const struct dst_entry *dst)
|
|
|
{
|
|
|
- unsigned int mtu = dst->dev->mtu;
|
|
|
+ const struct rtable *rt = (const struct rtable *) dst;
|
|
|
+ unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
|
|
|
+
|
|
|
+ if (mtu && rt_is_output_route(rt))
|
|
|
+ return mtu;
|
|
|
+
|
|
|
+ mtu = dst->dev->mtu;
|
|
|
|
|
|
if (unlikely(dst_metric_locked(dst, RTAX_MTU))) {
|
|
|
- const struct rtable *rt = (const struct rtable *) dst;
|
|
|
|
|
|
if (rt->rt_gateway != rt->rt_dst && mtu > 576)
|
|
|
mtu = 576;
|
|
@@ -2755,9 +2760,11 @@ static struct dst_entry *ipv4_blackhole_dst_check(struct dst_entry *dst, u32 coo
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static unsigned int ipv4_blackhole_default_mtu(const struct dst_entry *dst)
|
|
|
+static unsigned int ipv4_blackhole_mtu(const struct dst_entry *dst)
|
|
|
{
|
|
|
- return 0;
|
|
|
+ unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
|
|
|
+
|
|
|
+ return mtu ? : dst->dev->mtu;
|
|
|
}
|
|
|
|
|
|
static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
|
|
@@ -2775,7 +2782,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
|
|
|
.protocol = cpu_to_be16(ETH_P_IP),
|
|
|
.destroy = ipv4_dst_destroy,
|
|
|
.check = ipv4_blackhole_dst_check,
|
|
|
- .default_mtu = ipv4_blackhole_default_mtu,
|
|
|
+ .mtu = ipv4_blackhole_mtu,
|
|
|
.default_advmss = ipv4_default_advmss,
|
|
|
.update_pmtu = ipv4_rt_blackhole_update_pmtu,
|
|
|
.cow_metrics = ipv4_rt_blackhole_cow_metrics,
|