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>
This commit is contained in:
@@ -119,9 +119,13 @@ static __u16 tcp_advertise_mss(struct sock *sk)
|
||||
struct dst_entry *dst = __sk_dst_get(sk);
|
||||
int mss = tp->advmss;
|
||||
|
||||
if (dst && dst_metric(dst, RTAX_ADVMSS) < mss) {
|
||||
mss = dst_metric(dst, RTAX_ADVMSS);
|
||||
tp->advmss = mss;
|
||||
if (dst) {
|
||||
unsigned int metric = dst_metric_advmss(dst);
|
||||
|
||||
if (metric < mss) {
|
||||
mss = metric;
|
||||
tp->advmss = mss;
|
||||
}
|
||||
}
|
||||
|
||||
return (__u16)mss;
|
||||
@@ -2422,7 +2426,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
||||
|
||||
skb_dst_set(skb, dst_clone(dst));
|
||||
|
||||
mss = dst_metric(dst, RTAX_ADVMSS);
|
||||
mss = dst_metric_advmss(dst);
|
||||
if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < mss)
|
||||
mss = tp->rx_opt.user_mss;
|
||||
|
||||
@@ -2556,7 +2560,7 @@ static void tcp_connect_init(struct sock *sk)
|
||||
|
||||
if (!tp->window_clamp)
|
||||
tp->window_clamp = dst_metric(dst, RTAX_WINDOW);
|
||||
tp->advmss = dst_metric(dst, RTAX_ADVMSS);
|
||||
tp->advmss = dst_metric_advmss(dst);
|
||||
if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < tp->advmss)
|
||||
tp->advmss = tp->rx_opt.user_mss;
|
||||
|
||||
|
Reference in New Issue
Block a user