aboutsummaryrefslogtreecommitdiffstats
path: root/net/decnet/dn_route.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-12-13 15:52:14 -0500
committerDavid S. Miller <davem@davemloft.net>2010-12-13 15:52:14 -0500
commit0dbaee3b37e118a96bb7b8eb0d9bbaeeb46264be (patch)
tree37000c5d7e663e4ae9800a7bcde9934984b8bae9 /net/decnet/dn_route.c
parentcc6f02dd490dac4ad821d5077b934c9b37037cd0 (diff)
net: Abstract default ADVMSS behind an accessor.
Make all RTAX_ADVMSS metric accesses go through a new helper function, dst_metric_advmss(). Leave the actual default metric as "zero" in the real metric slot, and compute the actual default value dynamically via a new dst_ops AF specific callback. For stacked IPSEC routes, we use the advmss of the path which preserves existing behavior. Unlike ipv4/ipv6, DecNET ties the advmss to the mtu and thus updates advmss on pmtu updates. This inconsistency in advmss handling results in more raw metric accesses than I wish we ended up with. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/decnet/dn_route.c')
-rw-r--r--net/decnet/dn_route.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
index e2e926841fe6..b8a5c0515be8 100644
--- a/net/decnet/dn_route.c
+++ b/net/decnet/dn_route.c
@@ -110,6 +110,7 @@ static unsigned long dn_rt_deadline;
110 110
111static int dn_dst_gc(struct dst_ops *ops); 111static int dn_dst_gc(struct dst_ops *ops);
112static struct dst_entry *dn_dst_check(struct dst_entry *, __u32); 112static struct dst_entry *dn_dst_check(struct dst_entry *, __u32);
113static unsigned int dn_dst_default_advmss(const struct dst_entry *dst);
113static struct dst_entry *dn_dst_negative_advice(struct dst_entry *); 114static struct dst_entry *dn_dst_negative_advice(struct dst_entry *);
114static void dn_dst_link_failure(struct sk_buff *); 115static void dn_dst_link_failure(struct sk_buff *);
115static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu); 116static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu);
@@ -129,6 +130,7 @@ static struct dst_ops dn_dst_ops = {
129 .gc_thresh = 128, 130 .gc_thresh = 128,
130 .gc = dn_dst_gc, 131 .gc = dn_dst_gc,
131 .check = dn_dst_check, 132 .check = dn_dst_check,
133 .default_advmss = dn_dst_default_advmss,
132 .negative_advice = dn_dst_negative_advice, 134 .negative_advice = dn_dst_negative_advice,
133 .link_failure = dn_dst_link_failure, 135 .link_failure = dn_dst_link_failure,
134 .update_pmtu = dn_dst_update_pmtu, 136 .update_pmtu = dn_dst_update_pmtu,
@@ -245,7 +247,8 @@ static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu)
245 } 247 }
246 if (!(dst_metric_locked(dst, RTAX_ADVMSS))) { 248 if (!(dst_metric_locked(dst, RTAX_ADVMSS))) {
247 u32 mss = mtu - DN_MAX_NSP_DATA_HEADER; 249 u32 mss = mtu - DN_MAX_NSP_DATA_HEADER;
248 if (dst_metric(dst, RTAX_ADVMSS) > mss) 250 u32 existing_mss = dst_metric_raw(dst, RTAX_ADVMSS);
251 if (!existing_mss || existing_mss > mss)
249 dst_metric_set(dst, RTAX_ADVMSS, mss); 252 dst_metric_set(dst, RTAX_ADVMSS, mss);
250 } 253 }
251 } 254 }
@@ -795,12 +798,17 @@ static int dn_rt_bug(struct sk_buff *skb)
795 return NET_RX_DROP; 798 return NET_RX_DROP;
796} 799}
797 800
801static unsigned int dn_dst_default_advmss(const struct dst_entry *dst)
802{
803 return dn_mss_from_pmtu(dst->dev, dst_mtu(dst));
804}
805
798static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) 806static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res)
799{ 807{
800 struct dn_fib_info *fi = res->fi; 808 struct dn_fib_info *fi = res->fi;
801 struct net_device *dev = rt->dst.dev; 809 struct net_device *dev = rt->dst.dev;
802 struct neighbour *n; 810 struct neighbour *n;
803 unsigned mss; 811 unsigned int metric;
804 812
805 if (fi) { 813 if (fi) {
806 if (DN_FIB_RES_GW(*res) && 814 if (DN_FIB_RES_GW(*res) &&
@@ -820,10 +828,12 @@ static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res)
820 if (dst_metric(&rt->dst, RTAX_MTU) == 0 || 828 if (dst_metric(&rt->dst, RTAX_MTU) == 0 ||
821 dst_metric(&rt->dst, RTAX_MTU) > rt->dst.dev->mtu) 829 dst_metric(&rt->dst, RTAX_MTU) > rt->dst.dev->mtu)
822 dst_metric_set(&rt->dst, RTAX_MTU, rt->dst.dev->mtu); 830 dst_metric_set(&rt->dst, RTAX_MTU, rt->dst.dev->mtu);
823 mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->dst)); 831 metric = dst_metric_raw(&rt->dst, RTAX_ADVMSS);
824 if (dst_metric(&rt->dst, RTAX_ADVMSS) == 0 || 832 if (metric) {
825 dst_metric(&rt->dst, RTAX_ADVMSS) > mss) 833 unsigned int mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->dst));
826 dst_metric_set(&rt->dst, RTAX_ADVMSS, mss); 834 if (metric > mss)
835 dst_metric_set(&rt->dst, RTAX_ADVMSS, mss);
836 }
827 return 0; 837 return 0;
828} 838}
829 839