diff options
author | David S. Miller <davem@davemloft.net> | 2010-12-13 15:52:14 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-12-13 15:52:14 -0500 |
commit | 0dbaee3b37e118a96bb7b8eb0d9bbaeeb46264be (patch) | |
tree | 37000c5d7e663e4ae9800a7bcde9934984b8bae9 /include | |
parent | cc6f02dd490dac4ad821d5077b934c9b37037cd0 (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 'include')
-rw-r--r-- | include/net/dst.h | 14 | ||||
-rw-r--r-- | include/net/dst_ops.h | 1 |
2 files changed, 14 insertions, 1 deletions
diff --git a/include/net/dst.h b/include/net/dst.h index 755ac6c1aa03..03a1c3d52d80 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
@@ -112,10 +112,22 @@ dst_metric_raw(const struct dst_entry *dst, const int metric) | |||
112 | static inline u32 | 112 | static inline u32 |
113 | dst_metric(const struct dst_entry *dst, const int metric) | 113 | dst_metric(const struct dst_entry *dst, const int metric) |
114 | { | 114 | { |
115 | WARN_ON_ONCE(metric == RTAX_HOPLIMIT); | 115 | WARN_ON_ONCE(metric == RTAX_HOPLIMIT || |
116 | metric == RTAX_ADVMSS); | ||
116 | return dst_metric_raw(dst, metric); | 117 | return dst_metric_raw(dst, metric); |
117 | } | 118 | } |
118 | 119 | ||
120 | static inline u32 | ||
121 | dst_metric_advmss(const struct dst_entry *dst) | ||
122 | { | ||
123 | u32 advmss = dst_metric_raw(dst, RTAX_ADVMSS); | ||
124 | |||
125 | if (!advmss) | ||
126 | advmss = dst->ops->default_advmss(dst); | ||
127 | |||
128 | return advmss; | ||
129 | } | ||
130 | |||
119 | static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val) | 131 | static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val) |
120 | { | 132 | { |
121 | dst->_metrics[metric-1] = val; | 133 | dst->_metrics[metric-1] = val; |
diff --git a/include/net/dst_ops.h b/include/net/dst_ops.h index 51665b3461b8..15fb7af08c42 100644 --- a/include/net/dst_ops.h +++ b/include/net/dst_ops.h | |||
@@ -16,6 +16,7 @@ struct dst_ops { | |||
16 | 16 | ||
17 | int (*gc)(struct dst_ops *ops); | 17 | int (*gc)(struct dst_ops *ops); |
18 | struct dst_entry * (*check)(struct dst_entry *, __u32 cookie); | 18 | struct dst_entry * (*check)(struct dst_entry *, __u32 cookie); |
19 | unsigned int (*default_advmss)(const struct dst_entry *); | ||
19 | void (*destroy)(struct dst_entry *); | 20 | void (*destroy)(struct dst_entry *); |
20 | void (*ifdown)(struct dst_entry *, | 21 | void (*ifdown)(struct dst_entry *, |
21 | struct net_device *dev, int how); | 22 | struct net_device *dev, int how); |